#!/usr/bin/perl -w
use strict;
my $destdir="/usr/share/doc/rfc";
my $tempdir="tmp/rfc";
my $url="http://www.rfc-editor.org/rfc";
my $sendmailto="";
$sendmailto=$ENV{USER} if(@ARGV and $ARGV[0] eq "-m" and shift @ARGV);
my $id="unknown";
undef $/;
my ($mail,$template);
if(@ARGV) {
   die "usage: $0 [-m] [<rfc id>]   (defaults to reading an email from stdin)\n" if(1 != @ARGV or not $ARGV[0] =~ /^[1-9]\d*$/s);
   $id=$ARGV[0];
} else {
   $mail=<STDIN>;
   $template=<<'EOD';
--OtherAccess
Content-Type:\s+Message/External-body;\s+access-type="mail-server";\s+server="RFC-INFO@RFC-EDITOR.ORG"

Content-Type: text/plain
Content-ID: <\d+.RFC@RFC-EDITOR.ORG>

RETRIEVE: rfc
DOC-ID: rfc\d+

--OtherAccess
Content-Type:\s+Message/External-body;\s+name="rfc(\d+).txt";\s+site="ftp.isi.edu";\s+access-type="anon-ftp";\s+directory="in-notes"

Content-Type: text/plain
Content-ID: <\d+.RFC@RFC-EDITOR.ORG>
\s+
--OtherAccess--
EOD
   if($mail =~ /$template/s) {
      $id=$1;
      $url="ftp://ftp.isi.edu/in-notes";
   } else {
      $template=<<'EOD';
A new Request for Comments is now available in online RFC libraries.
\n*\s*(?:BCP ?\d+|FYI ?\d+)?\s*
        RFC (\d+)

EOD
      if($mail =~ /$template/s) {
         $id=$1;
      } else {
         &ptooey("regexp",1) 
      }
   }
}
&ptooey("chdir") unless(chdir($tempdir));
&ptooey("lock") unless(link "mail.log","$id.lock");
&ptooey("duplicate",1,1) if(-f "$destdir/rfc$id.txt");
&ptooey("wget") if(system("wget --passive-ftp $url/rfc$id.txt >/dev/null 2>/dev/null"));
&ptooey("size") unless(-s "rfc$id.txt");
&ptooey("chmod") unless(chmod(0644,"rfc$id.txt"));
&ptooey("link") unless(link "rfc$id.txt","$destdir/rfc$id.txt");
&ptooey("unlink") unless(unlink "rfc$id.txt");
&ptooey("unlock") unless(unlink "$id.lock");

sub ptooey {
   my ($action,$noerrorstring,$exitclean)=@_;
   unlink("rfc$id.txt","$id.lock") if($id);
   if($sendmailto) {
      open(STDERR,"|mail -s 'grabrfc($id): $action' $sendmailto");
   }
   print STDERR "grabrfc($id): $action";
   print STDERR ": $!" unless($noerrorstring);
   print STDERR "\n";
   close(STDERR);
   exit 0 if($exitclean);
   exit 111;
}

0;
