use Socket; sub fhforwarder { my ($left_in,$left_out,$right_in,$right_out,$bufsize) = @_; $bufsize ||= 16*1024; my %fn = map { $_ => fileno($_); } @_; my ($rin,$win) = ('',''); my ($rout,$wout); my ($lr_buf,$rl_buf) = ('',''); # Initially listen for input on both sides vec($rin,$fn{$left_in} ,1) = 1; vec($rin,$fn{$right_in},1) = 1; while(1) { last unless( (vec($rin,$fn{$left_in},1) && vec($rin,$fn{$right_in},1)) || length $lr_buf || length $rl_buf ); #print "Select\n"; #print "lr_buf :[$lr_buf]\n"; my $n = select($rout=$rin,$wout=$win,undef,undef); warn("select: $!"),return 0 if($n <= 0); # Write to right if(vec($wout,$fn{$right_out},1) && length $lr_buf) {{ #print "W2R\n"; $n = $right_out->syswrite($lr_buf,length $lr_buf); warn("write: $!"),return 0 if($n < 0); $lr_buf = substr $lr_buf,$n; vec($win,$fn{$right_out},1) = length $lr_buf; }} # Write to left if(vec($wout,$fn{$left_out},1) && length $rl_buf) {{ #print "W2L\n"; $n = $left_out->syswrite($rl_buf,length $rl_buf); warn("write: $!"),return 0 if($n < 0); $rl_buf = substr $rl_buf,$n; vec($win,$fn{$left_out},1) = length $rl_buf; }} # Read from left if(vec($rout,$fn{$left_in},1)) {{ # Left side has input #print STDERR "RFL\n"; my $used = length $lr_buf; warn("Left to Right buffer full"),last if($used == $bufsize); $n = $left_in->sysread($lr_buf,$bufsize-$used,$used); vec($rin,$fn{$left_in},1) = 0,last if($n <= 0); vec($win,$fn{$right_out},1) = 1; }} # Read from right if(vec($rout,$fn{$right_in},1)) {{ # right side has input #print STDERR "RFR\n"; my $used = length $rl_buf; warn("Right to Left buffer full"),last if($used == $bufsize); $n = $right_in->sysread($rl_buf,$bufsize-$used,$used); vec($rin,$fn{$right_in},1) = 0,last if($n <= 0); vec($win,$fn{$left_out},1) = 1; }} } return 1; } 1;