3 # Originally by Simon Tatham
4 # Modified by Richard Kettlewell, Colin Watson, Ian Jackson
10 $verbose=1, shift @ARGV if $ARGV[0] eq "-v";
12 $ns=$ENV{'NNTPSERVER'};
13 if (!defined $ns or !length $ns) {
14 $ns = `cat /etc/nntpserver`;
17 $port = (getservbyname("nntp", "tcp"))[2];
19 $proto = getprotobyname("tcp");
20 $paddr = sockaddr_in($port, $ns);
22 socket(S,PF_INET,SOCK_STREAM,$proto) or die "socket: $!";
23 connect(S,$paddr) or die "connect: $!";
28 $code =~ /^2\d\d/ or die "no initial greeting from server\n";
30 &docmd("MODE READER");
31 # some servers require a GROUP before an ARTICLE command
32 &docmd("GROUP misc.misc");
41 my $item = shift @ARGV;
42 if($item !~ /[\@:]/ and not defined $group) {
43 # maybe a bare group followed by an article number
45 my $number = shift @ARGV;
46 $item = "$item $number";
58 if($mid !~ /\@/ and $mid =~ /^(.*)[: ](\d+)$/) {
59 my ($g, $n) = ($1, $2);
65 &docmd("ARTICLE <$mid>");
70 my $lesscmd= $ENV{'NNTPID_PAGER'};
71 $lesscmd= 'less' unless defined $lesscmd;
72 open LESS, "|-", 'sh','-c',$lesscmd or die $!;
84 if ($fh ne 'STDOUT') {
85 close $fh or die "$? $!";
91 print STDERR ">>> $line\n" if $verbose;
98 $code = substr($_,0,3);
99 print STDERR "<<< $_\n" if $verbose;
107 if ($code eq "480") { &auth; } else { last; }
109 $code =~ /^2\d\d/ or die "failed on `$cmd':\n$_\n";
114 if ($ENV{"NNTPAUTH"}) {
115 $auth = $ENV{"NNTPAUTH"};
116 &putline("AUTHINFO GENERIC $auth");
117 pipe AUTHSTDIN, TOAUTH or die "unable to create pipes";
118 pipe FROMAUTH, AUTHSTDOUT or die "unable to create pipes";
121 die "unable to fork for authentication helper";
122 } elsif ($pid == 0) {
124 $ENV{"NNTP_AUTH_FDS"} = "0.1";
125 open STDIN, "<&AUTHSTDIN";
126 open STDOUT, ">&AUTHSTDOUT";
134 &getline; print TOAUTH "$_\n";
141 die "failed authentication\n" unless $? == 0;