* When attempting to connect() to the first available of multiple addresses, create...
authorArt Cancro <ajc@citadel.org>
Fri, 20 Aug 2010 01:31:37 +0000 (01:31 +0000)
committerArt Cancro <ajc@citadel.org>
Fri, 20 Aug 2010 01:31:37 +0000 (01:31 +0000)
* Also CLOSE that socket if the connection attempt fails.  This also fixes a socket descriptor leak that's been in the previous implementation pretty much forever.

citadel/clientsocket.c
citadel/textclient/citadel.c
citadel/utillib/citadel_ipc.c

index 0d2da5a5ac87380eede99dbd957864ec71c2965d..a9325a2b3ebe3ccee2ceb61b28ec71f84db26ec1 100644 (file)
@@ -89,24 +89,26 @@ int sock_connect(char *host, char *service)
                return(-1);
        }
 
-       sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
-       if (sock < 0) {
-               CtdlLogPrintf(CTDL_ERR, "socket() failed: %s\n", strerror(errno));
-               return(-1);
-       }
-
        /*
         * Try all available addresses until we connect to one or until we run out.
         */
        struct addrinfo *ai;
        for (ai = res; ai != NULL; ai = ai->ai_next) {
                /* FIXME display the address to which we are trying to connect */
+
+               sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+               if (sock < 0) {
+                       CtdlLogPrintf(CTDL_ERR, "socket() failed: %s\n", strerror(errno));
+                       return(-1);
+               }
+
                rc = connect(sock, res->ai_addr, res->ai_addrlen);
                if (rc >= 0) {
                        return(sock);
                }
                else {
                        CtdlLogPrintf(CTDL_ERR, "connect() failed: %s\n", strerror(errno));
+                       close(sock);
                }
        }
 
index 407b47ae9469bfeb27f5a9b56ea8264d2d84bac0..30583cfaef5b674eaf63b6372476dc61916512a2 100644 (file)
@@ -1568,8 +1568,7 @@ int main(int argc, char **argv)
        newprompt("Connect to (return for local server): ", hostbuf, 64);
 #endif
 
-       sln_printf("Attaching to server... \r");
-       sln_flush();
+       sln_printf("Attaching to server...\n");
        ipc = CtdlIPC_new(argc, argv, hostbuf, portbuf);
        if (!ipc) {
                screen_delete();
index 785c45199a27676646cc6c7ff64e0d76ff50e604..01e890241f00212b3ee048830c0bb4445f1e94c0 100644 (file)
@@ -2658,24 +2658,26 @@ static int tcp_connectsock(char *host, char *service)
                return(-1);
        }
 
-       sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
-       if (sock < 0) {
-               //      CtdlLogPrintf(CTDL_ERR, "socket() failed: %s\n", strerror(errno));
-               return(-1);
-       }
-
        /*
         * Try all available addresses until we connect to one or until we run out.
         */
        struct addrinfo *ai;
        for (ai = res; ai != NULL; ai = ai->ai_next) {
                /* FIXME display the address to which we are trying to connect */
-               rc = connect(sock, res->ai_addr, res->ai_addrlen);
+fprintf(stderr, "TRYING...\n");
+
+               sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+               if (sock < 0) return(-1);
+
+               rc = connect(sock, ai->ai_addr, ai->ai_addrlen);
                if (rc >= 0) {
+fprintf(stderr, "CONNECTED\n");
                        return(sock);
                }
                else {
+fprintf(stderr, "FAILED: %s\n", strerror(errno));
                        //      CtdlLogPrintf(CTDL_ERR, "connect() failed: %s\n", strerror(errno));
+                       close(sock);
                }
        }