--- telnetbbs/telnetbbs.pl 2010/01/11 05:02:27 1.3 +++ telnetbbs/telnetbbs.pl 2010/12/13 05:54:50 1.5 @@ -6,7 +6,7 @@ ## ## Nicholas DeClario ## October 2009 -## $Id: telnetbbs.pl,v 1.3 2010/01/11 05:02:27 nick Exp $ +## $Id: telnetbbs.pl,v 1.5 2010/12/13 05:54:50 nick Exp $ ## ################################################################################ BEGIN { @@ -34,21 +34,21 @@ use threads::shared; ## my %opts = &fetchOptions( ); my $pidFile = "/var/run/telnetbbs.pid"; -my @nodes = ( ); my $EOL = "\015\012"; ## ## These will be moved in to a config file ## -my $DISPLAY = ":1018.0"; -my $BBS_NAME = "Hell's Dominion BBS"; -my $BBS_NODE = 0; -my $DBCONF = "/tmp/dosbox-__NODE__.conf"; -my $BBS_CMD = "DISPLAY=$DISPLAY /usr/bin/dosbox -conf "; -my $LOG = "/var/log/bbs.log"; -my $MAX_NODE = 6; -my $DOSBOXT = "dosbox.conf.template"; -my $BASE_PORT = 5000; +my $DISPLAY = ":0.0"; +my $BBS_NAME = "Hell's Dominion BBS"; +my $BBS_NODE = 0; +my $DBCONF = "/tmp/dosbox-__NODE__.conf"; +my $BBS_CMD = "DISPLAY=$DISPLAY /usr/bin/dosbox -conf "; +my $LOG = "/var/log/bbs.log"; +my $MAX_NODE = 1; +my $DOSBOXT = "dosbox.conf.template"; +my $BASE_PORT = 7000; +my $LOCK_PATH = "/tmp"; ## ## Check that we are 'root' @@ -81,7 +81,8 @@ local $SIG{HUP} = $SIG{INT} = $SIG{TERM ## ## Start the network server ## -my $netThread = threads->create( \&startNetServer ); +my $netThread = threads->create( \&startNetServer( ) ); + while( 1 ) { sleep 1; } @@ -98,7 +99,7 @@ while( 1 ) { sleep 1; } ############################################################################### ############################################################################### -sub logmsg { print "$0 $$ ", scalar localtime, ":@_\n" } +sub logmsg { print STDOUT "$0 $$ ", scalar localtime, ":@_\n" } ############################################################################### ## startNetServer( ); @@ -111,7 +112,8 @@ sub startNetServer { my $hostConnection; my $childPID; - my $port = $opts{'port'} || 23; + my $port = $opts{'port'} || 23; + my @nodes = ( ); my $server = IO::Socket::INET->new( LocalPort => $port, @@ -133,15 +135,21 @@ sub startNetServer ## Find the next available node ## my $node = 0; + my $lock_file = ""; foreach (1 .. $MAX_NODE) { - next if ( $node ); - if ( ! $nodes[$_] ) - { - $node = $BBS_NODE = $_; - $nodes[$_]++; - } +print "Searching for lock: " . $LOCK_PATH."/".$BBS_NAME."_node".$_.".lock\n"; + next if ( -f $LOCK_PATH."/".$BBS_NAME."_node".$_.".lock" ); + + ## + ## Create node lock file + ## + $lock_file = $LOCK_PATH."/".$BBS_NAME."_node".$_.".lock"; + open LOCK, ">$lock_file"; + close( LOCK ); + $node = $BBS_NODE = $_; } +print "Using lock: " . $LOCK_PATH."/".$BBS_NAME."_node".$node.".lock\n"; ## ## Create our dosbox config @@ -172,21 +180,23 @@ sub startNetServer } defined( $childPID ) || die( "Cannot fork: $!\n" ); + select $hostConnection; + ## ## Default file descriptor to the client and turn on autoflush ## $hostConnection->autoflush( 1 ); - print $hostConnection "Welcome to $BBS_NAME!" . $EOL; + print "Welcome to $BBS_NAME!" . $EOL; ## - if ( ! $BBS_NODE ) + if ( ! $lock_file ) { - print $hostConnection "No available nodes. Try again later.".$EOL; + print "No available nodes. Try again later.".$EOL; exit; } - print $hostConnection "Starting BBS on node $BBS_NODE...$EOL"; + print "Starting BBS on node $BBS_NODE...$EOL"; ## ## Launch BBS via dosbox @@ -194,8 +204,15 @@ sub startNetServer my $bbsPID = fork( ); if ( $bbsPID ) { + select STDOUT; my $cmd = $BBS_CMD . $DBCONF; - exec( $cmd ); + system( $cmd ); + print "Shutting down node $BBS_NODE\n"; + ## + ## Remove Lock + ## + unlink( $lock_file ); + unlink( $DBCONF ); exit; } @@ -225,7 +242,8 @@ sub startNetServer { print $hostConnection $byte; } - kill( "TERM" => $childPID ); + $nodes[$BBS_NODE] = 0; + kill( "TERM" => $kidpid ); } else { @@ -257,6 +275,8 @@ sub shutdown { my $signame = shift || 0; + select STDOUT; + &logmsg( "$0: Shutdown (SIG$signame) received.\n" ) if( $signame );