Commit | Line | Data |
77bf1d9b |
1 | package Tak::STDIOSetup; |
2 | |
7b71b06e |
3 | use Log::Contextual qw(:log); |
4 | use Log::Contextual::SimpleLogger; |
77bf1d9b |
5 | use Tak::ConnectionService; |
6 | use Tak::Router; |
7 | use Tak; |
8 | use strictures 1; |
9 | |
10 | sub run { |
7b71b06e |
11 | open my $stdin, '<&', \*STDIN or die "Duping stdin: $!"; |
12 | open my $stdout, '>&', \*STDOUT or die "Duping stdout: $!"; |
2791fd73 |
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" |
7b71b06e |
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 | ); |
986f5290 |
28 | my $done; |
77bf1d9b |
29 | my $connection = Tak::ConnectionService->new( |
30 | read_fh => $stdin, write_fh => $stdout, |
986f5290 |
31 | listening_service => Tak::Router->new, |
32 | on_close => sub { $done = 1 } |
77bf1d9b |
33 | ); |
2791fd73 |
34 | $connection->receiver->service->register_weak(remote => $connection); |
35 | if ($0 eq '-') { |
36 | $0 = 'tak-stdio-node'; |
37 | } |
7b71b06e |
38 | log_debug { "Node starting" }; |
39 | print $stdout "UP\n"; |
986f5290 |
40 | Tak->loop_until($done); |
77bf1d9b |
41 | } |
42 | |
43 | 1; |