libt2n: (gerd) fixes, new logging concept (not working yet)
[libt2n] / src / socket_handler.cpp
index 2856adf..582cb0c 100644 (file)
@@ -38,6 +38,7 @@
 
 #include "socket_handler.hxx"
 #include "t2n_exception.hxx"
+#include "log.hxx"
 
 using namespace std;
 
@@ -51,59 +52,31 @@ void socket_handler::set_socket_options(int sock)
 
     /* fast reuse enable */
     if (setsockopt(sock,SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)) < 0)
-    {
-        string err="error setting socket option: ";
-        err+=strerror(errno);
-        log(error, err);
-        throw t2n_communication_error(err);
-    }
+        EXCEPTIONSTREAM(error,t2n_communication_error,"error setting socket option: " << strerror(errno));
 
     /* keepalive enable */
     if (setsockopt(sock,SOL_SOCKET, SO_KEEPALIVE, &i, sizeof(i)) < 0)
-    {
-        string err="error setting socket option: ";
-        err+=strerror(errno);
-        log(error, err);
-        throw t2n_communication_error(err);
-    }
+        EXCEPTIONSTREAM(error,t2n_communication_error,"error setting socket option: " << strerror(errno));
 
     /* close on exec */
     int fdflags;
     fdflags=fcntl(sock,F_GETFD, 0);
     if (fdflags < 0)
-    {
-        string err="fcntl error on socket: ";
-        err+=strerror(errno);
-        log(error, err);
-        throw t2n_communication_error(err);
-    }
+        EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
+
     fdflags |= FD_CLOEXEC;
     if (fcntl(sock,F_SETFD,fdflags) < 0)
-    {
-        string err="fcntl error on socket: ";
-        err+=strerror(errno);
-        log(error, err);
-        throw t2n_communication_error(err);
-    }
+        EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
 
     /* non-blocking mode */
     int flflags;
     flflags=fcntl(sock,F_GETFL,0);
     if (flflags < 0)
-    {
-        string err="fcntl error on socket: ";
-        err+=strerror(errno);
-        log(error, err);
-        throw t2n_communication_error(err);
-    }
+        EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
+
     flflags |= O_NONBLOCK;
     if (fcntl(sock,F_SETFL,flflags) < 0)
-    {
-        string err="fcntl error on socket: ";
-        err+=strerror(errno);
-        log(error, err);
-        throw t2n_communication_error(err);
-    }
+        EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
 }
 
 /// close the underlying socket connection. Don't call directly, use the version provided
@@ -189,11 +162,12 @@ bool socket_handler::fill_buffer(std::string& buffer)
         else if (errno == EINTR)
         {
             // interrupted, try again
+            LOGSTREAM(debug,"EINTR received on read(), trying again");
             try_again=true;
         }
         else
         {
-            log(error,string("error reading from socket : ")+strerror(errno));
+            LOGSTREAM(error,"error reading from socket : " << strerror(errno));
             // TODO: exception?
             return false;
         }
@@ -202,13 +176,17 @@ bool socket_handler::fill_buffer(std::string& buffer)
     // End-of-file
     if (nbytes == 0 && !try_again)
     {
+        LOGSTREAM(debug,"0 bytes received on read(), closing connection");
         close();
         return false;
     }
 
     // Data read -> store it
     if (nbytes > 0)
+    {
         buffer.assign(socket_buffer,nbytes);
+        LOGSTREAM(debug,nbytes << " read");
+    }
 
     // more data waiting -> recurse
     if (data_waiting(0))
@@ -237,22 +215,19 @@ void socket_handler::socket_write(const std::string& data)
                rtn == -1 && (errno == EAGAIN || errno == EINTR))
         {
             usleep (80000);
-            log(debug,"resuming write() call after EAGAIN or EINTR");
+            LOGSTREAM(debug,"resuming write() call after EAGAIN or EINTR");
         }
 
         if (rtn == -1)
         {
-            log(error,string("write() returned ")+strerror(errno));
+            LOGSTREAM(error,"write() returned " << strerror(errno));
             // TODO: exception?
             return;
         }
         else if (rtn != write_size)
         {
-            ostringstream msg;
-            msg << "write() wrote " << rtn << " bytes, should have been " 
-                << write_size << " (complete: " << data.size() << ")";
-
-            log(error,msg.str());
+            LOGSTREAM(error,"write() wrote " << rtn << " bytes, should have been " 
+                << write_size << " (complete: " << data.size() << ")");
 
             // TODO: exception?
             return;
@@ -261,6 +236,8 @@ void socket_handler::socket_write(const std::string& data)
         offset += write_size;
     }
 
+    LOGSTREAM(debug,"wrote " << data.size() << " bytes");
+
     return;
 }