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:
parent
dea3bdbefe
commit
b09ab448b8
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user