X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FUN%2FUNProtocol.cc;h=c0bab258becb77150cc80316b0240b0092ad7438;hb=1ad3873b372da6187b1fbc645bf276287d2efb54;hp=d3afe3f38d32fc3f25a9f6b94ceaf9ec9d7e27cf;hpb=0de6c83e2769c7deb2ed3c57d7b26e8cb3fcca04;p=senf.git diff --git a/Socket/Protocols/UN/UNProtocol.cc b/Socket/Protocols/UN/UNProtocol.cc index d3afe3f..c0bab25 100644 --- a/Socket/Protocols/UN/UNProtocol.cc +++ b/Socket/Protocols/UN/UNProtocol.cc @@ -1,6 +1,7 @@ -// $Id$ -// // Copyright (C) 2007 +// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) +// Kompetenzzentrum NETwork research (NET) +// David Wagner // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -24,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(address.sockaddr())) < 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(address.sockaddr())) < 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_