userdb.pl.in
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:5k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. #! @PERL@
  2. #$Id: userdb.pl.in,v 1.11 2000/05/07 17:36:31 mrsam Exp $
  3. #
  4. # Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  5. # distribution information.
  6. use Fcntl ':flock';
  7. $prefix="@prefix@";
  8. $exec_prefix="@exec_prefix@";
  9. $userdb="@userdb@";
  10. eval {
  11. die "SYMLINKn" if -l $userdb;
  12. };
  13. die "ERROR: Wrong userdb command.n       ($userdb is a symbolic link)n"
  14. if $@ eq "SYMLINKn";
  15. sub usage {
  16. print "Usage: $0 [path/.../ | -f file ]name set field=value field=value...n";
  17. print "       $0 [path/.../ | -f file ]name unset field field...n";
  18. print "       $0 [path/.../ | -f file ]name deln";
  19. print "       $0 -show [path/... | -f file ] [name]n";
  20. exit 1;
  21. }
  22. $name=shift @ARGV;
  23. $doshow=0;
  24. if ($name eq "-show")
  25. {
  26. $doshow=1;
  27. $name=shift @ARGV;
  28. }
  29. if ($name eq "-f")
  30. {
  31. $userdb=shift @ARGV;
  32. $name=shift @ARGV;
  33. }
  34. elsif ( $name =~ /^(.*)/([^/]*)$/ )
  35. {
  36. $userdb="$userdb/$1";
  37. $name=$2;
  38. }
  39. if ($doshow)
  40. {
  41. &usage unless $userdb =~ /./;
  42. }
  43. else
  44. {
  45. $verb=shift @ARGV;
  46. &usage unless $verb =~ /./ && $name =~ /./ && $userdb =~ /./;
  47. }
  48. while (defined ($link= &safe_readlink($userdb)))
  49. {
  50. $userdb .= "/";
  51. $userdb = "" if $link =~ /^//;
  52. $userdb .= $link;
  53. }
  54. $tmpuserdb= $userdb =~ /^(.*)/([^/]*)$/ ? "$1/.tmp.$2":".tmp.$userdb";
  55. $lockuserdb= $userdb =~ /^(.*)/([^/]*)$/ ? "$1/.lock.$2":".lock.$userdb";
  56. if ( $doshow && ! defined $name)
  57. {
  58. }
  59. else
  60. {
  61. die "Invalid name: $namen"
  62. unless $name =~ /^[@a-zA-Z0-9.-]+$/;
  63. }
  64. grep( (/[|n]/ && die "Invalid field or value.n"), @ARGV);
  65. umask(066);
  66. open(LOCK, ">$lockuserdb") or die "Can't open $lockuserdb: $!";
  67. flock(LOCK,LOCK_EX) || die "Can't lock $lockuserdb: $!";
  68. if ( $doshow )
  69. {
  70. if (open (OLDFILE, $userdb))
  71. {
  72. stat(OLDFILE);
  73. die "$userdb: not a file.n" unless -f _;
  74. while ( defined($_=<OLDFILE>) )
  75. {
  76. chop if /n$/;
  77. next if /^#/;
  78. next unless /^([^t]+)(t(.*))?$/;
  79. ($addr,$vals)=($1,$3);
  80. if (defined $name)
  81. {
  82. if ($name eq $addr)
  83. {
  84. $vals =~ s/|/n/g;
  85. print "$valsn";
  86. last;
  87. }
  88. }
  89. else
  90. {
  91. print "$addrn";
  92. }
  93. }
  94. }
  95. close (OLDFILE);
  96. }
  97. elsif ( $verb eq "set" )
  98. {
  99. $isatty=1;
  100. eval {
  101. $isatty=0 unless -t STDIN;
  102. } ;
  103. &doadd;
  104. $mode= (stat $userdb)[2];
  105. chmod ($mode & 0777,$tmpuserdb ) if defined $mode;
  106. rename $tmpuserdb,$userdb;
  107. }
  108. elsif ( $verb eq "unset" )
  109. {
  110. if ($#ARGV >= 0 && &dodel)
  111. {
  112. $mode= (stat $userdb)[2];
  113. chmod ($mode & 0777 ,$tmpuserdb) if defined $mode;
  114. rename ($tmpuserdb,$userdb)
  115. }
  116. }
  117. elsif ( $verb eq "del" )
  118. {
  119. &usage unless $#ARGV < 0;
  120. if (&dodel)
  121. {
  122. $mode= (stat $userdb)[2];
  123. chmod ($mode & 0777 ,$tmpuserdb) if defined $mode;
  124. rename ($tmpuserdb,$userdb)
  125. }
  126. }
  127. else
  128. {
  129. &usage;
  130. }
  131. exit 0;
  132. sub doadd {
  133. my (%FIELDS);
  134. my ($key, $in);
  135. foreach $key (@ARGV)
  136. {
  137. next if $key =~ /=/;
  138. print "$name.$key: " if $isatty;
  139. exit 1 unless defined ($in=<STDIN>);
  140. chop $in if $in =~ /n$/;
  141. die "Invalid value.n" if $in =~ /[|n]/;
  142. $key = "$key=$in";
  143. }
  144. open (NEWFILE, ">$tmpuserdb") || die "$!n";
  145. if (open (OLDFILE, $userdb))
  146. {
  147. stat(OLDFILE);
  148. die "$userdb: not a file.n" unless -f _;
  149. while ( defined($_=<OLDFILE>) )
  150. {
  151. chop if /n$/;
  152. if ( /^([^t]+)(t(.*))?$/ && ($1 eq $name))
  153. {
  154. grep( (/^([^=]*)(=.*)?$/,
  155. $FIELDS{$1}="$2"), split(/|/, $3));
  156. while ( defined ($key=shift @ARGV))
  157. {
  158. $key =~ /^([^=]*)(=.*)?$/;
  159. $FIELDS{$1}="$2";
  160. }
  161. $name="$namet";
  162. grep ( $name="$name$_$FIELDS{$_}|",
  163. keys %FIELDS);
  164. chop $name;
  165. print NEWFILE "$namen" || die "$!n";
  166. while (<OLDFILE>)
  167. {
  168. print NEWFILE || die "$!n";
  169. }
  170. close (OLDFILE);
  171. close (NEWFILE) || die "$!n";
  172. return;
  173. }
  174. print NEWFILE "$_n" || die "$!n";
  175. }
  176. close (OLDFILE);
  177. }
  178. $name="$namet";
  179. grep ( $name="$name$_|", @ARGV );
  180. chop $name;
  181. print NEWFILE "$namen" || die "$!n";
  182. close (NEWFILE) || die "$!n";
  183. }
  184. sub dodel {
  185. my (%FIELDS);
  186. open (NEWFILE, ">$tmpuserdb") || die "$!n";
  187. if (open (OLDFILE, $userdb))
  188. {
  189. stat(OLDFILE);
  190. die "$userdb: not a file.n" unless -f _;
  191. while ( defined($_=<OLDFILE>) )
  192. {
  193. chop if /n$/;
  194. if ( /^([^t]+)(t(.*))?$/ && ($1 eq $name))
  195. {
  196. if ($#ARGV >= 0)
  197. {
  198. grep( (/^([^=]*)(=.*)?$/,
  199. $FIELDS{$1}=$2),
  200. split(/|/, $3));
  201. grep( delete $FIELDS{$_}, @ARGV);
  202. $name="$namet";
  203. grep ( $name="$name$_$FIELDS{$_}|",
  204. keys %FIELDS);
  205. chop $name;
  206. $name="$namen";
  207. print NEWFILE "$name" || die "$!n";
  208. }
  209. while (<OLDFILE>)
  210. {
  211. print NEWFILE || die "$!n";
  212. }
  213. close (OLDFILE);
  214. close (NEWFILE) || die "$!n";
  215. return (1);
  216. }
  217. print NEWFILE "$_n" || die "$!n";
  218. }
  219. close (OLDFILE);
  220. }
  221. unlink "$tmpuserdb";
  222. return (0);
  223. }
  224. sub safe_readlink {
  225. my ($l)=@_;
  226. my ($err,$link);
  227. eval {
  228. $link=readlink($l);
  229. } ;
  230. $link=undef if $@;
  231. return $link;
  232. }