BSDAddressingPolicy.cc
Go to the documentation of this file.
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00027 #include "BSDAddressingPolicy.hh"
00028
00029
00030
00031 #include <sys/socket.h>
00032 #include <sys/types.h>
00033 #include <senf/Utils/Exception.hh>
00034
00035
00036 #define prefix_
00037
00038
00039 prefix_ void senf::BSDAddressingPolicyMixinBase::do_local(FileHandle const & handle,
00040 struct sockaddr * addr,
00041 socklen_t * len)
00042 {
00043 if (::getsockname(handle.fd(),addr,len) < 0)
00044 SENF_THROW_SYSTEM_EXCEPTION("");
00045 }
00046
00047 prefix_ void senf::BSDAddressingPolicyMixinBase::do_peer(FileHandle const & handle,
00048 struct sockaddr * addr,
00049 socklen_t * len)
00050 {
00051 if (::getpeername(handle.fd(),addr,len) < 0)
00052 SENF_THROW_SYSTEM_EXCEPTION("");
00053 }
00054
00055 prefix_ void senf::BSDAddressingPolicyMixinBase::do_bind(FileHandle const & handle,
00056 struct sockaddr const * addr,
00057 socklen_t len)
00058 {
00059 if (::bind(handle.fd(),addr,len) < 0)
00060 SENF_THROW_SYSTEM_EXCEPTION("");
00061 }
00062
00063 prefix_ void senf::BSDAddressingPolicyMixinBase::do_connect(FileHandle const & handle,
00064 struct sockaddr const * addr,
00065 socklen_t len)
00066 {
00067 while(1) {
00068 if (::connect(handle.fd(),addr,len) < 0)
00069 switch (errno) {
00070 case EINPROGRESS: {
00071 handle.waitWriteable();
00072 int err = 0;
00073 socklen_t len = sizeof(err);
00074 if (::getsockopt(handle.fd(),SOL_SOCKET,SO_ERROR,&err,&len) < 0)
00075 SENF_THROW_SYSTEM_EXCEPTION("");
00076 if (err != 0)
00077 throw SystemException(err SENF_EXC_DEBUGINFO);
00078 return;
00079 }
00080 case EINTR:
00081 break;
00082 default:
00083 SENF_THROW_SYSTEM_EXCEPTION("");
00084 }
00085 else
00086 return;
00087 }
00088 }
00089
00090
00091 #undef prefix_
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103