#!/usr/bin/perl -w
#
# YoPop version 0
# Launches Yahoo Mail on POP3 request
#
# Copyright Dirk Diggler & Som One 1981-2002. All rides reserved.
# Coded by Som One and Pierrot Lunaire (French version)
# Redistribution and use, with or without modification,
# is permitted in the sense of GDWYWL
# (GeneralDoWhateverYouWantLicense)
# -z3r0-

use strict;
use IO::Socket;

# CONFIG SECTION
# Please check out these values before running YoPop
#

my $pop_host = "localhost";
my $pop_port = "110";
my $YoPop_port = "9110";

#
# END CONFIG

chomp(my $am_i_ubermensch = `id -u 2>/dev/null`);
die "It ain\'t clever running YoPop as root! Exiting.\n"
        if $am_i_ubermensch eq '0';

if (! defined $ARGV[0]) {
        print "YoPop: Missing argument!\n\n".
              "Usage: YoPop COMMAND\n";
        die "Runs COMMAND on POP3 request.\n";

}

# I don't like the zombie kids! :-)
$SIG{CHLD} = 'IGNORE';

my $line;
my $kidpid;
my $YoSuckerCommand = $ARGV[0];

my $pid = fork;
exit if $pid;
die "Couldn't fork: $!" unless defined ($pid);

my $server = IO::Socket::INET->new( Proto     => 'tcp',
                                      LocalPort => $YoPop_port,
                                      Listen    => SOMAXCONN,
                                      Reuse     => 1)
        or die "Can't start the server on port $YoPop_port!\n";

while (my $client = $server->accept()) {
	my $pop = IO::Socket::INET->new (Proto	=> "tcp",
				   PeerAddr	=> $pop_host,
				   PeerPort	=> $pop_port,
				   Reuse	=> 1)
	or die "Can't connect to the pop server!\n";
	$pop->autoflush(1);

	`$YoSuckerCommand`;

	die "can't fork: $!" unless defined ($kidpid = fork());

	if ($kidpid) {
	  while (<$pop>) {
		print $client $_;
	  }
	  kill("TERM" => $kidpid);
	}
	else {
	  while (<$client>) {
		# `$YoSuckerCommand` if /^STAT\r$/;
		print $pop $_;
	  }
	}
	close($pop);
}

close($server);
exit;
