my $self = {
request => $request,
restored => 0,
+ setuped => 0,
stdin => IO::File->new_tmpfile,
stdout => IO::File->new_tmpfile,
stderr => IO::File->new_tmpfile
if ( $self->request->content_length ) {
- $self->stdin->write( $self->request->content )
- or croak("Can't write content: $!");
+ $self->stdin->syswrite( $self->request->content )
+ or croak("Can't write content to stdin: $!");
- seek( $self->stdin, 0, 0 )
+ $self->stdin->sysseek( 0, SEEK_SET )
or croak("Can't seek stdin: $!");
}
- %ENV = %{ $self->enviroment };
+ {
+ no warnings 'uninitialized';
+ %ENV = %{ $self->enviroment };
+ }
open( STDIN, '<&=', $self->stdin->fileno )
or croak("Can't open stdin: $!");
open( STDERR, '>&=', $self->stderr->fileno )
or croak("Can't open stderr: $!");
+
+ $self->{setuped}++;
return $self;
}
open( STDERR, '>&', $self->{restore}->{stderr} )
or croak("Can't restore stderr: $!");
-
+
+ if ( $self->stdin->fileno != STDIN->fileno ) {
+ $self->stdin->sysseek( 0, SEEK_SET )
+ or croak("Can't seek stdin: $!");
+ }
+
+ if ( $self->stdout->fileno != STDOUT->fileno ) {
+ $self->stdout->sysseek( 0, SEEK_SET )
+ or croak("Can't seek stdout: $!");
+ }
+
+ if ( $self->stderr->fileno != STDERR->fileno ) {
+ $self->stderr->sysseek( 0, SEEK_SET )
+ or croak("Can't seek stderr: $!");
+ }
+
$self->{restored}++;
}
sub DESTROY {
my $self = shift;
- $self->restore unless $self->{restored};
+ $self->restore if $self->{setuped} && !$self->{restored};
}
1;
# enviroment and descriptors will automatically be restored when $c is destructed.
}
- $stdout->seek( 0, 0 );
-
while ( my $line = $stdout->getline ) {
print $line;
}