13 our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
15 # set the version for version checking
19 @EXPORT = qw(cnntp_connect);
20 %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
26 sub cnntp_connect ($) {
29 my $ns=$ENV{'NNTPSERVER'};
30 if (!defined $ns or !length $ns) {
31 $ns = `cat /etc/nntpserver`;
34 my $port = (getservbyname("nntp", "tcp"))[2];
36 my $proto = getprotobyname("tcp");
37 my $paddr = sockaddr_in($port, $ns);
39 my $sock = new IO::Handle;
40 socket($sock,PF_INET,SOCK_STREAM,$proto) or die "socket: $!";
41 connect($sock,$paddr) or die "connect: $!";
45 return bless { S => $sock, V => $verbose };
48 sub banner_reader ($) {
50 my ($code,$l) = $c->getline();
51 $code =~ /^2\d\d/ or die "no initial greeting from server\n";
52 $c->docmd("MODE READER");
64 print $v ">>> $line\n" if $v;
78 my $l = $c->getline_raw();
80 my $code = substr($l,0,3);
81 print $v "<<< $l\n" if $v;
86 my ($c,$cmd,$nocheck) = @_;
90 ($code,$l) = $c->getline();
91 if ($code eq "480") { $c->auth(); } else { last; }
94 $code =~ /^2\d\d/ or die "failed on `$cmd':\n$l\n";
102 return if $c->{Authed}++;
103 my $auth = $ENV{"NNTPAUTH"};
105 $c->putline("AUTHINFO GENERIC $auth");
106 pipe AUTHSTDIN, TOAUTH or die "unable to create pipes";
107 pipe FROMAUTH, AUTHSTDOUT or die "unable to create pipes";
111 die "unable to fork for authentication helper";
112 } elsif ($pid == 0) {
114 $c->{V} = undef if $c->{V} eq 'STDOUT';
115 $ENV{"NNTP_AUTH_FDS"} = "0.1";
116 open STDIN, "<&AUTHSTDIN";
117 open STDOUT, ">&AUTHSTDOUT";
126 my ($code,$l) = $c->getline(); print TOAUTH "$l\n";
130 ($code,$l) = $c->getline();
133 die "failed authentication\n" unless $? == 0;