]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Add a new "tor_sockaddr_to_str()" function
authorNick Mathewson <nickm@torproject.org>
Mon, 2 May 2011 20:43:11 +0000 (16:43 -0400)
committerNick Mathewson <nickm@torproject.org>
Fri, 13 May 2011 14:41:18 +0000 (10:41 -0400)
It does what it says on the tin.  It turns out I'll want this in a couple
of places.

src/common/address.c
src/common/address.h

index 34e109fcf4ebde71c72e69e3bdff3283da1b6a2e..1c725393d964d65beebeff949886bb431a454d15 100644 (file)
@@ -43,6 +43,9 @@
 #ifdef HAVE_SYS_PARAM_H
 #include <sys/param.h> /* FreeBSD needs this to know what version it is */
 #endif
+#ifdef HAVE_SYS_UN_H
+#include <sys/un.h>
+#endif
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -120,6 +123,33 @@ tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa,
   return 0;
 }
 
+/** Return a newly allocated string holding the address described in
+ * <b>sa</b>.  AF_UNIX, AF_UNSPEC, AF_INET, and AF_INET6 are supported. */
+char *
+tor_sockaddr_to_str(const struct sockaddr *sa)
+{
+  char address[TOR_ADDR_BUF_LEN];
+  char *result;
+  tor_addr_t addr;
+  uint16_t port;
+#ifdef HAVE_SYS_UN_H
+  if (sa->sa_family == AF_UNIX) {
+    struct sockaddr_un *s_un = (struct sockaddr_un *)sa;
+    tor_asprintf(&result, "unix:%s", s_un->sun_path);
+    return result;
+  }
+#endif
+  if (sa->sa_family == AF_UNSPEC)
+    return tor_strdup("unspec");
+
+  if (tor_addr_from_sockaddr(&addr, sa, &port) < 0)
+    return NULL;
+  if (! tor_addr_to_str(address, &addr, sizeof(address), 1))
+    return NULL;
+  tor_asprintf(&result, "%s:%d", address, (int)port);
+  return result;
+}
+
 /** Set address <b>a</b> to the unspecified address.  This address belongs to
  * no family. */
 void
index d05a3de2e72a988440b61d34e7eddf123f0a1413..9a7656f69bf5bbab0e81235fb6a8d8faa720f093 100644 (file)
@@ -44,6 +44,7 @@ socklen_t tor_addr_to_sockaddr(const tor_addr_t *a, uint16_t port,
 int tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa,
                            uint16_t *port_out);
 void tor_addr_make_unspec(tor_addr_t *a);
+char *tor_sockaddr_to_str(const struct sockaddr *sa);
 
 /** Return an in6_addr* equivalent to <b>a</b>, or NULL if <b>a</b> is not
  * an IPv6 address. */