// Copyright (C) 2007
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
// Kompetenzzentrum NETwork research (NET)
-// David Wagner <david.wagner@fokus.fraunhofer.de>
+// David Wagner <dw6@berlios.de>
//
// 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
//#include "UNProtocol.ih"
// Custom includes
+#include <fstream>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/sockios.h> // for SIOCINQ / SIOCOUTQ
const
{
int n;
- if (::ioctl(body().fd(),SIOCINQ,&n) < 0)
- throw senf::SystemException(errno);
+ if (::ioctl(fd(),SIOCINQ,&n) < 0)
+ throwErrno();
return n;
}
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<MakeSocketPolicy<UNAddressingPolicy>::policy> UNSocketHandle;
+ try {
+ UNSocketAddress una (static_socket_cast<UNSocketHandle>(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_