r2917: Fix ip address override in mount.cifs mount helper and clean up warning messag...
authorSteve French <sfrench@samba.org>
Mon, 11 Oct 2004 16:30:14 +0000 (16:30 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:52:56 +0000 (10:52 -0500)
(This used to be commit 1052eabf29f6c197b126f44d32fd5c5bc8f4a9c3)

source3/client/mount.cifs.c

index 55934e04b3c66f0909e16e8e9fe74ad2b8f96aa5..6a7d1e65a12a9db68aae1ca69109df608427769f 100755 (executable)
@@ -38,7 +38,7 @@
 #include <fcntl.h>
 
 #define MOUNT_CIFS_VERSION_MAJOR "1"
-#define MOUNT_CIFS_VERSION_MINOR "4"
+#define MOUNT_CIFS_VERSION_MINOR "5"
 
 #ifndef MOUNT_CIFS_VENDOR_SUFFIX
 #define MOUNT_CIFS_VENDOR_SUFFIX ""
@@ -77,7 +77,13 @@ static void mount_cifs_usage(void)
        printf("\nMount the remote target, specified as a UNC name,");
        printf(" to a local directory.\n\nOptions:\n");
        printf("\tuser=<arg>\n\tpass=<arg>\n\tdom=<arg>\n");
-       printf("\nOther less commonly used options are described in the manual page");
+       printf("\nLess commonly used options:");
+       printf("\n\tcredentials=<filename>,guest,perm,noperm,setuids,nosetuids,\n\trw,ro,sep=<char>,iocharset=<codepage>,suid,nosuid,exec,noexec");
+       printf("\n\nOptions not needed for servers supporting CIFS Unix extensions (e.g. most Samba versions):");
+       printf("\n\tuid=<uid>,gid=<gid>,dir_mode=<mode>,file_mode=<mode>");
+       printf("\n\nRarely used options:");
+       printf("\n\tport=<tcpport>,rsize=<size>,wsize=<size>,unc=<unc_name>,ip=<ip_address>,dev,nodev");
+       printf("\n\nOptions are described in more detail in the manual page");
        printf("\n\tman 8 mount.cifs\n");
        printf("\nTo display the version number of the mount helper:");
        printf("\n\t%s -V\n",thisprogram);
@@ -246,9 +252,9 @@ static int get_password_from_file(int file_descript, char * filename)
 static int parse_options(char * options, int * filesys_flags)
 {
        char * data;
-       char * percent_char = 0;
-       char * value = 0;
-       char * next_keyword = 0;
+       char * percent_char = NULL;
+       char * value = NULL;
+       char * next_keyword = NULL;
        int rc = 0;
 
        if (!options)
@@ -344,6 +350,8 @@ static int parse_options(char * options, int * filesys_flags)
                        if (!value || !*value) {
                                printf("target ip address argument missing");
                        } else if (strnlen(value, 35) < 35) {
+                               if(verboseflag)
+                                       printf("ip address %s override specified\n",value);
                                got_ip = 1;
                        } else {
                                printf("ip address too long\n");
@@ -497,7 +505,7 @@ static int parse_options(char * options, int * filesys_flags)
                if(next_keyword)
                        *next_keyword = ',';
                else
-                       data = 0;
+                       data = NULL;
        }
        return 0;
 }
@@ -515,7 +523,7 @@ char * parse_server(char ** punc_name)
 
        if(length > 1023) {
                printf("mount error: UNC name too long");
-               return 0;
+               return NULL;
        }
        if (strncasecmp("cifs://",unc_name,7) == 0)
                return parse_cifs_url(unc_name+7);
@@ -526,7 +534,7 @@ char * parse_server(char ** punc_name)
        if(length < 3) {
                /* BB add code to find DFS root here */
                printf("\nMounting the DFS root for domain not implemented yet");
-               return 0;
+               return NULL;
        } else {
                if(strncmp(unc_name,"//",2) && strncmp(unc_name,"\\\\",2)) {
                        /* check for nfs syntax ie server:share */
@@ -542,7 +550,7 @@ char * parse_server(char ** punc_name)
                        } else {
                                printf("mount error: improperly formatted UNC name.");
                                printf(" %s does not begin with \\\\ or //\n",unc_name);
-                               return 0;
+                               return NULL;
                        }
                } else {
 continue_unc_parsing:
@@ -553,15 +561,20 @@ continue_unc_parsing:
                                (share = strchr(unc_name,'\\'))) {
                                *share = 0;  /* temporarily terminate the string */
                                share += 1;
-                               host_entry = gethostbyname(unc_name);
+                               if(got_ip == 0) {
+                                       host_entry = gethostbyname(unc_name);
+                               }
                                *(share - 1) = '/'; /* put the slash back */
-/*                             rc = getipnodebyname(unc_name, AF_INET, AT_ADDRCONFIG ,&rc);*/
+                               if(got_ip) {
+                                       if(verboseflag)
+                                               printf("ip address specified explicitly\n");
+                                       return NULL;
+                               }
                                if(host_entry == NULL) {
                                        printf("mount error: could not find target server. TCP name %s not found ", unc_name);
                                        printf(" rc = %d\n",rc);
-                                       return 0;
-                               }
-                               else {
+                                       return NULL;
+                               } else {
                                        /* BB should we pass an alternate version of the share name as Unicode */
                                        /* BB what about ipv6? BB */
                                        /* BB add retries with alternate servers in list */
@@ -571,46 +584,46 @@ continue_unc_parsing:
                                        ipaddress_string = inet_ntoa(server_ipaddr);                                                                                     
                                        if(ipaddress_string == NULL) {
                                                printf("mount error: could not get valid ip address for target server\n");
-                                               return 0;
+                                               return NULL;
                                        }
                                        return ipaddress_string; 
                                }
                        } else {
                                /* BB add code to find DFS root (send null path on get DFS Referral to specified server here */
                                printf("Mounting the DFS root for a particular server not implemented yet\n");
-                               return 0;
+                               return NULL;
                        }
                }
        }
 }
 
 static struct option longopts[] = {
-       { "all", 0, 0, 'a' },
-       { "help",0, 0, 'h' },
-       { "move",0, 0, 'm' },
-       { "bind",0, 0, 'b' },
-       { "read-only", 0, 0, 'r' },
-       { "ro", 0, 0, 'r' },
-       { "verbose", 0, 0, 'v' },
-       { "version", 0, 0, 'V' },
-       { "read-write", 0, 0, 'w' },
-       { "rw", 0, 0, 'w' },
-       { "options", 1, 0, 'o' },
-       { "type", 1, 0, 't' },
-       { "rsize",1, 0, 'R' },
-       { "wsize",1, 0, 'W' },
-       { "uid", 1, 0, '1'},
-       { "gid", 1, 0, '2'},
-       { "user",1,0,'u'},
-       { "username",1,0,'u'},
-       { "dom",1,0,'d'},
-       { "domain",1,0,'d'},
-       { "password",1,0,'p'},
-       { "pass",1,0,'p'},
-       { "credentials",1,0,'c'},
-       { "port",1,0,'P'},
-       /* { "uuid",1,0,'U'}, */ /* BB unimplemented */
-       { NULL, 0, 0, 0 }
+       { "all", 0, NULL, 'a' },
+       { "help",0, NULL, 'h' },
+       { "move",0, NULL, 'm' },
+       { "bind",0, NULL, 'b' },
+       { "read-only", 0, NULL, 'r' },
+       { "ro", 0, NULL, 'r' },
+       { "verbose", 0, NULL, 'v' },
+       { "version", 0, NULL, 'V' },
+       { "read-write", 0, NULL, 'w' },
+       { "rw", 0, NULL, 'w' },
+       { "options", 1, NULL, 'o' },
+       { "type", 1, NULL, 't' },
+       { "rsize",1, NULL, 'R' },
+       { "wsize",1, NULL, 'W' },
+       { "uid", 1, NULL, '1'},
+       { "gid", 1, NULL, '2'},
+       { "user",1,NULL,'u'},
+       { "username",1,NULL,'u'},
+       { "dom",1,NULL,'d'},
+       { "domain",1,NULL,'d'},
+       { "password",1,NULL,'p'},
+       { "pass",1,NULL,'p'},
+       { "credentials",1,NULL,'c'},
+       { "port",1,NULL,'P'},
+       /* { "uuid",1,NULL,'U'}, */ /* BB unimplemented */
+       { NULL, 0, NULL, 0 }
 };
 
 int main(int argc, char ** argv)
@@ -767,12 +780,15 @@ int main(int argc, char ** argv)
                get_password_from_file(0, getenv("PASSWD_FILE"));
        }
 
+        if (orgoptions && parse_options(orgoptions, &flags))
+                return -1;
+       
        ipaddr = parse_server(&share_name);
-       if(ipaddr == NULL)
+       if((ipaddr == NULL) && (got_ip == 0)) {
+               printf("No ip address specified and hostname not found\n");
                return -1;
+       }
        
-       if (orgoptions && parse_options(orgoptions, &flags))
-               return -1;
 
        /* BB save off path and pop after mount returns? */
        resolved_path = malloc(PATH_MAX+1);