diff options
author | Colin Guthrie <colin@mageia.org> | 2011-10-21 01:28:48 +0100 |
---|---|---|
committer | Colin Guthrie <colin@mageia.org> | 2011-10-21 10:10:39 +0100 |
commit | be75c98a06d569fbaa2d86f92676af961795d094 (patch) | |
tree | e2ce8ce7ffb97af34164634a3fbd8630dc7463e8 /mandriva/supermount | |
parent | 4688ea25c9a5a87e48f89fc91a3c93a7c8c95b4a (diff) | |
download | initscripts-be75c98a06d569fbaa2d86f92676af961795d094.tar initscripts-be75c98a06d569fbaa2d86f92676af961795d094.tar.gz initscripts-be75c98a06d569fbaa2d86f92676af961795d094.tar.bz2 initscripts-be75c98a06d569fbaa2d86f92676af961795d094.tar.xz initscripts-be75c98a06d569fbaa2d86f92676af961795d094.zip |
Add the mdkconf patch
Diffstat (limited to 'mandriva/supermount')
-rw-r--r-- | mandriva/supermount | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/mandriva/supermount b/mandriva/supermount new file mode 100644 index 00000000..cf8a8622 --- /dev/null +++ b/mandriva/supermount @@ -0,0 +1,138 @@ +#!/usr/bin/perl +# (c) 1999/2000/2001,2002,2003 Mandriva, +# Chmouel Boudjnah <chmouel@mandriva.com>, Denis HAVLIK <denis@mandriva.com> +# And others Coooker contributor. +# See http://www.gnu.org for license. +## Enable or disable supermount. +# $Id$ + +my $file = $ENV{FSTAB} || '/etc/fstab'; +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 noauto); +my @normal_must = qw (user noauto nodev nosuid); +my @super_must = qw (nodev nosuid); +my $fs_ok = '(auto|vfat|iso9660)'; +my $dev_ok = '(fd|floppy|zip|cdrom)\d*'; +my $mnt_ok = '(floppy|zip|cdrom)\d*'; +my ($enable, $disable, $infile); + +while ($ARGV[0] =~ /^--/ || $ARGV[0] =~ /^-/) { + $_ = shift; + if (/^--file=([^ \t]+)/ || /^-f=([^ \t]+)/) { + $file = $1; + } elsif (/^--mountpoint=([^ \t]+)/ || /^-m=([^ \t]+)/) { + $mpoint = $1; + } elsif (/^--infile/ || /^-i/) { + $infile++; + } elsif (/^--help/ || /^-h/ || /^-\?/) { + usage(0); + } else { + print STDERR "Unrecognized switch: $_\n"; + usage(1); + } +} + +if ($ARGV[0] =~ /enable/) { $enable++; } +elsif ( $ARGV[0] =~ /disable/ ) { $disable++; } +else { usage(1); } + +open FH, $file or die "Can't open $file\n"; +if ($infile) { + $ofile = `mktemp /tmp/fstab.XXXXXX` || die "Can't create temporary file\n"; chomp $ofile; + open OU, ">$ofile" or die "Can't write to $ofile\n"; select OU; +} + +while (<FH>) { + my ($dev, $point, $fs, $opt, $d1, $d2) = split; + my @opt = split (',', $opt); + if ( $disable && ($fs eq "supermount") && (!defined($mpoint) || $point eq $mpoint) && $_ !~ /^#/ ) { + my @must; + map { m/^fs=(\S+)/ && ($fs = $1); + m/dev=(\S+)/ && ($dev= $1); } @opt; + $fs = 'auto' if $fs =~ /:/; + &clean_options(\@opt,\@normal_must,\@normal_bad); + if ($dev =~ /^\/dev\/(fd[0-1]|floppy$)/ ) { + @must = qw (sync); + &clean_options(\@opt,\@must, []); + } elsif (($dev =~ /^\/dev\/cdrom\d*$/) || ($fs eq "iso9660" )) { + @must = qw (ro exec); + &clean_options(\@opt,\@must, []); + } + $opt = join (',' , @opt); + print "$dev\t$point\t$fs $opt\t$d1 $d2\n"; + next; +} elsif ( $enable && (!defined($mpoint) || $point eq $mpoint) && + ( $fs eq "iso9660" || + ( $_ !~ /^#/ && $fs =~ m/$fs_ok/ && + ( $dev =~ /^\/dev\/($dev_ok)$/ || $point =~ m|^/mnt/($mnt_ok)$| ) + ) + ) && + ($opt =~ m/(^|.*,)user.*/) + ) { + if ($fs eq "auto") { + if ($point =~ m,.*/cdrom\d*$, or $dev =~ m,.*/cdrom\d*$,) { + $fs = "udf:iso9660"; + } else { + $fs = "ext2:vfat"; + } + } + &clean_options(\@opt,\@super_must, \@super_bad); + $opt = join (',' , @opt); + print "none\t$point\tsupermount\tfs=$fs,dev=$dev,--,$opt 0 0\n"; + next; + } + print; +} + +close FH; + +if ($infile) { close OU; + system("cp -f", $file, "$file.old"); + system("mv", $ofile, $file);chmod 0644, $file; } + +sub clean_options { + my ($ap_opt, $ap_must, $ap_bad) = @_; + my $o; my %union; my @opt = @$ap_bad; + foreach $o (@$ap_bad) {@$ap_opt = grep ( !/^$o$/ ,@$ap_opt);} + foreach my $o (@$ap_opt, @$ap_must) { $union{$o}++;} + @$ap_opt=keys %union; +} + +sub usage { + my $e = shift @_; + $0 =~ s|.*/||; + print { $e ? STDERR : STDOUT } << "EOF"; +Usage: $0 [OPTION]... <disable | enable> +Enable or disable supermount in fstab. + + -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: Make modification directly in the file. + +EOF + exit($e); +} +__END__ + CHANGELOG: +Thu Feb 25 2001 Andrej Borsenkow <Andrej.Borsenkow@mow.siemens.ru> +- 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 <denis@mandriva.com> +- 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 + array, adds the "must" options and removes the "bad" ones, and re-wrote the + while (<FH>) {} loop to take advantage of this functions. +- simplified the fstab parsing (split instead of regexp-s) +- 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.*/ )) ) |