[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-unstable-124-ga3f7db3

Jeremy Allison jra at samba.org
Fri Oct 26 23:09:57 GMT 2007


The branch, v3-2-test has been updated
       via  a3f7db3d30ced566c8340696914f1be3293a9c5b (commit)
       via  4b3635d6bc1bd5e4135ef208dff052e1d9b58a12 (commit)
      from  cecc8075513a3cca17aeab0c88ae05ed13a07ee3 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit a3f7db3d30ced566c8340696914f1be3293a9c5b
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 26 16:03:20 2007 -0700

    Move the horrible hack for link local addresses out of namequery.c
    and into util_sock.c. is_ipaddress() now copes with link:local:v6%ifname
    addresses, as does interpret_string_addr().
    Jeremy

commit 4b3635d6bc1bd5e4135ef208dff052e1d9b58a12
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 26 16:02:16 2007 -0700

    Fix a few more sockaddr -> sockaddr_storgage.
    Jeremy.

-----------------------------------------------------------------------

Summary of changes:
 source/lib/util_sock.c    |   55 +++++++++++++++++++++++++++++++++++++++++---
 source/libsmb/namequery.c |   26 ---------------------
 source/utils/smbfilter.c  |    6 ++--
 3 files changed, 54 insertions(+), 33 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/lib/util_sock.c b/source/lib/util_sock.c
index 80d4af8..91da407 100644
--- a/source/lib/util_sock.c
+++ b/source/lib/util_sock.c
@@ -53,11 +53,27 @@ bool is_ipaddress(const char *str)
 	int ret = -1;
 
 #if defined(HAVE_IPV6)
-	struct in6_addr dest6;
+	if (strchr_m(str, ':')) {
+		char addr[INET6_ADDRSTRLEN];
+		struct in6_addr dest6;
+		const char *sp = str;
+		char *p = strchr_m(str, '%');
 
-	ret = inet_pton(AF_INET6, str, &dest6);
-	if (ret > 0) {
-		return true;
+		/*
+		 * Cope with link-local.
+		 * This is IP:v6:addr%ifname.
+		 */
+
+		if (p && (p > str) && (if_nametoindex(p+1) != 0)) {
+			strlcpy(addr, str,
+				MIN(PTR_DIFF(p,str)+1,
+					sizeof(addr)));
+			sp = addr;
+		}
+		ret = inet_pton(AF_INET6, addr, &dest6);
+		if (ret > 0) {
+			return true;
+		}
 	}
 #endif
 	return is_ipaddress_v4(str);
@@ -200,7 +216,27 @@ bool interpret_string_addr(struct sockaddr_storage *pss,
 		const char *str,
 		int flags)
 {
+	char addr[INET6_ADDRSTRLEN];
 	struct addrinfo *res = NULL;
+#if defined(HAVE_IPV6)
+	unsigned int scope_id = 0;
+
+	if (strchr_m(str, ':')) {
+		char *p = strchr_m(str, '%');
+
+		/*
+		 * Cope with link-local.
+		 * This is IP:v6:addr%ifname.
+		 */
+
+		if (p && (p > str) && ((scope_id = if_nametoindex(p+1)) != 0)) {
+			strlcpy(addr, str,
+				MIN(PTR_DIFF(p,str)+1,
+					sizeof(addr)));
+			str = addr;
+		}
+	}
+#endif
 
 	zero_addr(pss, AF_INET);
 
@@ -212,6 +248,17 @@ bool interpret_string_addr(struct sockaddr_storage *pss,
 	}
 	/* Copy the first sockaddr. */
 	memcpy(pss, res->ai_addr, res->ai_addrlen);
+
+#if defined(HAVE_IPV6)
+	if (pss->ss_family == AF_INET6 && scope_id) {
+		struct sockaddr_in6 *ps6 = (struct sockaddr_in6 *)pss;
+		if (IN6_IS_ADDR_LINKLOCAL(&ps6->sin6_addr) &&
+				ps6->sin6_scope_id == 0) {
+			ps6->sin6_scope_id = scope_id;
+		}
+	}
+#endif
+
 	freeaddrinfo(res);
 	return true;
 }
diff --git a/source/libsmb/namequery.c b/source/libsmb/namequery.c
index 90e6be6..34fe09b 100644
--- a/source/libsmb/namequery.c
+++ b/source/libsmb/namequery.c
@@ -1594,32 +1594,6 @@ 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);
 	}
diff --git a/source/utils/smbfilter.c b/source/utils/smbfilter.c
index c6f0515..706b24a 100644
--- a/source/utils/smbfilter.c
+++ b/source/utils/smbfilter.c
@@ -199,15 +199,15 @@ static void start_filter(char *desthost)
 	while (1) {
 		fd_set fds;
 		int num;
-		struct sockaddr addr;
-		socklen_t in_addrlen = sizeof(addr);
+		struct sockaddr_storage ss;
+		socklen_t in_addrlen = sizeof(ss);
 		
 		FD_ZERO(&fds);
 		FD_SET(s, &fds);
 
 		num = sys_select_intr(s+1,&fds,NULL,NULL,NULL);
 		if (num > 0) {
-			c = accept(s, &addr, &in_addrlen);
+			c = accept(s, (struct sockaddr *)&ss, &in_addrlen);
 			if (c != -1) {
 				if (fork() == 0) {
 					close(s);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list