X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FUN%2FUNProtocol.cc;h=c0bab258becb77150cc80316b0240b0092ad7438;hb=1ad3873b372da6187b1fbc645bf276287d2efb54;hp=7f7f85fbd144925b672f5d4ba9c3d22b9e1dbaa2;hpb=01affde68cb93a334a2e6daabd2010b9a14b4553;p=senf.git diff --git a/Socket/Protocols/UN/UNProtocol.cc b/Socket/Protocols/UN/UNProtocol.cc index 7f7f85f..c0bab25 100644 --- a/Socket/Protocols/UN/UNProtocol.cc +++ b/Socket/Protocols/UN/UNProtocol.cc @@ -25,6 +25,7 @@ //#include "UNProtocol.ih" // Custom includes +#include #include #include #include // for SIOCINQ / SIOCOUTQ @@ -37,8 +38,8 @@ prefix_ unsigned senf::UNProtocol::available() const { int n; - if (::ioctl(body().fd(),SIOCINQ,&n) < 0) - throw senf::SystemException(errno); + if (::ioctl(fd(),SIOCINQ,&n) < 0) + throwErrno(); return n; } @@ -51,20 +52,68 @@ prefix_ bool senf::UNProtocol::eof() 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_