mount.cifs: reinstate ip= as an override for address resolution
authorJeff Layton <jlayton@samba.org>
Fri, 8 Oct 2010 19:11:57 +0000 (15:11 -0400)
committerJeff Layton <jlayton@samba.org>
Fri, 8 Oct 2010 19:11:57 +0000 (15:11 -0400)
The manpage says:

       ip=arg
           sets the destination IP address. This option is set automatically
           if the server name portion of the requested UNC name can be
           resolved so rarely needs to be specified by the user.

...but recent changes have made it not work anymore as an override if
someone specifies an ip= option as part of the mount options. Reinstate
that behavior by copying the ip= option verbatim into the addrlist of
the parsed options struct and then skipping the name resolution. That
should allow the ip= option to pass unadulterated to the kernel.

Signed-off-by: Jeff Layton <jlayton@samba.org>
mount.cifs.c

index ed27bbafd81cf84c616a45655820c17cdbad7203..df92d79d658c4cbfc77f5b28f508c9bd339f982e 100644 (file)
@@ -958,10 +958,12 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info)
                                        "target ip address argument missing\n");
                        } else if (strnlen(value, MAX_ADDRESS_LEN) <=
                                MAX_ADDRESS_LEN) {
+                               strcpy(parsed_info->addrlist, value);
                                if (parsed_info->verboseflag)
                                        fprintf(stderr,
                                                "ip address %s override specified\n",
                                                value);
+                               goto nocopy;
                        } else {
                                fprintf(stderr, "ip address too long\n");
                                return EX_USAGE;
@@ -1556,7 +1558,9 @@ assemble_mountinfo(struct parsed_mount_info *parsed_info,
        if (rc)
                goto assemble_exit;
 
-       rc = resolve_host(parsed_info->host, parsed_info->addrlist);
+       if (parsed_info->addrlist[0] == '\0')
+               rc = resolve_host(parsed_info->host, parsed_info->addrlist);
+
        switch (rc) {
        case EX_USAGE:
                fprintf(stderr, "mount error: could not resolve address for "