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

WEB邮件程序

开发平台:

C/C++

  1. #! @PERL@
  2. #
  3. # Create userdb database
  4. #
  5. # Usage: makeuserdb
  6. #
  7. # $Id: makeuserdb.in,v 1.6 2000/02/23 05:11:13 mrsam Exp $
  8. #
  9. # Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  10. # distribution information.
  11. use Fcntl ':flock';
  12. $prefix="@prefix@";
  13. $exec_prefix="@exec_prefix@";
  14. $bindir="@bindir@";
  15. $dbfile="@userdb@";
  16. $datfile="@userdb@.dat";
  17. $lockfile="@userdb@.lock";
  18. $shadowfile="@userdb@shadow.dat";
  19. $tmpdir="@tmpdir@";
  20. $tmpdatfile="$tmpdir/userdb.tmp";
  21. $tmpshadowfile="$tmpdir/userdbshadow.tmp";
  22. $makedat="@makedat@";
  23. $mode=(stat($dbfile))[2];
  24. die "$dbfile: not found.n" unless defined $mode;
  25. die "$dbfile: MAY NOT HAVE GROUP OR WORLD PERMISSIONS!!n"
  26. if ( $mode & 077);
  27. eval {
  28. die "SYMLINKn" if -l $dbfile;
  29. };
  30. die "ERROR: Wrong makeuserdb command.n       ($dbfile is a symbolic link)n"
  31. if $@ eq "SYMLINKn";
  32. eval {
  33. die "SYMLINKn" if -l $datfile;
  34. };
  35. die "ERROR: Wrong makeuserdb command.n       ($datfile is a symbolic link)n"
  36. if $@ eq "SYMLINKn";
  37. eval {
  38. die "SYMLINKn" if -l $shadowfile;
  39. };
  40. die "ERROR: Wrong makeuserdb command.n       ($shadowfile is a symbolic link)n"
  41. if $@ eq "SYMLINKn";
  42. umask (022);
  43. open(LOCK, ">$lockfile") or die "Can't open $lockfile: $!";
  44. flock(LOCK,LOCK_EX) || die "Can't lock $lockfile: $!";
  45. open (DBPIPE, "| ${makedat} - $tmpdatfile $datfile") || die "$!n";
  46. umask (066);
  47. open (SHADOWPIPE, "| ${makedat} - $tmpshadowfile $shadowfile")
  48. || die "$!n";
  49. eval {
  50. if ( -d $dbfile )
  51. {
  52. my (@dirs);
  53. my (@files);
  54. push @dirs, $dbfile;
  55. while ( $#dirs >= 0 )
  56. {
  57. $dir=shift @dirs;
  58. opendir(DIR, $dir) || die "$!n";
  59. while ( defined($filename=readdir(DIR)))
  60. {
  61. next if $filename =~ /^./;
  62. if ( -d "$dir/$filename" )
  63. {
  64. push @dirs, "$dir/$filename";
  65. }
  66. else
  67. {
  68. push @files, "$dir/$filename";
  69. }
  70. }
  71. closedir(DIR);
  72. }
  73. while (defined ($filename=shift @files))
  74. {
  75. &do_file( $filename );
  76. }
  77. }
  78. else
  79. {
  80. &do_file( $dbfile );
  81. }
  82. print DBPIPE ".n" || die "$!n";
  83. print SHADOWPIPE ".n" || die "$!n";
  84. } ;
  85. $err=$@;
  86. close(DBPIPE) || die "$!n";
  87. exit (1) if $?;
  88. close(SHADOWPIPE) || die "$!n";
  89. exit (1) if $?;
  90. if ($err)
  91. {
  92. print $err;
  93. exit (1);
  94. }
  95. exit (0);
  96. sub do_file {
  97. my ($filename)=@_;
  98. my ($addr, $fields);
  99. my (@nonshadow, @shadow);
  100. open (F, $filename) || die "$!n";
  101. while (<F>)
  102. {
  103. if ( /^[n#]/ || ! /^([^t]*)t(.*)/ )
  104. {
  105. print DBPIPE;
  106. print SHADOWPIPE;
  107. next;
  108. }
  109. ($addr,$fields)=($1,$2);
  110. undef @nonshadow;
  111. undef @shadow;
  112. foreach ( split (/|/, $fields ) )
  113. {
  114. if ( /^[^=]*pw=/ )
  115. {
  116. push @shadow, $_;
  117. }
  118. else
  119. {
  120. push @nonshadow, $_;
  121. }
  122. }
  123. ( print DBPIPE "$addrt" . join("|", @nonshadow) . "n"
  124. || die "$!n" ) if $#nonshadow >= 0;
  125. ( print SHADOWPIPE "$addrt" . join("|", @shadow) . "n"
  126. || die "$!n" ) if $#shadow >= 0;
  127. }
  128. }