mount: for cifs, dont insert "ip=ADDR" option if user gave it explicitly

This makes it possible to use scoped IPv6 addresses:

mount -t cifs -o ip=<ADDR>%<iface_id> //<ADDR>/test test

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2016-09-27 21:02:35 +02:00
parent dea3bdbefe
commit b09ab448b8

View File

@ -1931,7 +1931,6 @@ static int singlemount(struct mntent *mp, int ignore_busy)
int len; int len;
char c; char c;
char *hostname, *share; char *hostname, *share;
char *dotted, *ip;
len_and_sockaddr *lsa; len_and_sockaddr *lsa;
// Parse mp->mnt_fsname of the form "//hostname/share[/dir1/dir2]" // Parse mp->mnt_fsname of the form "//hostname/share[/dir1/dir2]"
@ -1971,19 +1970,26 @@ static int singlemount(struct mntent *mp, int ignore_busy)
if (!lsa) if (!lsa)
goto report_error; goto report_error;
// Insert "ip=..." option into options // If there is no "ip=..." option yet
dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa); if (!is_prefixed_with(filteropts, ",ip="+1)
if (ENABLE_FEATURE_CLEAN_UP) free(lsa); && !strstr(filteropts, ",ip=")
ip = xasprintf("ip=%s", dotted); ) {
if (ENABLE_FEATURE_CLEAN_UP) free(dotted); char *dotted, *ip;
// Insert "ip=..." option into options
dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa);
if (ENABLE_FEATURE_CLEAN_UP) free(lsa);
ip = xasprintf("ip=%s", dotted);
if (ENABLE_FEATURE_CLEAN_UP) free(dotted);
// Note: IPv6 scoped addresses ("host%iface", see RFC 4007) should be // Note: IPv6 scoped addresses ("host%iface", see RFC 4007) should be
// handled by libc in getnameinfo() (inside xmalloc_sockaddr2dotted_noport()). // handled by libc in getnameinfo() (inside xmalloc_sockaddr2dotted_noport()).
// Currently, glibc does not support that (has no NI_NUMERICSCOPE), // Currently, glibc does not support that (has no NI_NUMERICSCOPE),
// musl apparently does. This results in "ip=numericIPv6%iface_name" // musl apparently does. This results in "ip=numericIPv6%iface_name"
// (instead of _numeric_ iface_id) with glibc. // (instead of _numeric_ iface_id) with glibc.
// This probably should be fixed in glibc, not here. // This probably should be fixed in glibc, not here.
parse_mount_options(ip, &filteropts); // The workaround is to manually specify correct "ip=ADDR%n" option.
if (ENABLE_FEATURE_CLEAN_UP) free(ip); parse_mount_options(ip, &filteropts);
if (ENABLE_FEATURE_CLEAN_UP) free(ip);
}
mp->mnt_type = (char*)"cifs"; mp->mnt_type = (char*)"cifs";
rc = mount_it_now(mp, vfsflags, filteropts); rc = mount_it_now(mp, vfsflags, filteropts);