X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FUN%2FUNProtocol.cc;h=c0bab258becb77150cc80316b0240b0092ad7438;hb=1ad3873b372da6187b1fbc645bf276287d2efb54;hp=a659e92ebaed838024a3a01a029555778cc8764f;hpb=b7cefad1cc5f15b2af6968aa27fa4bc979bda2f3;p=senf.git diff --git a/Socket/Protocols/UN/UNProtocol.cc b/Socket/Protocols/UN/UNProtocol.cc index a659e92..c0bab25 100644 --- a/Socket/Protocols/UN/UNProtocol.cc +++ b/Socket/Protocols/UN/UNProtocol.cc @@ -25,29 +25,95 @@ //#include "UNProtocol.ih" // Custom includes +#include #include +#include +#include // for SIOCINQ / SIOCOUTQ #include "../../../Utils/Exception.hh" //#include "UNProtocol.mpp" #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// +prefix_ unsigned senf::UNProtocol::available() + const +{ + int n; + if (::ioctl(fd(),SIOCINQ,&n) < 0) + throwErrno(); + return n; +} + +prefix_ bool senf::UNProtocol::eof() + const +{ + return false; +} + prefix_ void senf::UNProtocol::connect(UNSocketAddress const & address) const { - if(::connect(body().fd(), address.sockaddr_p(), sizeof(sockaddr_un)) < 0) - throw SystemException(errno); + if(::connect(fd(), address.sockaddr_p(), sizeof(sockaddr_un)) < 0) + throwErrno(); } prefix_ void senf::UNProtocol::bind(UNSocketAddress const & address) const { - if(::bind(body().fd(), address.sockaddr_p(), sizeof(sockaddr_un)) < 0) - throw SystemException(errno); + if(::bind(fd(), address.sockaddr_p(), sizeof(sockaddr_un)) < 0) + throwErrno(); + } +prefix_ void senf::UNProtocol::close() + const +{ + check_and_unlink(); + + SocketProtocol::close(); +} + +prefix_ void senf::UNProtocol::terminate() + const +{ + check_and_unlink(); + + SocketProtocol::terminate(); +} +prefix_ void senf::UNProtocol::check_and_unlink() + const +{ + typedef ClientSocketHandle::policy> UNSocketHandle; + try { + UNSocketAddress una (static_socket_cast(fh()).local()); + ::unlink(una.path().c_str()); + } + catch (SystemException & e) { + } +} + +// // struct sockaddr_un test; +// // socklen_t len; +// // memset( (char*)&test, 0xff, sizeof( test)); +// // int fd = inputSocket.fd() ; +// //// printf( "fd: %d\n", fd); +// // +// // int r = getsockname( fd, (struct sockaddr *)&test, &len); +// // if( r < 0){ +// // perror( "bla:"); +// // } +// // else{ +// // printf( "name: %d %d %s\n", r, len , test.sun_path); +// // unsigned char *p = (unsigned char*) &test;for( r=0; r< len; r++) printf( "%2.2x ", (int)(p[r])); printf ("\n"); +// // } +// struct sockaddr_un test; +// socklen_t len = sizeof( test); +// int r = ::getsockname(fd(), (struct sockaddr *)&test, &len); +// if( r == 0 && ::strlen(test.sun_path) > 0){ +// ::unlink( test.sun_path); +// } ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_