--- /usr/sbin/fileshareset 2008-12-09 20:32:26.000000000 +0100+++ /usr/lib64/kde4/libexec/fileshareset 2008-05-21 13:08:06.000000000 +0200@@ -1,9 +1,9 @@ #!/usr/bin/perl -T-+use strict; ######################################## # config files-$nfs_exports::default_options = '*(ro,all_squash,sync,no_subtree_check)';+$nfs_exports::default_options = '*(ro,all_squash)'; $nfs_exports::conf_file = '/etc/exports'; $smb_exports::conf_file = '/etc/samba/smb.conf'; my $authorisation_file = '/etc/security/fileshare.conf';@@ -11,8 +11,7 @@ ########################################-# fileshare utility $Id: fileshareset 233183 2008-01-23 12:17:07Z tv $-# Copyright (C) 2001-2008 Mandriva (pixel@mandriva.com)+# Copyright (C) 2001-2002 MandrakeSoft (pixel@mandrakesoft.com) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by@@ -26,7 +25,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ########################################@@ -38,7 +37,6 @@ my $usage = "usage: fileshareset --add <dir> fileshareset --remove <dir>";- my $not_enabled = qq(File sharing is not enabled. To enable file sharing put @@ -50,13 +48,14 @@ "SHARINGMODE=simple" in $authorisation_file); my $non_authorised =-qq(You are not authorised to use fileshare'ing+qq(You are not authorised to use file sharing To grant you the rights: - put "RESTRICT=no" in $authorisation_file - or put user "$username" in group "$authorisation_group");-my $no_export_method = "can not export anything: no nfs, no smb";-my %exit_codes = reverse(+my $no_export_method = "can't export anything: no nfs, no smb";++my %exit_codes = reverse ( 1 => $non_authorised, 2 => $usage,@@ -109,7 +108,7 @@ $export->update_server; } }-my @mntpoints = grep { $_ } uniq(map { map { $_->{mntpoint} } @$_ } @exports);+my @mntpoints = grep {$_} uniq(map { map { $_->{mntpoint} } @$_ } @exports); print "$_\n" foreach grep { own($_) } @mntpoints;@@ -119,7 +118,7 @@ local ($_) = @_; my $ok = 1; $ok &&= m|^/|;- $ok &&= !m|\Q/../|;+ $ok &&= !m|/\.\./|; $ok &&= !m|[\0\n\r]|; $ok &&= -d $_; $ok &&= own($_);@@ -138,13 +137,12 @@ ################################################################################ package authorisation;-my $F_lock; sub read_conf { my ($exclusive_lock) = @_;- open $F_lock, $authorisation_file; # do not care if it's missing- flock($F_lock, $exclusive_lock ? 2 : 1) or die "can not lock";+ open F_lock, $authorisation_file; # don't care if it's missing+ flock(F_lock, $exclusive_lock ? 2 : 1) or die "can't lock"; my %conf;- foreach (<$F_lock>) {+ foreach (<F_lock>) { s/#.*//; # remove comments s/^\s+//; s/\s+$//;@@ -152,21 +150,26 @@ my ($cmd, $value) = split('=', $_, 2); $conf{$cmd} = $value || warn qq(suspicious line "$_" in $authorisation_file\n); }- # no close $F_lock, keep it locked+ # no close F_lock, keep it locked \%conf } sub check { my ($exclusive_lock) = @_; my $conf = read_conf($exclusive_lock);- if (lc($conf->{FILESHARING}) eq 'no') { ::error($not_enabled);- } elsif (lc($conf->{SHARINGMODE}) eq 'advanced') {+ }+ + if (lc($conf->{SHARINGMODE}) eq 'advanced') { ::error($not_simple_enabled);- } elsif ($conf->{FILESHAREGROUP}) {- $authorisation_group = $conf->{FILESHAREGROUP};- } elsif (lc($conf->{RESTRICT}) eq 'no') {+ }+ + if (lc($conf->{FILESHAREGROUP} ne '')) {+ $authorisation_group = lc($conf->{FILESHAREGROUP});+ } + + if (lc($conf->{RESTRICT}) eq 'no') { # ok, access granted for everybody } else { my @l;@@ -190,7 +193,9 @@ sub add { my ($exports, $mntpoint) = @_;- find($exports, $mntpoint) and die 'add';+ foreach (@$exports) {+ $_->{mntpoint} eq $mntpoint and die 'add';+ } push @$exports, my $e = { mntpoint => $mntpoint }; $e; }@@ -206,16 +211,17 @@ ################################################################################ package nfs_exports;-+use vars qw(@ISA $conf_file $default_options); BEGIN { @ISA = 'exports' }-sub read() {+sub read { my $file = $conf_file;- open(my $F, $file) or return [];+ local *F;+ open F, $file or return [];- my ($prev_raw, $prev_line, @l);+ my ($prev_raw, $prev_line, %e, @l); my $line_nb = 0;- foreach my $raw (<$F>) {+ foreach my $raw (<F>) { $line_nb++; local $_ = $raw; $raw .= "\n" if !/\n/;@@ -250,7 +256,7 @@ $mntpoint =~ s/\\(\d{3})/chr(oct $1)/ge; # not accepting weird characters that would break the output- $mntpoint =~ m/[\0\n\r]/ and die "i will not handle this";+ $mntpoint =~ m/[\0\n\r]/ and die "i won't handle this"; push @l, { mntpoint => $mntpoint, option => $options, raw => $raw_line }; } bless \@l, 'nfs_exports';@@ -267,17 +273,18 @@ $_->{raw} = sprintf("%s %s\n", $mntpoint, $_->{options}); } }- open(my $F, ">$conf_file") or die "can not write $conf_file";- print $F $_->{raw} foreach @$nfs_exports;+ local *F;+ open F, ">$conf_file" or die "can't write $conf_file";+ print F $_->{raw} foreach @$nfs_exports; }-sub update_server() {- if (fork()) {+sub update_server {+ if (fork) { system('/usr/sbin/exportfs', '-r'); if (system('PATH=/bin:/sbin pidof rpc.mountd >/dev/null') != 0 || system('PATH=/bin:/sbin pidof nfsd >/dev/null') != 0) { # trying to start the server...- system('/etc/init.d/portmap start') if system('/etc/init.d/portmap status >/dev/null') != 0;+ system('/etc/init.d/portmap start') if system('/etc/init.d/portmap status') != 0; system('/etc/init.d/nfs', $_) foreach 'stop', 'start'; } exit 0;@@ -287,15 +294,16 @@ ################################################################################ package smb_exports;-+use vars qw(@ISA $conf_file); BEGIN { @ISA = 'exports' }-sub read() {+sub read { my ($s, @l);- open(my $F, $conf_file);+ local *F;+ open F, $conf_file; local $_;- while (<$F>) {- if (/^\s*\[.*\]/ || eof $F) {+ while (<F>) {+ if (/^\s*\[.*\]/ || eof F) { #- first line in the category my ($label) = $s =~ /^\s*\[(.*)\]/; my ($mntpoint) = $s =~ /^\s*path\s*=\s*(.*)/m;@@ -323,8 +331,9 @@ EOF } }- open(my $F, ">$conf_file") or die "can not write $conf_file";- print $F $_->{raw} foreach @$smb_exports;+ local *F;+ open F, ">$conf_file" or die "can't write $conf_file";+ print F $_->{raw} foreach @$smb_exports; } sub add {@@ -357,13 +366,15 @@ if (length($s) > 8 && !grep { /\Q$s/ } @others) { # dropping leading directories when the resulting is still long and meaningful $_ = $s;- } else {- s|(.*)[0-9#\-_!/]|$1|- # inspired by "Christian Brolin" "Long names are doom" on comp.lang.functional- || s|(.+)[AEIOU]|$1|# allButFirstVowels- || s|(.*)(.)\2|$1$2| # adjacentDuplicates- || s|(.*).|$1|; # booh, :'-(+ next; }+ s|(.*)[0-9#\-_!/]|$1| and next;++ # inspired by "Christian Brolin" "Long names are doom" on comp.lang.functional+ s|(.+)[AEIOU]|$1| and next; # allButFirstVowels+ s|(.*)(.)\2|$1$2| and next; # adjacentDuplicates++ s|(.*).|$1|; # booh, :'-( } # 5. remove "/"s still there@@ -380,8 +391,8 @@ last A; } }- $_ or die "can not find a unique name";- # can not find a unique name, dropping the last letter+ $_ or die "can't find a unique name";+ # can't find a unique name, dropping the last letter s|(.*).|$1|; } }@@ -390,19 +401,25 @@ $_; }-sub update_server() {- if (fork()) {- system('/usr/bin/killall -HUP smbd 2>/dev/null');- if (system('PATH=/bin:/sbin pidof smbd >/dev/null') != 0 ||- system('PATH=/bin:/sbin pidof nmbd >/dev/null') != 0) {- # trying to start the server...- my ($f) = grep { -f $_ } map { "/etc/init.d/$_" } 'smb', 'samba', 'rc.samba';- if ($f) {- system($f, $_) foreach 'stop', 'start';- } else {- print STDERR "Error: Can't find the samba init script \n";- }- }- exit 0;+sub update_server {+ if (fork) {+ system('/usr/bin/killall -HUP smbd 2>/dev/null');+ if (system('PATH=/bin:/sbin pidof smbd >/dev/null') != 0 ||+ system('PATH=/bin:/sbin pidof nmbd >/dev/null') != 0) {+# trying to start the server...+ if ( -f '/etc/init.d/smb' ) {+ system('/etc/init.d/smb', $_) foreach 'stop', 'start';+ }+ elsif ( -f '/etc/init.d/samba' ) {+ system('/etc/init.d/samba', $_) foreach 'stop', 'start';+ }+ elsif ( -f '/etc/rc.d/rc.samba' ) {+ system('/etc/rc.d/rc.samba', $_) foreach 'stop', 'start';+ }+ else {+ print STDERR "Error: Can't find the samba init script \n";+ } }+ exit 0;+ } }