From: Ian Jackson Date: Wed, 23 Nov 2011 18:36:31 +0000 (+0000) Subject: nntpid as found in chiark's /usr/local/bin more recently X-Git-Tag: debian/4.1.31~19^2~8 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;ds=sidebyside;h=7fabdc93b382e25ce1d8cc355781e4a56880f335;p=chiark-utils.git nntpid as found in chiark's /usr/local/bin more recently --- diff --git a/scripts/nntpid b/scripts/nntpid index efd7a82..be961ee 100755 --- a/scripts/nntpid +++ b/scripts/nntpid @@ -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 = "<$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/.*\.*//; + &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; }