summaryrefslogtreecommitdiff
path: root/vest/line_mediator.pl
diff options
context:
space:
mode:
Diffstat (limited to 'vest/line_mediator.pl')
-rwxr-xr-xvest/line_mediator.pl35
1 files changed, 35 insertions, 0 deletions
diff --git a/vest/line_mediator.pl b/vest/line_mediator.pl
new file mode 100755
index 00000000..defc11e8
--- /dev/null
+++ b/vest/line_mediator.pl
@@ -0,0 +1,35 @@
+#!/usr/bin/perl -w
+#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
+
+# if you don't know how to fork/exec in a C program, this could be helpful under limited cirmustances (would be ok to liaise with sentserver)
+
+use strict;
+use IPC::Open2;
+$,=' ';
+my $quiet=$ENV{QUIET};
+sub info {
+ print STDERR @_ unless $quiet;
+}
+
+my @c1;
+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.";
+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 $_;
+}