#!/usr/bin/perl -w
use IO::Socket::INET;
use strict;
use IO::Select;
use POSIX;

my $server = "use-bncs01.battle.net";
my (%connected,$lsn);
open (LOG,">log.bbnc");
conn();
sub conn {
    $lsn = new IO::Socket::INET( Listen => 3, 
				    LocalPort => 12345,
				    ReuseAddr => 1)  or die "Listen: $!";
    
    bnetrecv();
}

sub bnetrecv {
  my %socket;
    my (@buf,$fh,@ready);
    my $sel = new IO::Select( $lsn );
    while(1) {
	@ready = $sel->can_read(1);
        foreach $fh (@ready) {
            if($fh == $lsn) {
                # Create a new socket
        	my $new = $lsn->accept;
		print LOG $new->peerhost()." Connected\n";
        	$sel->add($new);
		my $nbnet = IO::Socket::INET->new(	PeerAddr => $server,
                                        PeerPort => 6112,
                                        Proto    => 'tcp') or die "Bnet: $!";
		print LOG "Connected To $server\n";			
		$connected{$new}=$nbnet;
                $socket{$new} = $new;
	    }else{
		foreach my $conn (keys(%connected)) {
		    if ($socket{$conn} == $fh) {
			if ($fh -> recv($buf[0],1024)) {
			    $connected{$conn}->send($buf[0]);
			}else{
			    $sel->remove($fh);
			    delete ($connected{$fh});
			}
		    }
		}
		foreach my $conn (keys(%connected)) {
		    if ($connected{$conn} == $fh) {
			if ($fh -> recv($buf[0],1024)) {
			    $socket{$conn}->send($buf[0]);
			}else{
			    $sel->remove($fh);
			    delete ($connected{$fh});
			}
		    }
		}
	    }
	}
    }
}

sub daemonize {
    chdir '/'               or die "Can't chdir to /: $!";
    open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
    open STDOUT, '>/dev/null'
                                       or die "Can't write to /dev/null: $!";
    defined(my $pid = fork) or die "Can't fork: $!";
    exit if $pid;
    POSIX::setsid()                 or die "Can't start a new session: $!";
    open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
}
