client: Do not leak buffer tree node on exit.
[paraslash.git] / net.c
diff --git a/net.c b/net.c
index fa48e54..2f720b1 100644 (file)
--- a/net.c
+++ b/net.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2010 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2011 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
 #define AI_ADDRCONFIG 0
 #endif
 
-#include <dirent.h>
 #include <regex.h>
-#include <openssl/rc4.h>
 
 #include "para.h"
 #include "error.h"
-#include "crypt.h"
 #include "net.h"
 #include "string.h"
 #include "list.h"
@@ -288,7 +285,7 @@ struct flowopts *flowopt_new(void)
  *  \sa setsockopt(2)
  */
 void flowopt_add(struct flowopts *fo, int lev, int opt,
-                char *name, const void *val, int len)
+               const char *name, const void *val, int len)
 {
        struct pre_conn_opt *new = para_malloc(sizeof(*new));
 
@@ -309,7 +306,7 @@ void flowopt_add(struct flowopts *fo, int lev, int opt,
 }
 
 void flowopt_add_bool(struct flowopts *fo, int lev, int opt,
-                     char *optname, bool on_or_off)
+               const char *optname, bool on_or_off)
 {
        int on = on_or_off;     /* kernel takes 'int' */
 
@@ -597,37 +594,6 @@ int generic_max_transport_msg_size(int sockfd)
        return generic_mtu(af_type) - estimated_header_overhead(af_type);
 }
 
-/**
- * Print numeric host and port number (beware - uses static char).
- *
- * \param sa The IPv4/IPv6 socket address to use.
- *
- * \return Host string in numeric host:port format, \sa parse_url().
- * \sa getnameinfo(3), services(5), nsswitch.conf(5)
- */
-static char *host_and_port(const struct sockaddr_storage *ss)
-{
-       const struct sockaddr *sa = normalize_ip_address(ss);
-       char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
-       static char output[sizeof(hbuf) + sizeof(sbuf) + 4];
-       int ret;
-
-       ret = getnameinfo(sa, salen(sa),
-                         hbuf, sizeof(hbuf),
-                         sbuf, sizeof(sbuf),
-                         NI_NUMERICHOST | NI_NUMERICSERV);
-       if (ret) {
-               snprintf(output, sizeof(output), "(unknown)");
-               PARA_WARNING_LOG("hostname lookup error (%s).\n",
-                                gai_strerror(ret));
-       } else if (sa->sa_family == AF_INET6) {
-               snprintf(output, sizeof(output), "[%s]:%s", hbuf, sbuf);
-       } else {
-               snprintf(output, sizeof(output), "%s:%s", hbuf, sbuf);
-       }
-       return output;
-}
-
 /**
  * Look up the local or remote side of a connected socket structure.
  *
@@ -636,23 +602,39 @@ static char *host_and_port(const struct sockaddr_storage *ss)
  * remote side.
  *
  * \return A static character string identifying hostname and port of the
- * chosen side.
+ * chosen side in numeric host:port format.
  *
- * \sa getsockname(2), getpeername(2).
+ * \sa getsockname(2), getpeername(2), parse_url(), getnameinfo(3),
+ * services(5), nsswitch.conf(5).
  */
 static char *__get_sock_name(int fd, int (*getname)(int, struct sockaddr*,
                socklen_t *))
 {
        struct sockaddr_storage ss;
+       const struct sockaddr *sa;
        socklen_t sslen = sizeof(ss);
+       char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
+       static char output[sizeof(hbuf) + sizeof(sbuf) + 4];
+       int ret;
 
        if (getname(fd, (struct sockaddr *)&ss, &sslen) < 0) {
-               static char *dont_know = "(don't know)";
                PARA_ERROR_LOG("can not determine address from fd %d: %s\n",
                        fd, strerror(errno));
-               return dont_know;
+               snprintf(output, sizeof(output), "(unknown)");
+               return output;
        }
-       return host_and_port(&ss);
+       sa = normalize_ip_address(&ss);
+       ret = getnameinfo(sa, salen(sa), hbuf, sizeof(hbuf), sbuf,
+               sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV);
+       if (ret) {
+               PARA_WARNING_LOG("hostname lookup error (%s).\n",
+                       gai_strerror(ret));
+               snprintf(output, sizeof(output), "(lookup error)");
+       } else if (sa->sa_family == AF_INET6)
+               snprintf(output, sizeof(output), "[%s]:%s", hbuf, sbuf);
+       else
+               snprintf(output, sizeof(output), "%s:%s", hbuf, sbuf);
+       return output;
 }
 
 /**