X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FTak%2FSTDIOSetup.pm;h=30c9851f6ab95c0377e723d3931edace589615e1;hb=fe725d6e99834f26f20ce3f78eda9591c0d4a7d1;hp=dcf0dc49fa52fefce1f9cee890d32a256a31ef0d;hpb=2791fd73b196072f047b2b3d746b64be53312ca3;p=scpubgit%2FTak.git diff --git a/lib/Tak/STDIOSetup.pm b/lib/Tak/STDIOSetup.pm index dcf0dc4..30c9851 100644 --- a/lib/Tak/STDIOSetup.pm +++ b/lib/Tak/STDIOSetup.pm @@ -1,18 +1,32 @@ package Tak::STDIOSetup; +use Log::Contextual qw(:log); +use Log::Contextual::SimpleLogger; use Tak::ConnectionService; use Tak::Router; use Tak; +use IO::Handle; use strictures 1; sub run { - open my $stdin, '<&', \*STDIN; - open my $stdout, '>&', \*STDOUT; + open my $stdin, '<&', \*STDIN or die "Duping stdin: $!"; + open my $stdout, '>&', \*STDOUT or die "Duping stdout: $!"; + $stdout->autoflush(1); # if we don't re-open them then 0 and 1 get re-used - which is not # only potentially bloody confusing but results in warnings like: # "Filehandle STDOUT reopened as STDIN only for input" - close STDIN; open STDIN, '<', '/dev/null'; - close STDOUT; open STDOUT, '>', '/dev/null'; + close STDIN or die "Closing stdin: $!"; + open STDIN, '<', '/dev/null' or die "Re-opening stdin: $!"; + close STDOUT or die "Closing stdout: $!"; + open STDOUT, '>', '/dev/null' or die "Re-opening stdout: $!"; + my ($host, $level) = @ARGV; + my $sig = '<'.join ':', $host, $$.'> '; + Log::Contextual::set_logger( + Log::Contextual::SimpleLogger->new({ + levels_upto => $level, + coderef => sub { print STDERR $sig, @_; } + }) + ); my $done; my $connection = Tak::ConnectionService->new( read_fh => $stdin, write_fh => $stdout, @@ -20,10 +34,13 @@ sub run { on_close => sub { $done = 1 } ); $connection->receiver->service->register_weak(remote => $connection); - if ($0 eq '-') { - $0 = 'tak-stdio-node'; - } + $0 = 'tak-stdio-node'; + log_debug { "Node starting" }; + # Tell the other end that we've finished messing around with file + # descriptors and that it's therefore safe to start sending requests. + print $stdout "Ssyshere\n"; Tak->loop_until($done); + if (our $Next) { goto &$Next } } 1;