From: Nick Mathewson Date: Wed, 30 Jul 2008 13:04:26 +0000 (+0000) Subject: r17434@tombo: nickm | 2008-07-29 10:58:36 -0400 X-Git-Tag: tor-0.2.1.3-alpha~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e5bc5f11b87cee1a8f0630f6527bf5a7b1726d44;p=thirdparty%2Ftor.git r17434@tombo: nickm | 2008-07-29 10:58:36 -0400 Refactor tor_addr_from_string: it didnt need most of parse_addr_mask_port_range, and its dependence on that latter function made it less flexible. svn:r16255 --- diff --git a/src/common/address.c b/src/common/address.c index b698eba7a3..fef1f80fea 100644 --- a/src/common/address.c +++ b/src/common/address.c @@ -838,15 +838,31 @@ tor_dup_addr(const tor_addr_t *addr) return tor_strdup(buf); } -/** Convert the string in src to a tor_addr_t addr. +/** Convert the string in src to a tor_addr_t addr. The string + * may be an IPv4 address, an IPv6 address, or an IPv6 address surrounded by + * square brackets. * * Return an address family on success, or -1 if an invalid address string is * provided. */ int tor_addr_from_str(tor_addr_t *addr, const char *src) { + char *tmp = NULL; /* Holds substring if we got a dotted quad. */ + int result; tor_assert(addr && src); - return tor_addr_parse_mask_ports(src, addr, NULL, NULL, NULL); + if (src[0] == '[' && src[1]) + src = tmp = tor_strndup(src+1, strlen(src)-2); + + if (tor_inet_pton(AF_INET6, src, &addr->addr.in6_addr) > 0) { + result = addr->family = AF_INET6; + } else if (tor_inet_pton(AF_INET, src, &addr->addr.in_addr) > 0) { + result = addr->family = AF_INET; + } else { + result = -1; + } + + tor_free(tmp); + return result; } /** Set *addr to the IP address (if any) of whatever interface