[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