X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=scripts%2Fnntpid;fp=scripts%2Fnntpid;h=e0e286a52af99703596667bf8c6e17db026eb1aa;hb=80bfbab221b1c8bbc5d59bee6db92acff7ec4fcd;hp=be961eee6431ca79d979c7750b0a5f4a538341a3;hpb=7fabdc93b382e25ce1d8cc355781e4a56880f335;p=chiark-utils.git diff --git a/scripts/nntpid b/scripts/nntpid index be961ee..e0e286a 100755 --- a/scripts/nntpid +++ b/scripts/nntpid @@ -3,33 +3,18 @@ # Originally by Simon Tatham # Modified by Richard Kettlewell, Colin Watson, Ian Jackson -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"; -$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: $!"; +my $c = cnntp_connect($verbose); +$c->banner_reader(); -S->autoflush(1); +our $code; -&getline; -$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"); +$c->docmd("GROUP misc.misc"); if(@ARGV == 0) { while(<>) { @@ -49,7 +34,7 @@ if(@ARGV == 0) { } } -&docmd("QUIT"); +$c->docmd("QUIT"); close S; sub lookup { @@ -57,12 +42,12 @@ sub lookup { if($mid !~ /\@/ and $mid =~ /^(.*)[: ](\d+)$/) { my ($g, $n) = ($1, $2); - &docmd("GROUP $g"); - &docmd("ARTICLE $n"); + $c->docmd("GROUP $g"); + $c->docmd("ARTICLE $n"); } else { $mid =~ s/.*\.*//; - &docmd("ARTICLE <$mid>"); + $c->docmd("ARTICLE <$mid>"); } my $fh= 'STDOUT'; @@ -74,7 +59,7 @@ sub lookup { } while (1) { - &getline; + ($code,$_) = $c->getline(); s/[\r\n]//g; last if /^\.$/; s/^\.//; @@ -85,59 +70,3 @@ sub lookup { close $fh or die "$? $!"; } } - -sub putline { - my ($line) = @_; - print STDERR ">>> $line\n" if $verbose; - print S "$line\r\n"; -} - -sub getline { - $_ = ; - s/[\r\n]*$//s; - $code = substr($_,0,3); - print STDERR "<<< $_\n" if $verbose; -} - -sub docmd { - my ($cmd) = @_; - for my $n (0,1) { - &putline($cmd); - &getline; - if ($code eq "480") { &auth; } else { last; } - } - $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; - } -}