3 # Copyright 1998 - 1999 Double Precision, Inc. See COPYING for
4 # distribution information.
9 $exec_prefix="@exec_prefix@";
13 die "SYMLINK\n" if -l
$userdb;
16 die "ERROR: Wrong userdb command.\n ($userdb is a symbolic link)\n"
20 print "Usage: $0 [path/.../ | -f file ]name set field=value field=value...\n";
21 print " $0 [path/.../ | -f file ]name unset field field...\n";
22 print " $0 [path/.../ | -f file ]name del\n";
23 print " $0 -show [path/... | -f file ] [name]\n";
41 elsif ( $name =~ /^(.*)\/([^\
/]*)$/ )
50 &usage
unless $userdb =~ /./;
56 &usage
unless $verb =~ /./ && $name =~ /./ && $userdb =~ /./;
59 while (defined ($link= &safe_readlink
($userdb)))
62 $userdb = "" if $link =~ /^\//;
66 $tmpuserdb= $userdb =~ /^(.*)\/([^\
/]*)$/ ?
"$1/.tmp.$2":".tmp.$userdb";
67 $lockuserdb= $userdb =~ /^(.*)\/([^\
/]*)$/ ?
"$1/.lock.$2":".lock.$userdb";
69 if ( $doshow && ! defined $name)
74 die "Invalid name: $name\n"
75 unless $name =~ /^[\@a-zA-Z0-9\.\-\_\:\+]+$/;
78 grep( (/[\|\n]/ && die "Invalid field or value.\n"), @ARGV);
82 open(LOCK
, ">$lockuserdb") or die "Can't open $lockuserdb: $!";
83 flock(LOCK
,LOCK_EX
) || die "Can't lock $lockuserdb: $!";
87 if (open (OLDFILE
, $userdb))
90 die "$userdb: not a file.\n" unless -f _
;
92 while ( defined($_=<OLDFILE
>) )
96 next unless /^([^\t]+)(\t(.*))?$/;
97 ($addr,$vals)=($1,$3);
115 elsif ( $verb eq "set" )
120 $isatty=0 unless -t STDIN
;
124 $mode= (stat $userdb)[2];
125 chmod ($mode & 0777,$tmpuserdb ) if defined $mode;
126 rename $tmpuserdb,$userdb;
128 elsif ( $verb eq "unset" )
130 if ($#ARGV >= 0 && &dodel
)
132 $mode= (stat $userdb)[2];
133 chmod ($mode & 0777 ,$tmpuserdb) if defined $mode;
134 rename ($tmpuserdb,$userdb)
137 elsif ( $verb eq "del" )
139 &usage
unless $#ARGV < 0;
142 $mode= (stat $userdb)[2];
143 chmod ($mode & 0777 ,$tmpuserdb) if defined $mode;
144 rename ($tmpuserdb,$userdb)
160 print "$name.$key: " if $isatty;
161 exit 1 unless defined ($in=<STDIN
>);
162 chop $in if $in =~ /\n$/;
163 die "Invalid value.\n" if $in =~ /[\|\n]/;
167 open (NEWFILE
, ">$tmpuserdb") || die "$!\n";
168 if (open (OLDFILE
, $userdb))
171 die "$userdb: not a file.\n" unless -f _
;
172 while ( defined($_=<OLDFILE
>) )
175 if ( /^([^\t]+)(\t(.*))?$/ && ($1 eq $name))
177 grep( (/^([^=]*)(=.*)?$/,
178 $FIELDS{$1}="$2"), split(/\|/, $3));
179 while ( defined ($key=shift @ARGV))
181 $key =~ /^([^=]*)(=.*)?$/;
185 grep ( $name="$name$_$FIELDS{$_}|",
188 print NEWFILE
"$name\n" || die "$!\n";
191 print NEWFILE
|| die "$!\n";
194 close (NEWFILE
) || die "$!\n";
197 print NEWFILE
"$_\n" || die "$!\n";
203 grep ( $name="$name$_|", @ARGV );
205 print NEWFILE
"$name\n" || die "$!\n";
206 close (NEWFILE
) || die "$!\n";
212 open (NEWFILE
, ">$tmpuserdb") || die "$!\n";
213 if (open (OLDFILE
, $userdb))
216 die "$userdb: not a file.\n" unless -f _
;
217 while ( defined($_=<OLDFILE
>) )
220 if ( /^([^\t]+)(\t(.*))?$/ && ($1 eq $name))
224 grep( (/^([^=]*)(=.*)?$/,
227 grep( delete $FIELDS{$_}, @ARGV);
230 grep ( $name="$name$_$FIELDS{$_}|",
234 print NEWFILE
"$name" || die "$!\n";
238 print NEWFILE
|| die "$!\n";
241 close (NEWFILE
) || die "$!\n";
244 print NEWFILE
"$_\n" || die "$!\n";