chiark / gitweb /
nntpid as found in chiark's /usr/local/bin more recently
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 23 Nov 2011 18:36:31 +0000 (18:36 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 23 Nov 2011 18:36:31 +0000 (18:36 +0000)
scripts/nntpid

index efd7a82..be961ee 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/perl
 
-# By Simon Tatham
+# Originally by Simon Tatham
+# Modified by Richard Kettlewell, Colin Watson, Ian Jackson
 
 require 5.002;
 use Socket;
@@ -8,12 +9,6 @@ use FileHandle;
 
 $verbose=1, shift @ARGV if $ARGV[0] eq "-v";
 
-die "usage: nntpid messageid\n" if !defined $ARGV[0];
-$mid = $ARGV[0];
-$mid =~ s/^<//;
-$mid =~ s/>$//;
-$mid = "<$mid>";
-
 $ns=$ENV{'NNTPSERVER'};
 if (!defined $ns or !length $ns) {
   $ns = `cat /etc/nntpserver`;
@@ -35,17 +30,62 @@ $code =~ /^2\d\d/ or die "no initial greeting from server\n";
 &docmd("MODE READER");
 # some servers require a GROUP before an ARTICLE command
 &docmd("GROUP misc.misc");
-&docmd("ARTICLE $mid");
-while (1) {
-  &getline;
-  s/[\r\n]//g;
-  last if /^\.$/;
-  s/^\.//;
-  print STDOUT "$_\n";
+
+if(@ARGV == 0) {
+  while(<>) {
+    s/(^\s+|\s+$)//gs;
+    lookup($_);
+  }
+} else {
+  while (@ARGV) {
+    my $item = shift @ARGV;
+    if($item !~ /[\@:]/ and not defined $group) {
+      # maybe a bare group followed by an article number
+      die unless @ARGV;
+      my $number = shift @ARGV;
+      $item = "$item $number";
+    }
+    lookup($item);
+  }
 }
+
 &docmd("QUIT");
 close S;
 
+sub lookup {
+  my $mid = shift;
+
+  if($mid !~ /\@/ and $mid =~ /^(.*)[: ](\d+)$/) {
+      my ($g, $n) = ($1, $2);
+      &docmd("GROUP $g");
+      &docmd("ARTICLE $n");
+  } else {
+      $mid =~ s/.*\<//;
+      $mid =~ s/\>.*//;
+      &docmd("ARTICLE <$mid>");
+  }
+
+  my $fh= 'STDOUT';
+  if (-t $fh) {
+    my $lesscmd= $ENV{'NNTPID_PAGER'};
+    $lesscmd= 'less' unless defined $lesscmd;
+    open LESS, "|-", 'sh','-c',$lesscmd or die $!;
+    $fh= 'LESS';
+  }
+  
+  while (1) {
+    &getline;
+    s/[\r\n]//g;
+    last if /^\.$/;
+    s/^\.//;
+    print $fh "$_\n";
+  }
+
+  if ($fh ne 'STDOUT') {
+    close $fh or die "$? $!";
+  }
+}
+
 sub putline {
   my ($line) = @_;
   print STDERR ">>> $line\n" if $verbose;
@@ -61,7 +101,7 @@ sub getline {
 
 sub docmd {
   my ($cmd) = @_;
-  while (1) {
+  for my $n (0,1) {
     &putline($cmd);
     &getline;
     if ($code eq "480") { &auth; } else { last; }