mailfs.in 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #! @PERL@ -w
  2. use bytes;
  3. # MC extfs for (possibly compressed) Berkeley style mailbox files
  4. # Peter Daum <gator@cs.tu-berlin.de> (Jan 1998, mc-4.1.24)
  5. $zcat="zcat"; # gunzip to stdout
  6. $bzcat="bzip2 -dc"; # bunzip2 to stdout
  7. $file="file"; # "file" command
  8. $TZ='GMT'; # default timezone (for Date module)
  9. if (eval "require Date::Manip") {
  10. import Date::Manip;
  11. $parse_date=
  12. sub {
  13. return UnixDate($_[0], "%l"); # "ls -l" format
  14. }
  15. } elsif (eval "require Date::Parse") {
  16. import Date::Parse;
  17. $parse_date=
  18. sub {
  19. local $_ =localtime(str2time($_[0],$TZ));
  20. s/^... (.+) (\d\d:\d\d):\d\d (\d\d\d\d)$/$1 $3 $2/;
  21. return $_;
  22. }
  23. } else { # use "light" version
  24. $parse_date= sub {
  25. # assumes something like: Mon, 5 Jan 1998 16:08:19 +0200 (GMT+0200)
  26. # if you have mails with another date format, add it here
  27. if (/(\d\d?) ([A-Z][a-z][a-z]) (\d\d\d\d) (\d\d?:\d\d)/) {
  28. return "$2 $1 $3 $4";
  29. }
  30. # Y2K bug.
  31. # Date: Mon, 27 Mar 100 16:30:47 +0000 (GMT)
  32. if (/(\d\d?) ([A-Z][a-z][a-z]) (1?\d\d) (\d\d?:\d\d)/) {
  33. $correct_year = 1900 + $3;
  34. if ($correct_year < 1970) {
  35. $correct_year += 100;
  36. }
  37. return "$2 $1 $correct_year $4";
  38. }
  39. # AOLMail(SM).
  40. # Date: Sat Jul 01 10:06:06 2000
  41. if (/([A-Z][a-z][a-z]) (\d\d?) (\d\d?:\d\d)(:\d\d)? (\d\d\d\d)/) {
  42. return "$1 $2 $5 $3";
  43. }
  44. # Fallback
  45. return localtime(time);
  46. }
  47. }
  48. sub process_header {
  49. while (<IN>) {
  50. $size+=length;
  51. s/\r$//;
  52. last if /^$/;
  53. die "unexpected EOF\n" if eof;
  54. if (/^Date:\s(.*)$/) {
  55. $date=&$parse_date($1);
  56. } elsif (/^Subject:\s(.*)$/) {
  57. $subj=lc($1);
  58. $subj=~ s/^(re:\s?)+//gi; # no leading Re:
  59. $subj=~ tr/a-zA-Z0-9//cd; # strip all "special" characters
  60. } elsif (/^From:\s.*?(\w+)\@/) {
  61. $from=$1;
  62. } elsif (/^To:\s.*?(\w+)\@/) {
  63. $to=lc($1);
  64. }
  65. }
  66. }
  67. sub print_dir_line {
  68. $from=$to if ($from eq $user); # otherwise, it would look pretty boring
  69. $date=localtime(time) if (!defined $date);
  70. printf "-r-------- 1 $< $< %d %s %3.3d_%.25s\n",
  71. $size, $date, $msg_nr, "${from}_${subj}";
  72. }
  73. sub mailfs_list {
  74. my $blank = 1;
  75. $user=$ENV{USER}||getlogin||getpwuid($<) || "nobody";
  76. while(<IN>) {
  77. s/\r$//;
  78. if($blank && /^From /) { # Start of header
  79. print_dir_line unless (!$msg_nr);
  80. $size=length;
  81. $msg_nr++;
  82. ($from,$to,$subj,$date)=("none","none","none", "01-01-80");
  83. process_header;
  84. $line=$blank=0;
  85. } else {
  86. $size+=length;
  87. $line++;
  88. $blank= /^$/;
  89. }
  90. }
  91. print_dir_line unless (!$msg_nr);
  92. exit 0;
  93. }
  94. sub mailfs_copyout {
  95. my($source,$dest)=@_;
  96. exit 1 unless (open STDOUT, ">$dest");
  97. ($nr)= ($source =~ /^(\d+)/); # extract message number from "filename"
  98. my $blank = 1;
  99. while(<IN>) {
  100. s/\r$//;
  101. if($blank && /^From /) {
  102. $msg_nr++;
  103. exit(0) if ($msg_nr > $nr);
  104. $blank= 0;
  105. } else {
  106. $blank= /^$/;
  107. }
  108. print if ($msg_nr == $nr);
  109. }
  110. }
  111. # main {
  112. exit 1 unless ($#ARGV >= 1);
  113. $msg_nr=0;
  114. $cmd=shift;
  115. $mbox_name=shift;
  116. $_=`$file $mbox_name`;
  117. if (/gzip/) {
  118. exit 1 unless (open IN, "$zcat $mbox_name|");
  119. } elsif (/bzip/) {
  120. exit 1 unless (open IN, "$bzcat $mbox_name|");
  121. } else {
  122. exit 1 unless (open IN, "<$mbox_name");
  123. }
  124. umask 077;
  125. if($cmd eq "list") { &mailfs_list; exit 0; }
  126. elsif($cmd eq "copyout") { &mailfs_copyout(@ARGV); exit 0; }
  127. exit 1;