2 #$Id: userdb.pl.in,v 1.13 2007/10/07 02:50:45 mrsam Exp $
4 # Copyright 1998 - 1999 Double Precision, Inc. See COPYING for
5 # distribution information.
10 $exec_prefix="@exec_prefix@";
14 die "SYMLINK\n" if -l
$userdb;
17 die "ERROR: Wrong userdb command.\n ($userdb is a symbolic link)\n"
21 print "Usage: $0 [path/.../ | -f file ]name set field=value field=value...\n";
22 print " $0 [path/.../ | -f file ]name unset field field...\n";
23 print " $0 [path/.../ | -f file ]name del\n";
24 print " $0 -show [path/... | -f file ] [name]\n";
42 elsif ( $name =~ /^(.*)\/([^\
/]*)$/ )
51 &usage
unless $userdb =~ /./;
57 &usage
unless $verb =~ /./ && $name =~ /./ && $userdb =~ /./;
60 while (defined ($link= &safe_readlink
($userdb)))
63 $userdb = "" if $link =~ /^\//;
67 $tmpuserdb= $userdb =~ /^(.*)\/([^\
/]*)$/ ?
"$1/.tmp.$2":".tmp.$userdb";
68 $lockuserdb= $userdb =~ /^(.*)\/([^\
/]*)$/ ?
"$1/.lock.$2":".lock.$userdb";
70 if ( $doshow && ! defined $name)
75 die "Invalid name: $name\n"
76 unless $name =~ /^[\@a-zA-Z0-9\.\-\_\:\+]+$/;
79 grep( (/[\|\n]/ && die "Invalid field or value.\n"), @ARGV);
83 open(LOCK
, ">$lockuserdb") or die "Can't open $lockuserdb: $!";
84 flock(LOCK
,LOCK_EX
) || die "Can't lock $lockuserdb: $!";
88 if (open (OLDFILE
, $userdb))
91 die "$userdb: not a file.\n" unless -f _
;
93 while ( defined($_=<OLDFILE
>) )
97 next unless /^([^\t]+)(\t(.*))?$/;
98 ($addr,$vals)=($1,$3);
116 elsif ( $verb eq "set" )
121 $isatty=0 unless -t STDIN
;
125 $mode= (stat $userdb)[2];
126 chmod ($mode & 0777,$tmpuserdb ) if defined $mode;
127 rename $tmpuserdb,$userdb;
129 elsif ( $verb eq "unset" )
131 if ($#ARGV >= 0 && &dodel
)
133 $mode= (stat $userdb)[2];
134 chmod ($mode & 0777 ,$tmpuserdb) if defined $mode;
135 rename ($tmpuserdb,$userdb)
138 elsif ( $verb eq "del" )
140 &usage
unless $#ARGV < 0;
143 $mode= (stat $userdb)[2];
144 chmod ($mode & 0777 ,$tmpuserdb) if defined $mode;
145 rename ($tmpuserdb,$userdb)
161 print "$name.$key: " if $isatty;
162 exit 1 unless defined ($in=<STDIN
>);
163 chop $in if $in =~ /\n$/;
164 die "Invalid value.\n" if $in =~ /[\|\n]/;
168 open (NEWFILE
, ">$tmpuserdb") || die "$!\n";
169 if (open (OLDFILE
, $userdb))
172 die "$userdb: not a file.\n" unless -f _
;
173 while ( defined($_=<OLDFILE
>) )
176 if ( /^([^\t]+)(\t(.*))?$/ && ($1 eq $name))
178 grep( (/^([^=]*)(=.*)?$/,
179 $FIELDS{$1}="$2"), split(/\|/, $3));
180 while ( defined ($key=shift @ARGV))
182 $key =~ /^([^=]*)(=.*)?$/;
186 grep ( $name="$name$_$FIELDS{$_}|",
189 print NEWFILE
"$name\n" || die "$!\n";
192 print NEWFILE
|| die "$!\n";
195 close (NEWFILE
) || die "$!\n";
198 print NEWFILE
"$_\n" || die "$!\n";
204 grep ( $name="$name$_|", @ARGV );
206 print NEWFILE
"$name\n" || die "$!\n";
207 close (NEWFILE
) || die "$!\n";
213 open (NEWFILE
, ">$tmpuserdb") || die "$!\n";
214 if (open (OLDFILE
, $userdb))
217 die "$userdb: not a file.\n" unless -f _
;
218 while ( defined($_=<OLDFILE
>) )
221 if ( /^([^\t]+)(\t(.*))?$/ && ($1 eq $name))
225 grep( (/^([^=]*)(=.*)?$/,
228 grep( delete $FIELDS{$_}, @ARGV);
231 grep ( $name="$name$_$FIELDS{$_}|",
235 print NEWFILE
"$name" || die "$!\n";
239 print NEWFILE
|| die "$!\n";
242 close (NEWFILE
) || die "$!\n";
245 print NEWFILE
"$_\n" || die "$!\n";