#! /usr/bin/perl
require '/usr/local/news/lib/innshellvars.pl';

# news to mail channel backend
#
# INN gives us
#	@token@ addrs
# for each article that needs to be mailed.  We invoke sm on the
# localhost to get the actual article and stuff
# it down sendmail's throat.
# 
# This program expect to find a file that maps listname to listaddrs,
#	@prefix@/etc/news2mail.cf
# which must contain address mapping pairs such as
#
#	big-red-ants@ucsd.edu	big-red-ants-digest@ucsd.edu		
#
# where the first token is the name fed to us from INN, and which is
# also placed in the To: header of the outgoing mail.  It's probably
# the subscriber's list submittal address so that replies go to the
# right place.  The second token is the actual address sendmail ships
# the article to.
#
# In the INN newsfeeds file, you need to have a channel feed:
#	n2m!:!*:Tc,Ac,Wn*:@prefix@/bin/news2mail
# and a site for each of the various mailing lists you're feeding,
# such as
#	big-red-ants@ucsd.edu:rec.pets.redants.*:Tm:n2m!
#
# Error handling is nearly nonexistent.
#
#	- Brian Kantor, UCSD Aug 1998

require 5.006;

use FileHandle;
use Sys::Syslog;
use strict;

my $cfFile = $inn::pathetc . "/news2mail.cf" ;
my $sendmail = $inn::mta ;
my $sm = $inn::pathbin . "/sm" ;
my %maddr = ();

#
# the syslog calls are here but don't work on my system
#
openlog('news2mail', 'pid', 'mail');

syslog('info', 'begin');

#
# load the list names and their mail addresses from cf file
# #comments and blank lines are ignored
#
unless (open CF, "< $cfFile") {
		syslog('notice', 'CF open failed %m');
		die "bad CF";
		}

while ( <CF> ) {
	next if /^#|^\s+$/;
	my ( $ln, $ma ) = split /\s+/;
	$maddr{ $ln } = $ma;
	}
close CF;

#
# for each incoming line from the INN channel
#
while ( <STDIN> ) {
	chomp;

	syslog('info', $_);

	my ($token, $lnames) = split /\s+/, $_, 2;
	my @addrs = split /\s+/, $lnames;

	my @good = grep {  defined $maddr{$_} } @addrs;
	my @bad  = grep { !defined $maddr{$_} } @addrs;

	if (! @good) {
		syslog('notice', "unknown listname $_");
		next;
		}

	if (@bad) {
		syslog('info', 'skipping unknown lists: ', join(' ', @bad));
		}
	mailto($token, $lnames, @maddr{@good});
	}

syslog ("info", "end") ;

exit 0;

sub mailto {
	my($t, $l, @a) = @_ ;

	my $sendmail = $inn::mta ;
	$sendmail =~ s!\s*%s!! ;
	my @command = (split (' ', $sendmail), '-ee', '-fnews', '-odq', @a);
#	@command[0] = '/usr/local/bin/debug';

	syslog('info', join(' ', @command));

	unless (open(SM, '|-', @command)) {
		syslog('notice', join(' ', '|', @command), 'failed!');
		die "bad $sendmail";
		}

	my $smgr = "$sm -q $t |";

	unless (open(SMGR, $smgr)) {
	    syslog('notice', "$smgr failed!");
	    die "bad $smgr";
	}

	# header
	while ( <SMGR> ) {
		chomp;

		# empty line signals end of header
		if ( /^$/ ) {
			print SM "To: $l\n\n";
			last;	
			}

		#
		# skip unnecessary headers
		#
		next if /^NNTP-Posting-Date:/i;
		next if /^NNTP-Posting-Host:/i;
		next if /^X-Trace:/i;
		next if /^Xref:/i;
		next if /^Path:/i;

		#
		# convert Newsgroups header into X-Newsgroups
		#
		s/^Newsgroups:/X-Newsgroups:/i;

		print SM "$_\n";
		}

	# body
	while ( <SMGR> ) {
		print SM $_;
	}

	close(SMGR);
	close(SM);
	}
