From 6128d116b3f09ce0b055d2df89b2f7282185782e Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 25 Oct 2007 18:28:36 -0700 Subject: Fix resolve name to resolve IPv6 addresses of link-local%ifaddr Jeremy. (This used to be commit e6609cab732d5cd5cc9a5ae50aee15147f2ec6ec) --- source3/libsmb/namequery.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'source3/libsmb/namequery.c') diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index 34fe09b8c2..90e6be6a90 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -1594,6 +1594,32 @@ bool resolve_name(const char *name, char *sitename = NULL; int count = 0; +#if defined(HAVE_IPV6) + unsigned int if_idx = 0; + const char *p = strchr_m(name, '%'); + + if (p && (if_idx = if_nametoindex(p+1)) != 0) { + char *newname = SMB_STRDUP(name); + if (!newname) { + return false; + } + newname[PTR_DIFF(p,name)] = '\0'; + if (is_ipaddress(newname) && + interpret_string_addr(return_ss, + newname, AI_NUMERICHOST)) { + struct sockaddr_in6 *psa6 = + (struct sockaddr_in6 *)&return_ss; + if (psa6->sin6_scope_id == 0 && + IN6_IS_ADDR_LINKLOCAL(&psa6->sin6_addr)) { + psa6->sin6_scope_id = if_idx; + } + SAFE_FREE(newname); + return true; + } + SAFE_FREE(newname); + } +#endif + if (is_ipaddress(name)) { return interpret_string_addr(return_ss, name, AI_NUMERICHOST); } -- cgit