36 lines
		
	
	
	
		
			839 B
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
	
		
			839 B
		
	
	
	
		
			Perl
		
	
	
	
	
	
use 5.008;
 | 
						|
use strict;
 | 
						|
use warnings;
 | 
						|
 | 
						|
my $body_filename = $ARGV[0];
 | 
						|
my @command = @ARGV[1 .. $#ARGV];
 | 
						|
 | 
						|
# read data
 | 
						|
my $body_size = -s $body_filename;
 | 
						|
$ENV{"CONTENT_LENGTH"} = $body_size;
 | 
						|
open(my $body_fh, "<", $body_filename) or die "Cannot open $body_filename: $!";
 | 
						|
my $body_data;
 | 
						|
defined read($body_fh, $body_data, $body_size) or die "Cannot read $body_filename: $!";
 | 
						|
close($body_fh);
 | 
						|
 | 
						|
my $exited = 0;
 | 
						|
$SIG{"CHLD"} = sub {
 | 
						|
        $exited = 1;
 | 
						|
};
 | 
						|
 | 
						|
# write data
 | 
						|
my $pid = open(my $out, "|-", @command);
 | 
						|
{
 | 
						|
        # disable buffering at $out
 | 
						|
        my $old_selected = select;
 | 
						|
        select $out;
 | 
						|
        $| = 1;
 | 
						|
        select $old_selected;
 | 
						|
}
 | 
						|
print $out $body_data or die "Cannot write data: $!";
 | 
						|
 | 
						|
sleep 60; # is interrupted by SIGCHLD
 | 
						|
if (!$exited) {
 | 
						|
        close($out);
 | 
						|
        die "Command did not exit after reading whole body";
 | 
						|
}
 |