]> diplodocus.org Git - nmh/blobdiff - sbr/client.c
Fixed file descriptor leak in mhfixmsg when run on multiple input files.
[nmh] / sbr / client.c
index 572f8ee0adecf046c00ce3b52f64038c1fc98c5e..8d390a816510b54a7ee6c1c89209ec07378ebbbf 100644 (file)
@@ -9,6 +9,7 @@
 #include "client.h"
 #include "h/mts.h"
 #include "h/utils.h"
+#include <fcntl.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netdb.h>
@@ -71,7 +72,15 @@ client (char *server, char *service, char *response, int len_response,
        }
 
        if (connect(sd, ai->ai_addr, ai->ai_addrlen) == 0) {
+           int flags;
+
            freeaddrinfo(res);
+
+           flags = fcntl(sd, F_GETFD, 0);
+
+           if (flags != -1)
+               fcntl(sd, F_SETFD, flags | FD_CLOEXEC);
+
            return sd;
        }
 
@@ -93,10 +102,19 @@ client (char *server, char *service, char *response, int len_response,
 
     if (res->ai_next)
        snprintf(response, len_response, "no servers available (use -snoop "
-                "for details");
-    else
-       snprintf(response, len_response, "Connection to \"%s\" failed: %s",
-                server, strerror(errno));
+                "for details)");
+    else {
+       char port[NI_MAXSERV];
+
+       if (getnameinfo(res->ai_addr, res->ai_addrlen, NULL, 0, port,
+                       sizeof port, NI_NUMERICSERV)) {
+           strncpy(port, "unknown", sizeof port);
+           port[sizeof(port) - 1] = '\0';
+       }
+
+       snprintf(response, len_response, "Connection to \"%s:%s\" failed: %s",
+                server, port, strerror(errno));
+    }
 
     freeaddrinfo(res);