#!/usr/local/bin/perl if ($domain = shift @ARGV) { $server = "news.$domain"; $newsrc = "$ENV{'HOME'}/.$server"; } else { $server = "news"; $newsrc = "$ENV{'HOME'}/.newsrc"; } if ($port = shift @ARGV) { $server = "localhost"; } else { $port=119; } $others="$ENV{'HOME'}/.suck/suckothermsgs"; $quit="QUIT\n"; open(STDIN, $others); while () { s/^/ARTICLE /; $articles .= $_; } open(STDIN, $newsrc) || die "$newsrc: $!\n"; while() { if (($group, $seen) = /^([a-z]\S+[^:!]):?\s+(\d+)/) { $seen{$group}=$seen; $groups.="GROUP $group\n"; } else { $comments.=$_; } } $groups || die "No groups subscribed at $server\n"; open(STDIN,"echo '$groups$quit' | socket -c $server $port |") || die; while() { /^2/ || die $_; ($first, $last, $group) = /^211\s+\d+\s+(\d+)\s+(\d+)\s+(\S+)/; next unless $seen = $seen{$group}; $seen = $last + $seen if $seen < 0; warn $_ && next if $seen < $first || $seen > $last; next if $seen == $last; $articles .= "GROUP $group\n"; while ($seen < $last) { $articles .= "ARTICLE " . ++$seen . "\n"; } $seen{$group} = $last; } $articles || die "No new articles at $server\n"; open (STDIN, "echo '$articles$quit' | socket -c $server $port |") || die; while () { if (/^220/) { open (STDOUT, "|procmail") || die; print "From news ".localtime(time)."\n"; while () { last if /^[.]$/; s/^[.][.]/./; print || die; } close STDOUT || die; } } close STDIN || die; rename ($newsrc, "$newsrc~"); rename ($others, "$others~"); open (STDOUT, ">$newsrc") || die; foreach (sort keys %seen) { print "$_ $seen{$_}\n"; } print "$comments";