X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FTak%2FSTDIOSetup.pm;h=1a9fc9e905a8aab46ee5dc71a81fe87c2df328bf;hb=3e8833259b5bf95efa2137543051a35e7655e1d3;hp=fed46569a393e4dec1750c6d9abb2525fa7f7316;hpb=77bf1d9b5b6832894676ab549ee5664cb7200d33;p=scpubgit%2FTak.git diff --git a/lib/Tak/STDIOSetup.pm b/lib/Tak/STDIOSetup.pm index fed4656..1a9fc9e 100644 --- a/lib/Tak/STDIOSetup.pm +++ b/lib/Tak/STDIOSetup.pm @@ -1,19 +1,45 @@ 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; - close STDIN; close 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 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, - listening_service => Tak::Router->new + listening_service => Tak::Router->new, + on_close => sub { $done = 1 } ); - Tak->loop->loop_forever; + $connection->receiver->service->register_weak(remote => $connection); + if ($0 eq '-') { + $0 = 'tak-stdio-node'; + } + log_debug { "Node starting" }; + print $stdout "UP\n"; + Tak->loop_until($done); } 1;