From: Wouter Wijngaards Date: Wed, 19 Oct 2011 14:34:11 +0000 (+0000) Subject: - Implement ipv6%interface notation for scope_id usage. X-Git-Tag: release-1.4.14rc1~48 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ddddbf284f4c354e835744ab7f19ff3c1dac0657;p=thirdparty%2Funbound.git - Implement ipv6%interface notation for scope_id usage. git-svn-id: file:///svn/unbound/trunk@2519 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/doc/Changelog b/doc/Changelog index 092fecdb0..5a2439130 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -2,6 +2,7 @@ - fix unbound-anchor for broken strptime on OSX lion, detected in configure. - Detect if GOST really works, openssl1.0 on OSX fails. + - Implement ipv6%interface notation for scope_id usage. 17 October 2011: Wouter - better documentation for inform_super (Thanks Yang Zhe). diff --git a/util/net_help.c b/util/net_help.c index 95f300df4..3df2cc11d 100644 --- a/util/net_help.c +++ b/util/net_help.c @@ -188,11 +188,21 @@ ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr, if(!ip) return 0; p = (uint16_t) port; if(str_is_ip6(ip)) { + char buf[MAX_ADDR_STRLEN]; + char* s; struct sockaddr_in6* sa = (struct sockaddr_in6*)addr; *addrlen = (socklen_t)sizeof(struct sockaddr_in6); memset(sa, 0, *addrlen); sa->sin6_family = AF_INET6; sa->sin6_port = (in_port_t)htons(p); + if((s=strchr(ip, '%'))) { /* ip6%interface, rfc 4007 */ + if(s-ip >= MAX_ADDR_STRLEN) + return 0; + strncpy(buf, ip, MAX_ADDR_STRLEN); + buf[s-ip]=0; + sa->sin6_scope_id = atoi(s+1); + ip = buf; + } if(inet_pton((int)sa->sin6_family, ip, &sa->sin6_addr) <= 0) { return 0; }