c06efbc1d4da35e22fc844dc9002d61f53a81049
[scpubgit/Tak.git] / lib / Tak / STDIOSetup.pm
1 package Tak::STDIOSetup;
2
3 use Log::Contextual qw(:log);
4 use Log::Contextual::SimpleLogger;
5 use Tak::ConnectionService;
6 use Tak::Router;
7 use Tak;
8 use strictures 1;
9
10 sub run {
11   open my $stdin, '<&', \*STDIN or die "Duping stdin: $!";
12   open my $stdout, '>&', \*STDOUT or die "Duping stdout: $!";
13   # if we don't re-open them then 0 and 1 get re-used - which is not
14   # only potentially bloody confusing but results in warnings like:
15   # "Filehandle STDOUT reopened as STDIN only for input"
16   close STDIN or die "Closing stdin: $!";
17   open STDIN, '<', '/dev/null' or die "Re-opening stdin: $!";
18   close STDOUT or die "Closing stdout: $!";
19   open STDOUT, '>', '/dev/null' or die "Re-opening stdout: $!";
20   my ($host, $level) = @ARGV;
21   my $sig = '<'.join ':', $host, $$.'> ';
22   Log::Contextual::set_logger(
23     Log::Contextual::SimpleLogger->new({
24       levels_upto => $level,
25       coderef => sub { print STDERR $sig, @_; }
26     })
27   );
28   my $done;
29   my $connection = Tak::ConnectionService->new(
30     read_fh => $stdin, write_fh => $stdout,
31     listening_service => Tak::Router->new,
32     on_close => sub { $done = 1 }
33   );
34   $connection->receiver->service->register_weak(remote => $connection);
35   if ($0 eq '-') {
36     $0 = 'tak-stdio-node';
37   }
38   log_debug { "Node starting" };
39   print $stdout "UP\n";
40   Tak->loop_until($done);
41 }
42
43 1;