NEW FILE HEADER / COPYRIGHT FORMAT
[senf.git] / Socket / Protocols / UN / UNProtocol.cc
index d04192d..72fb883 100644 (file)
@@ -1,6 +1,7 @@
-// $Id$
-//
 // Copyright (C) 2007 
+// Fraunhofer Institute for Open Communication Systems (FOKUS) 
+// Kompetenzzentrum NETwork research (NET)
+//     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
 #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<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_