autoflush output pipe just in case
[scpubgit/Tak.git] / lib / Tak / STDIOSetup.pm
index fed4656..1a9fc9e 100644 (file)
@@ -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;