Packets: Add StringParser ostream operation
[senf.git] / Socket / FileHandle.cc
index 9110b6b..bc8ea9c 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
 #define prefix_
 ///////////////////////////////cc.p////////////////////////////////////////
 
+///////////////////////////////////////////////////////////////////////////
+// senf::FileBody
+
+prefix_ void senf::FileBody::close()
+{
+    if (!valid())
+        throw SystemException(EBADF SENF_EXC_DEBUGINFO);
+    v_close();
+    fd_ = -1;
+}
+
+prefix_ void senf::FileBody::terminate()
+{
+    if (valid()) {
+        v_terminate();
+        fd_ = -1;
+    }
+}
+
+prefix_ void senf::FileBody::destroyClose()
+{
+    if (valid())
+        try {
+            close();
+        }
+        catch (...) {
+            terminate();
+        }
+}
+
 prefix_ void senf::FileBody::v_close()
 {
     if (::close(fd_) != 0)
-        throw SystemException(errno);
+        SENF_THROW_SYSTEM_EXCEPTION("");
 }
 
 prefix_ void senf::FileBody::v_terminate()
@@ -65,43 +95,46 @@ prefix_ bool senf::FileBody::blocking()
     const
 {
     int flags = ::fcntl(fd(),F_GETFL);
-    if (flags < 0) throw SystemException(errno);
+    if (flags < 0) SENF_THROW_SYSTEM_EXCEPTION("");
     return ! (flags & O_NONBLOCK);
 }
 
 prefix_ void senf::FileBody::blocking(bool status)
 {
     int flags = ::fcntl(fd(),F_GETFL);
-    if (flags < 0) throw SystemException(errno);
+    if (flags < 0) SENF_THROW_SYSTEM_EXCEPTION("");
     if (status) flags &= ~O_NONBLOCK;
     else        flags |= O_NONBLOCK;
-    if (::fcntl(fd(), F_SETFL, flags) < 0) throw SystemException(errno);
+    if (::fcntl(fd(), F_SETFL, flags) < 0) SENF_THROW_SYSTEM_EXCEPTION("");
 }
 
 /* We don't take POLLIN/POLLOUT as argument to avoid having to include
    sys/poll.h in the .cci file (and therefore indirectly into the .hh
    and then every file which uses FileHandle) */
-prefix_ bool senf::FileBody::pollCheck(int fd, bool incoming, bool block)
+prefix_ bool senf::FileBody::pollCheck(int fd, bool incoming, int timeout, bool oob)
     const
 {
     struct ::pollfd pfd;
     ::memset(&pfd,0,sizeof(pfd));
     pfd.fd = fd;
-    pfd.events = incoming?POLLIN:POLLOUT;
+    pfd.events = incoming?(oob?POLLPRI:POLLIN):POLLOUT;
     int rv = -1;
     do {
-        rv = ::poll(&pfd,1,block?-1:0);
+        rv = ::poll(&pfd,1,timeout);
         if (rv<0)
             switch (errno) {
             case EINTR:
                 break;
             default:
-                throw SystemException(errno);
+                SENF_THROW_SYSTEM_EXCEPTION("");
             }
     } while (rv<0);
     return rv>0;
 }
 
+prefix_ senf::FileBody::~FileBody()
+{}
+
 ///////////////////////////////cc.e////////////////////////////////////////
 #undef prefix_