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";
 | |
| }
 |