libt2n: (tomj) close open connection (if any) on destruction of socket_client_connect...
[libt2n] / src / socket_client.cpp
index 6b5b481..d8dc413 100644 (file)
@@ -94,6 +94,7 @@ socket_client_connection::socket_client_connection(const std::string& _path,
     {
         lastErrorMsg=e.what();
         LOGSTREAM(debug,"unix connect error: " << lastErrorMsg);
+        // FIXME: Calls virtual function close in constructor
         close();
     }
 
@@ -101,6 +102,16 @@ socket_client_connection::socket_client_connection(const std::string& _path,
         do_callbacks(new_connection);
 }
 
+/**
+ * Destructor. Closes an open connection.
+ */
+socket_client_connection::~socket_client_connection()
+{
+    close();
+}
+
+
+/// establish a connection via tcp
 void socket_client_connection::tcp_connect(int max_retries)
 {
     struct sockaddr_in sock_addr;
@@ -140,6 +151,7 @@ void socket_client_connection::tcp_connect(int max_retries)
     }
 }
 
+/// establish a connection via unix-socket
 void socket_client_connection::unix_connect(int max_retries)
 {
     struct sockaddr_un unix_addr;
@@ -168,10 +180,22 @@ void socket_client_connection::unix_connect(int max_retries)
     }
 }
 
+/// execute a connect on a prepared socket (tcp or unix) respecting timeouts
 void socket_client_connection::connect_with_timeout(struct sockaddr *sock_addr,unsigned int sockaddr_size)
 {
     set_socket_options(sock);
 
+   /* non-blocking mode */
+    int flflags;
+    flflags=fcntl(sock,F_GETFL,0);
+    if (flflags < 0)
+        EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
+
+    flflags &= (O_NONBLOCK ^ 0xFFFF);
+    if (fcntl(sock,F_SETFL,flflags) < 0)
+        EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
+
+
     LOGSTREAM(debug,"connect_with_timeout()");
     int ret=::connect(sock,sock_addr, sockaddr_size);