mount: handle list of comma-separated fs types in -t option
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Thu, 3 Nov 2011 09:02:31 +0000 (10:02 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 3 Nov 2011 09:02:31 +0000 (10:02 +0100)
Allows one to specify list of filesystem types to be
tried when mounting particular device. E.g.

 mount -t vfat,ext2 ...
Signed-off-by: Karol Lewandowski <k.lewandowsk@samsung.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
util-linux/mount.c

index fddd7fb..f94b6e6 100644 (file)
@@ -38,7 +38,7 @@
 //usage:       )
 //usage:     "\n       -r              Read-only mount"
 //usage:     "\n       -w              Read-write mount (default)"
-//usage:     "\n       -t FSTYPE       Filesystem type"
+//usage:     "\n       -t FSTYPE[,...] Filesystem type(s)"
 //usage:     "\n       -O OPT          Mount only filesystems with option OPT (-a only)"
 //usage:     "\n-o OPT:"
 //usage:       IF_FEATURE_MOUNT_LOOP(
@@ -1827,7 +1827,16 @@ static int singlemount(struct mntent *mp, int ignore_busy)
        // If we know the fstype (or don't need to), jump straight
        // to the actual mount.
        if (mp->mnt_type || (vfsflags & (MS_REMOUNT | MS_BIND | MS_MOVE))) {
-               rc = mount_it_now(mp, vfsflags, filteropts);
+               char *next;
+               for (;;) {
+                       next = mp->mnt_type ? strchr(mp->mnt_type, ',') : NULL;
+                       if (next)
+                               *next = '\0';
+                       rc = mount_it_now(mp, vfsflags, filteropts);
+                       if (rc == 0 || !next)
+                               break;
+                       mp->mnt_type = next + 1;
+               }
        } else {
                // Loop through filesystem types until mount succeeds
                // or we run out
@@ -1844,7 +1853,7 @@ static int singlemount(struct mntent *mp, int ignore_busy)
                for (fl = fslist; fl; fl = fl->link) {
                        mp->mnt_type = fl->data;
                        rc = mount_it_now(mp, vfsflags, filteropts);
-                       if (!rc)
+                       if (rc == 0)
                                break;
                }
        }