summaryrefslogtreecommitdiff
path: root/vest/line_mediator.pl
diff options
context:
space:
mode:
Diffstat (limited to 'vest/line_mediator.pl')
-rwxr-xr-xvest/line_mediator.pl63
1 files changed, 47 insertions, 16 deletions
diff --git a/vest/line_mediator.pl b/vest/line_mediator.pl
index 5ae13aa4..f3c6dbf1 100755
--- a/vest/line_mediator.pl
+++ b/vest/line_mediator.pl
@@ -7,6 +7,8 @@
use strict;
use IPC::Open2;
+use POSIX qw(pipe dup2 STDIN_FILENO STDOUT_FILENO);
+#use IO::Handle;
$,=' ';
my $quiet=$ENV{QUIET};
sub info {
@@ -14,24 +16,53 @@ sub info {
}
my @c1;
-do {
- push @c1,shift
-} while $c1[$#c1] ne '--';
+if (scalar @ARGV) {
+ do {
+ push @c1,shift
+ } while $c1[$#c1] ne '--';
+}
pop @c1;
my @c2=@ARGV;
-(scalar @c1 && scalar @c2) || die "usage: $0 cmd1 args -- cmd2 args; hooks up two processes, 2nd of which has one line of output per line of input, expected by the first, which starts off the communication. crosses stdin/stderr of cmd1 and cmd2 line by line (both must flush on newline and output. cmd1 initiates the conversation (sends the first line). QUIET env var suppresses debugging output.";
+(scalar @c1 && scalar @c2) || die "usage: $0 cmd1 args -- cmd2 args; hooks up two processes, 2nd of which has one line of output per line of input, expected by the first, which starts off the communication. crosses stdin/stderr of cmd1 and cmd2 line by line (both must flush on newline and output. cmd1 initiates the conversation (sends the first line). QUIET=1 env var suppresses debugging output. default: attempts to cross stdin/stdout of c1 and c2 directly (via two unidirectional posix pipes created before fork). env SERIAL=1: (no parallelism possible) but lines exchanged are logged unless QUIET.";
+
info("1 cmd:",@c1,"\n");
info("2 cmd:",@c2,"\n");
-my ($R1,$W1,$R2,$W2);
-my $c1p=open2($R1,$W1,@c1); # Open2 R W backward from Open3.
-my $c2p=open2($R2,$W2,@c2);
-select $W2;
-$|=1;
-while(<$R1>) {
- info("1:",$_);
- print $_;
- $_=<$R2>;
- last unless defined $_;
- info("2:",$_);
- print $W1 $_;
+
+if ($ENV{SERIAL}) {
+ my ($R1,$W1,$R2,$W2);
+ my $c1p=open2($R1,$W1,@c1); # Open2 R W backward from Open3.
+ my $c2p=open2($R2,$W2,@c2);
+ select $W2;
+ $|=1;
+ while(<$R1>) {
+ info("1:",$_);
+ print $_;
+ $_=<$R2>;
+ last unless defined $_;
+ info("2:",$_);
+ print $W1 $_;
+ }
+} else {
+ my @rw1=POSIX::pipe();
+ my @rw2=POSIX::pipe();
+ my $pid=undef;
+ $SIG{CHLD} = sub { wait };
+# close STDIN;
+# close STDOUT;
+ while (not defined ($pid=fork())) {
+ sleep 1;
+ }
+# info(STDOUT_FILENO,STDIN_FILENO,"\n");
+ POSIX::close(STDOUT_FILENO);
+ POSIX::close(STDIN_FILENO);
+ if ($pid) {
+ POSIX::dup2($rw1[1],STDOUT_FILENO);
+ POSIX::dup2($rw2[0],STDIN_FILENO);
+ exec @c1;
+ } else {
+ POSIX::dup2($rw2[1],STDOUT_FILENO);
+ POSIX::dup2($rw1[0],STDIN_FILENO);
+ exec @c2;
+ }
+ while (wait()!=-1) {}
}