Socket: BUGFIX: Move incorrect v-function call out of FileBody destructor
[senf.git] / Socket / SocketHandle.cc
index 4d0b8fc..aa0cf61 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$
 //
 // Copyright (C) 2006
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
-//     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+//     Stefan Bund <g0dil@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
 // Custom includes
 #include <sstream>
 #include <sys/socket.h>
-#include "Utils/TypeInfo.hh"
+#include "../Utils/TypeInfo.hh"
 
 //#include "SocketHandle.mpp"
 #define prefix_
 ///////////////////////////////cc.p////////////////////////////////////////
 
+///////////////////////////////////////////////////////////////////////////
+// senf::SocketBody
+
+prefix_ void senf::SocketBody::state(SocketStateMap & map, unsigned lod)
+{
+    map["file.handle"]     << fd();
+    map["file.refcount"]   << refcount();
+    map["socket.server"]   << isServer();
+    map["socket.protocol"] << v_protocolName();
+    map["socket.protocol.policy"]   << prettyName(typeid(protocol().policy()));
+    protocol().state(map,lod);
+}
+
 prefix_ void senf::SocketBody::v_close()
 {
-    if (::shutdown(fd(),SHUT_RDWR) < 0)
-        throw SystemException(errno);
-    if (::close(fd()) < 0)
-        throw SystemException(errno);
+    protocol().close();
 }
 
 prefix_ void senf::SocketBody::v_terminate()
 {
-    struct linger ling;
-    ling.l_onoff = 0;
-    ling.l_linger = 0;
-
-    // We purposely IGNORE any errors: this method is used to try and
-    // terminate the connection ignoring any possible problems
-
-    ::setsockopt(fd(),SOL_SOCKET,SO_LINGER,&ling,sizeof(ling));
-    ::shutdown(fd(),SHUT_RDWR);
-    ::close(fd());
+    protocol().terminate();
 }
 
 prefix_ bool senf::SocketBody::v_eof()
@@ -64,16 +65,6 @@ prefix_ bool senf::SocketBody::v_eof()
     return protocol().eof();
 }
 
-prefix_ void senf::SocketBody::state(SocketStateMap & map, unsigned lod)
-{
-    map["file.handle"] = fd();
-    map["file.refcount"] = refcount();
-    map["socket.server"] = isServer();
-    map["socket.protocol"] = prettyName(typeid(protocol()));
-    map["socket.policy"] = prettyName(typeid(protocol().policy()));
-    protocol().state(map,lod);
-}
-
 ///////////////////////////////////////////////////////////////////////////
 // senf::detail::StateMapOrdering
 
@@ -97,13 +88,6 @@ prefix_ std::string senf::detail::dumpState(SocketStateMap const & map)
     return s.str();
 }
 
-template <class Policy>
-prefix_ std::ostream & senf::operator<<(std::ostream & os, SocketHandle<Policy> handle)
-{
-    os << handle.dumpState();
-    return os;
-}
-
 ///////////////////////////////cc.e////////////////////////////////////////
 #undef prefix_
 //#include "SocketHandle.mpp"