libbb: make xmalloc_sockaddr2dotted use NI_NUMERICSCOPE
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 26 Sep 2016 17:53:04 +0000 (19:53 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 26 Sep 2016 17:53:04 +0000 (19:53 +0200)
Gives "mount -t cifs //fe80::6a05:caff:fe3e:dbf5%eth0/test test"
a chance to work: mount must pass "ip=numeric_IPv6%numeric_iface_id"
in the omunt option string. Currently, it does not.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libbb/xconnect.c
util-linux/mount.c

index 6e78e636367296ea3a430fe9b1cfef6ed439b3ce..3a0dc2653fc61707af18120899192be680ec537e 100644 (file)
@@ -496,12 +496,15 @@ char* FAST_FUNC xmalloc_sockaddr2hostonly_noport(const struct sockaddr *sa)
 {
        return sockaddr2str(sa, NI_NAMEREQD | IGNORE_PORT);
 }
+#ifndef NI_NUMERICSCOPE
+# define NI_NUMERICSCOPE 0
+#endif
 char* FAST_FUNC xmalloc_sockaddr2dotted(const struct sockaddr *sa)
 {
-       return sockaddr2str(sa, NI_NUMERICHOST);
+       return sockaddr2str(sa, NI_NUMERICHOST | NI_NUMERICSCOPE);
 }
 
 char* FAST_FUNC xmalloc_sockaddr2dotted_noport(const struct sockaddr *sa)
 {
-       return sockaddr2str(sa, NI_NUMERICHOST | IGNORE_PORT);
+       return sockaddr2str(sa, NI_NUMERICHOST | NI_NUMERICSCOPE | IGNORE_PORT);
 }
index 13590ceb41909202a05db8ffafca4ae1c686bc6b..c3e91e2a61d6e9d93fe6f83c72b3d849304c14bc 100644 (file)
@@ -1975,6 +1975,12 @@ static int singlemount(struct mntent *mp, int ignore_busy)
                dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa);
                if (ENABLE_FEATURE_CLEAN_UP) free(lsa);
                ip = xasprintf("ip=%s", dotted);
+// Note: IPv6 scoped addresses ("name%iface", see RFC 4007) should be
+// handled by libc in getnameinfo() (inside xmalloc_sockaddr2dotted_noport()).
+// Currently, glibc does not support that (has no NI_NUMERICSCOPE),
+// musl apparently does. This results in "ip=numericIPv6%iface_name"
+// (instead of _numeric_ iface_id) with glibc.
+// This probalby should be fixed in glibc, not here.
                if (ENABLE_FEATURE_CLEAN_UP) free(dotted);
                parse_mount_options(ip, &filteropts);
                if (ENABLE_FEATURE_CLEAN_UP) free(ip);