Utils: Removed ErrnoException and implemented generic Exception base-class
[senf.git] / Socket / Protocols / UN / UNProtocol.cc
index 7f7f85f..f86458c 100644 (file)
@@ -1,7 +1,9 @@
-// Copyright (C) 2007 
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum NETwork research (NET)
-//     David Wagner <david.wagner@fokus.fraunhofer.de>
+// $Id$
+//
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+//     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
@@ -25,6 +27,7 @@
 //#include "UNProtocol.ih"
 
 // Custom includes
+#include <fstream>
 #include <sys/socket.h>
 #include <sys/ioctl.h>
 #include <linux/sockios.h> // for SIOCINQ / SIOCOUTQ
@@ -37,8 +40,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)
+        throw SystemException();
     return n;
 }
 
@@ -48,24 +51,34 @@ prefix_ bool senf::UNProtocol::eof()
     return false;
 }
 
-prefix_ void senf::UNProtocol::connect(UNSocketAddress const & address) 
-    const 
+prefix_ void senf::UNProtocol::close() 
+    const
 {
-    if(::connect(body().fd(), address.sockaddr_p(), sizeof(sockaddr_un)) < 0)
-        throw SystemException(errno);
+    check_and_unlink();
+  
+    SocketProtocol::close();
 }
 
-prefix_ void senf::UNProtocol::bind(UNSocketAddress const & address) 
-    const 
+prefix_ void senf::UNProtocol::terminate() 
+    const
 {
-    if(::bind(body().fd(), address.sockaddr_p(), sizeof(sockaddr_un)) < 0)
-        throw SystemException(errno);
+    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) {
+    }
+}
+    
 ///////////////////////////////cc.e////////////////////////////////////////
 #undef prefix_
 //#include "UNProtocol.mpp"