X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=scripts%2Fnntpid;h=0de52a5c60bc9dca0c8086bb2d0a00789d19768b;hb=dfadcc0b3460fc3e2161a3c580039875688627f5;hp=efd7a826bdbfb049dfb9bf409ac2a5e9ba76b123;hpb=a1b737d1580fe8ad5aea50e003c7d0334cf6b663;p=chiark-utils.git diff --git a/scripts/nntpid b/scripts/nntpid index efd7a82..0de52a5 100755 --- a/scripts/nntpid +++ b/scripts/nntpid @@ -1,103 +1,95 @@ #!/usr/bin/perl -# By Simon Tatham +# Originally by Simon Tatham +# Modified by Richard Kettlewell, Colin Watson, Ian Jackson +# +# Copyright -2011 Simon Tatham +# Copyright 2011 Richard Kettlewell +# Copyright 2011 Colin Watson +# Copyright 2011 Ian Jackson +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# SOFTWARE IN THE PUBLIC INTEREST, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. -require 5.002; -use Socket; -use FileHandle; +use ChiarkNNTP; -$verbose=1, shift @ARGV if $ARGV[0] eq "-v"; +our $verbose; +($verbose='STDERR', shift @ARGV) if $ARGV[0] eq "-v"; -die "usage: nntpid messageid\n" if !defined $ARGV[0]; -$mid = $ARGV[0]; -$mid =~ s/^$//; -$mid = "<$mid>"; +my $c = cnntp_connect($verbose); +$c->banner_reader(); -$ns=$ENV{'NNTPSERVER'}; -if (!defined $ns or !length $ns) { - $ns = `cat /etc/nntpserver`; - chomp($ns); -} -$port = (getservbyname("nntp", "tcp"))[2]; -$ns = inet_aton($ns); -$proto = getprotobyname("tcp"); -$paddr = sockaddr_in($port, $ns); - -socket(S,PF_INET,SOCK_STREAM,$proto) or die "socket: $!"; -connect(S,$paddr) or die "connect: $!"; - -S->autoflush(1); - -&getline; -$code =~ /^2\d\d/ or die "no initial greeting from server\n"; +our $code; -&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"; +$c->docmd("GROUP misc.misc"); + +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"); + +$c->docmd("QUIT"); close S; -sub putline { - my ($line) = @_; - print STDERR ">>> $line\n" if $verbose; - print S "$line\r\n"; -} +sub lookup { + my $mid = shift; -sub getline { - $_ = ; - s/[\r\n]*$//s; - $code = substr($_,0,3); - print STDERR "<<< $_\n" if $verbose; -} + if($mid !~ /\@/ and $mid =~ /^(.*)[: ](\d+)$/) { + my ($g, $n) = ($1, $2); + $c->docmd("GROUP $g"); + $c->docmd("ARTICLE $n"); + } else { + $mid =~ s/.*\.*//; + $c->docmd("ARTICLE <$mid>"); + } -sub docmd { - my ($cmd) = @_; + 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) { - &putline($cmd); - &getline; - if ($code eq "480") { &auth; } else { last; } + ($code,$_) = $c->getline(); + s/[\r\n]//g; + last if /^\.$/; + s/^\.//; + print $fh "$_\n"; } - $code =~ /^2\d\d/ or die "failed on `$cmd':\n$_\n"; -} -sub auth { - # Authentication. - if ($ENV{"NNTPAUTH"}) { - $auth = $ENV{"NNTPAUTH"}; - &putline("AUTHINFO GENERIC $auth"); - pipe AUTHSTDIN, TOAUTH or die "unable to create pipes"; - pipe FROMAUTH, AUTHSTDOUT or die "unable to create pipes"; - $pid = fork; - if (!defined $pid) { - die "unable to fork for authentication helper"; - } elsif ($pid == 0) { - # we are child - $ENV{"NNTP_AUTH_FDS"} = "0.1"; - open STDIN, "<&AUTHSTDIN"; - open STDOUT, ">&AUTHSTDOUT"; - close S; - exec $auth; - } - # we are parent - close AUTHSTDIN; - close AUTHSTDOUT; - autoflush TOAUTH 1; - &getline; print TOAUTH "$_\n"; - while () { - s/[\r\n]*$//s; - &putline($_); - &getline; - print TOAUTH "$_\n"; - } - die "failed authentication\n" unless $? == 0; + if ($fh ne 'STDOUT') { + close $fh or die "$? $!"; } }