libt2n: (gerd) bugfixes, better logging, unit tests for wrapper, ignore handler still...
[libt2n] / src / socket_client.cpp
index 4f4975f..1f5dccf 100644 (file)
@@ -37,6 +37,7 @@
 
 #include "socket_client.hxx"
 #include "t2n_exception.hxx"
+#include "log.hxx"
 
 using namespace std;
 
@@ -44,7 +45,8 @@ namespace libt2n
 {
 
 socket_client_connection::socket_client_connection(int _port, const std::string& _server, 
-            long long _connect_timeout_usec, int _max_retries)
+            long long _connect_timeout_usec, int _max_retries,
+            std::ostream *_logstream, log_level_values _log_level)
     : client_connection(), socket_handler(0,tcp_s)
 {
     max_retries=_max_retries;
@@ -53,11 +55,16 @@ socket_client_connection::socket_client_connection(int _port, const std::string&
     server=_server;
     port=_port;
 
+    set_logging(_logstream,_log_level);
+
     tcp_connect(max_retries);
+
+    do_callbacks(new_connection);
 }
 
 socket_client_connection::socket_client_connection(const std::string& _path,
-            long long _connect_timeout_usec, int _max_retries)
+            long long _connect_timeout_usec, int _max_retries,
+            std::ostream *_logstream, log_level_values _log_level)
     : client_connection(), socket_handler(0,unix_s)
 {
     max_retries=_max_retries;
@@ -65,7 +72,11 @@ socket_client_connection::socket_client_connection(const std::string& _path,
 
     path=_path;
 
+    set_logging(_logstream,_log_level);
+
     unix_connect(max_retries);
+
+    do_callbacks(new_connection);
 }
 
 void socket_client_connection::tcp_connect(int max_retries)
@@ -98,10 +109,13 @@ void socket_client_connection::tcp_connect(int max_retries)
     {
         // recurse if retries left
         if (max_retries > 0)
+        {
+            LOGSTREAM(debug,"retrying connect after connect error");
             tcp_connect(max_retries-1);
+        }
+        else
+            LOGSTREAM(debug,"no more retries left after connect error");
     }
-
-    do_callbacks(new_connection);
 }
 
 void socket_client_connection::unix_connect(int max_retries)
@@ -123,22 +137,28 @@ void socket_client_connection::unix_connect(int max_retries)
     {
         // recurse if retries left
         if (max_retries > 0)
+        {
+            LOGSTREAM(debug,"retrying connect after connect error");
             unix_connect(max_retries-1);
+        }
+        else
+            LOGSTREAM(debug,"no more retries left after connect error");
     }
-
-    do_callbacks(new_connection);
 }
 
 void socket_client_connection::connect_with_timeout(struct sockaddr *sock_addr,unsigned int sockaddr_size)
 {
     set_socket_options(sock);
 
+    LOGSTREAM(debug,"connect_with_timeout()");
     int ret=::connect(sock,sock_addr, sockaddr_size);
 
     if (ret < 0)
     {
         if (errno==EINPROGRESS)
         {
+            LOGSTREAM(debug,"connect_with_timeout(): EINPROGRESS");
+
             /* set timeout */
             struct timeval tval;
             struct timeval *timeout_ptr;
@@ -163,17 +183,28 @@ void socket_client_connection::connect_with_timeout(struct sockaddr *sock_addr,u
                     ret < 0 && errno==EINTR);
 
             if (ret < 0)
+            {
+                LOGSTREAM(debug,"connect_with_timeout(): select error: " << strerror(errno));
                 throw t2n_connect_error(string("connect() error (select): ")+strerror(errno));
+            }
 
             socklen_t sopt=sizeof(int);
             int valopt;
             ret=getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &sopt);
             if (ret < 0 || valopt)
+            {
+                LOGSTREAM(debug,"connect_with_timeout(): getsockopt error: " << strerror(errno));
                 throw t2n_connect_error(string("connect() error (getsockopt): ")+strerror(errno));
+            }
         }
         else
+        {
+            LOGSTREAM(debug,"connect_with_timeout(): error: " << strerror(errno));
             throw t2n_connect_error(string("connect() error: ")+strerror(errno));
+        }
     }
+
+    LOGSTREAM(debug,"connect_with_timeout(): success");
 }
 
 void socket_client_connection::close()
@@ -189,6 +220,8 @@ void socket_client_connection::close()
 */
 void socket_client_connection::reconnect()
 {
+    LOGSTREAM(debug,"reconnect()");
+
     // close the current connection if still open
     close();
 
@@ -199,7 +232,12 @@ void socket_client_connection::reconnect()
     else if (type == unix_s)
         unix_connect(max_retries);
 
+    LOGSTREAM(debug,"reconnect(): basic connection established");
+
     reopen();
+
+    LOGSTREAM(debug,"reconnect() done, client_connection::is_closed() now " << client_connection::is_closed());
+
 }
 
 }