r5640: On failed mount (ENXIO) retry share name in uppercase (fix mount to FastConnec...
authorSteve French <sfrench@samba.org>
Thu, 3 Mar 2005 04:07:55 +0000 (04:07 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:55:53 +0000 (10:55 -0500)
(This used to be commit 8bd98b643d097cbd5e1650ec63a2f3176c3879d7)

source3/client/mount.cifs.c

index d648629f9c31fd59b0f117db3a0d33f8954f8c12..5aa6056fe8a38a788af1d2857caae60d3642aaaf 100755 (executable)
@@ -24,6 +24,7 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <pwd.h>
+#include <ctype.h>
 #include <sys/types.h>
 #include <sys/mount.h>
 #include <sys/stat.h>
@@ -38,7 +39,7 @@
 #include <fcntl.h>
 
 #define MOUNT_CIFS_VERSION_MAJOR "1"
-#define MOUNT_CIFS_VERSION_MINOR "5"
+#define MOUNT_CIFS_VERSION_MINOR "6"
 
 #ifndef MOUNT_CIFS_VENDOR_SUFFIX
 #define MOUNT_CIFS_VENDOR_SUFFIX ""
@@ -657,6 +658,7 @@ int main(int argc, char ** argv)
        int gid = 0;
        int optlen = 0;
        int orgoptlen = 0;
+       int retry = 0; /* set when we have to retry mount with uppercase */
        struct stat statbuf;
        struct utsname sysinfo;
        struct mntent mountent;
@@ -846,6 +848,7 @@ int main(int argc, char ** argv)
        }
        /* FIXME launch daemon (handles dfs name resolution and credential change) 
           remember to clear parms and overwrite password field before launching */
+mount_retry:
        if(orgoptions) {
                optlen = strlen(orgoptions);
                orgoptlen = optlen;
@@ -897,6 +900,8 @@ int main(int argc, char ** argv)
                printf("\nmount.cifs kernel mount options %s \n",options);
        if(mount(share_name, mountpoint, "cifs", flags, options)) {
        /* remember to kill daemon on error */
+               char * tmp;
+
                switch (errno) {
                case 0:
                        printf("mount failed but no error number set\n");
@@ -904,7 +909,21 @@ int main(int argc, char ** argv)
                case ENODEV:
                        printf("mount error: cifs filesystem not supported by the system\n");
                        break;
+               case ENXIO:
+                       if(retry == 0) {
+                               retry = 1;
+                               tmp = share_name;
+                               while (*tmp && !(((unsigned char)tmp[0]) & 0x80)) {
+                                       *tmp = toupper((unsigned char)*tmp);
+                                       tmp++;
+                               }
+                               if(!*tmp) {
+                                       printf("retrying with upper case share name\n");
+                                       goto mount_retry;
+                               }
+                       }
                default:
+                       
                        printf("mount error %d = %s\n",errno,strerror(errno));
                }
                printf("Refer to the mount.cifs(8) manual page (e.g.man mount.cifs)\n");