This changes following:

- it always adds ``--'' as delimiter for supermount-specific options to
avoid "unknown option" error (e.g. vfat is installed by default with
"unhide" option that is of course unknown by supermount)

- it slightly changes kernel option parsing to allow for trailing
``--''. It happens, when all standard options are removed by mount
command, e.g. in case like fs=iso9660,dev=/dev/cdrom,--,ro,noexec both
``ro'' and ``noexec'' will be removed by mount. I was tempted to remove
empty option as delimiter as well because it is slurped by mount.

- it adds --mountpoint option as suggested by TODO

- it changes logic to not supermount everything with ``user'' option in
it to avoid supermounting Windows hard disk vfat partitions. So, logic is
"if acceptable filesystems && user option" - I believe, we should allow
supermount only for filesystems with ``user'' flag.

- it removes ``noauto'' option when converting to supermount.

Attached because of line length.

-andrej


--- /usr/src/linux/fs/supermount/super.c.org    Wed Feb 21 14:38:05 2001
+++ /usr/src/linux/fs/supermount/super.c        Sun Feb 25 17:42:15 2001
@@ -147,16 +147,6 @@
        if (!options)
                return 0;
        while ((this_char = options)) {
-               if (!strncmp(this_char, "--,", 3))
-                       this_char += 2;
-               if (*this_char == ',') {
-                       /* An empty option, or the option "--",
-                          introduces options to be passed through to
-                          the subfs */
-                       supermount_debug ("assigning remainder\n");
-                       return copy_option(&sb->u.supermount_sb.s_data,
-                                          ++this_char);
-               }
                if ((options = strchr (this_char, ',')))
                        *options++ = 0;
                
@@ -177,6 +167,13 @@
 #endif
                } else if (!strcmp (this_char, "fail_statfs_until_mount")) {
                        supermount_fail_statfs = 1;
+               } else if (!*this_char || !strcmp(this_char, "--")) {
+                       /* An empty option, or the option "--",
+                          introduces options to be passed through to
+                          the subfs */
+                       supermount_debug ("assigning remainder\n");
+                       return copy_option(&sb->u.supermount_sb.s_data,
+                                          ++this_char);
                } else {
                        printk ("supermount: "
                                "Unrecognized mount option %s\n", this_char);
--- /usr/sbin/supermount.org    Thu Feb 22 14:30:50 2001
+++ /usr/sbin/supermount        Sun Feb 25 18:47:50 2001
@@ -6,12 +6,12 @@
 # $Id: supermount,v 1.1.1.1 2000/07/30 05:07:38 chmouel Exp $
 
 my $file = '/etc/fstab';
-my $ofile;
+my ($ofile, $mpoint);
   
 #"bad" or "nessesary" options for "normal" and "supermount" entry
 # "bad" options can be regexp.
-my @normal_bad = qw ( fs=\S+ dev=\S+);
-my @super_bad = qw (sync user);
+my @normal_bad = qw ( fs=\S+ dev=\S+ --);
+my @super_bad = qw (sync user noauto);
 my @normal_must = qw (user noauto nodev nosuid);
 my @super_must = qw (nodev nosuid);
 my $fs_ok = '(auto|vfat|iso9660)';
@@ -22,6 +22,8 @@
   $_ = shift;
   if (/^--file=([^ \t]+)/ || /^-f=([^ \t]+)/) {
     $file = $1;
+  } elsif (/^--mountpoint=([^ \t]+)/ || /^-m=([^ \t]+)/) {
+    $mpoint = $1;
   } elsif (/^--infile/ || /^-i/) {
     $infile++;
   } elsif (/^--help/ || /^-h/ || /^-\?/) {
@@ -45,7 +47,7 @@
 while (<FH>) {
   my ($dev, $point, $fs, $opt, $d1, $d2) = split;
   my @opt = split (',', $opt);
-  if ( $disable && ($fs eq "supermount") ) {
+  if ( $disable && ($fs eq "supermount") && (!defined($mpoint) || $point eq $mpoint) 
+) {
     my @must;
     map { m/^fs=(\S+)/ && ($fs = $1); 
          m/dev=(\S+)/ && ($dev= $1); } @opt;
@@ -60,18 +62,17 @@
     $opt = join (',' , @opt); 
     print "$dev\t$point\t$fs $opt\t$d1 $d2\n";
     next;
-  } elsif ( $enable && ( 
-                       $fs eq "iso9660" || 
-                       ( ( $fs =~ m/$fs_ok/ ) &&
-                        (   ($dev =~ /^\/dev\/($dev_ok)$/) 
-                         || ($opt =~ m/(^|.*,)user.*/ )
-                        )
-                       )
-                      )
+  } elsif ( $enable && (!defined($mpoint) || $point eq $mpoint) &&
+            ( $fs eq "iso9660" || 
+                         ( $fs =~ m/$fs_ok/ &&
+                           $dev =~ /^\/dev\/($dev_ok)$/
+                     )
+               ) &&
+                        ($opt =~ m/(^|.*,)user.*/)
            ) {
     &clean_options(\@opt,\@super_must, \@super_bad);
     $opt = join (',' , @opt); 
-    print "$point\t$point\tsupermount\tfs=$fs,dev=$dev,$opt 0 0\n";
+    print "$point\t$point\tsupermount\tfs=$fs,dev=$dev,--,$opt 0 0\n";
     next;
   }
   print;
@@ -96,14 +97,22 @@
 Usage: $0 [OPTION]... <disable | enable>
 Enable or disable supermount in fstab. 
 
-  -f=FILE, --file=FILE:         Specify an alternarte fstab file (default: 
/etc/fstab).
-  -i,        --infile:  Modify directly in the file.
+  -m=DIR, --mountpoint=DIR: Specifiy single mount point to enable/disable (default: 
+all)
+  -f=FILE, --file=FILE:            Specify an alternarte fstab file (default: 
+/etc/fstab).
+  -i,        --infile:     Modify directly in the file.
 
 EOF
   exit($e);
 }
 __END__
  CHANGELOG:
+Thu Feb 25 2001 Andrej Borsenkow <[EMAIL PROTECTED]>
+- added ``--'' as delimiter for supermount fs options to avoid mount errors on 
+fs-specific options
+- added --mountpoint option to operate on single mount point
+- changed condition to enable supermount to (($fs eq iso9660) || (($fs =~ m/$fs_ok) 
+&&
+ ($dev =~ /^\/dev\/($dev_ok)$/))) && ($opt =~ m/(^|.*,)user.*/ ) 
+Before it tried to supermount Windows vfat partitions that were defined with user 
+option.
+
 Thu Apr 13 2000 Denis Havlik <[EMAIL PROTECTED]>
 - moved definitions of "good" and "bad" fs-options, "allowed fs-s" and "good devices" 
to top of the script for easier maintainance.
 -  added &clean_options(\@opt,\@must, \@bad) function, which parses the @opt
@@ -113,6 +122,3 @@
 - changed the rules used to decide which mount points are going to be 
 supermounted to: ($fs eq "iso9660") || (( $fs =~ m/$fs_ok/ ) &&
  (($dev =~ /^\/dev\/($dev_ok)$/) || ($opt =~ m/(^|.*,)user.*/ )) )
- TODO:  
-add --mountpoint option to get targeted supermount-enabling/disabling on
- the single moint point. 

Reply via email to