sub main { my $self = shift; my $paddr; my $waitedpid = 0; sub spawn; sub logmsg; $server = GlxInetServer->new($port{"servd"},1,"servd"); for ( $waitedpid = 0; ($paddr = $server->accept()) || $waitedpid; $waitedpid = 0, $server->close()) { next if $waitedpid and not $paddr; spawn sub{ $client_modd = GlxInetClient->new($port{"modd"},1,"servd"); $server->write("440 Servd ready for commands"); my $in=$server->read(); unless (defined $in) { $self->unexpected; last }; SWITCH: { ($in =~ /^status/) && do { $server->write($ob_modds[0]->status); $server->write("OK connecting statd"); last SWITCH; }; ($in =~ /^something/ && do { ### snip $client_modd->write($in); ### snip $client_modd->close(); last SWITCH; }; ($in =~ /^bye$/) && do { $server->write("OK"); last SWITCH; }; $server->write("450 No such command"); $client_modd->close(); } # SWITCH }# spawn }# for sub spawn { my $coderef = shift; die unless (@_ == 0 && $coderef && ref($coderef) eq 'CODE'); my $pid; if (!defined($pid = fork)){ logmsg "cannot fork: $!"; return; } elsif ($pid) { logmsg "[$pid] listening for ".$server->get_iname()." [", inet_ntoa($server->get_iaddr()),"]"; return; } exit &$coderef(); } } #main