Codebase list libcapture-tiny-perl / d39c78f
all close() replaced with _close(); cleaned up debugging cruft David Golden 15 years ago
1 changed file(s) with 9 addition(s) and 10 deletion(s). Raw diff Collapse all Expand all
4747 return *{$glob}{NAME};
4848 }
4949
50
5150 sub _open {
52 # warn "# @_ : ";# . (defined fileno($_[0]) ? fileno($_[0]) : 'undef') . " , $_[1]\n" ;
5351 open $_[0], $_[1] or die "Error from open(" . join(q{, }, @_) . "): $!";
5452 _debug( "# open " . join( ", " , map { defined $_ ? _name($_) : 'undef' } @_ ) . " as " . fileno( $_[0] ) . "\n" );
5553 }
5654
5755 sub _close {
58 # warn "# @_ : ";# . (defined fileno($_[0]) ? fileno($_[0]) : 'undef') . " , $_[1]\n" ;
5956 close $_[0] or die "Error from close(" . join(q{, }, @_) . "): $!";
6057 _debug( "# closed " . ( defined $_[0] ? _name($_[0]) : 'undef' ) . "\n" );
6158 }
6360 sub _proxy_std {
6461 my %proxies;
6562 if ( ! defined fileno STDIN ) {
66 _debug( "# proxying STDIN ...\n" );
6763 _open \*STDIN, "<" . File::Spec->devnull;
68 _debug( "# proxyed STDIN as " . (defined fileno STDIN ? fileno STDIN : 'undef' ) . "\n" );
64 _debug( "# proxied STDIN as " . (defined fileno STDIN ? fileno STDIN : 'undef' ) . "\n" );
6965 $proxies{stdin} = \*STDIN;
7066 }
7167 if ( ! defined fileno STDOUT ) {
7268 _open \*STDOUT, ">" . File::Spec->devnull;
69 _debug( "# proxied STDOUT as " . (defined fileno STDOUT ? fileno STDOUT : 'undef' ) . "\n" );
7370 $proxies{stdout} = \*STDOUT;
7471 }
7572 if ( ! defined fileno STDERR ) {
7673 _open \*STDERR, ">" . File::Spec->devnull;
74 _debug( "# proxied STDERR as " . (defined fileno STDERR ? fileno STDERR : 'undef' ) . "\n" );
7775 $proxies{stderr} = \*STDERR;
7876 }
7977 return %proxies;
9492 _open \*STDIN, "<&" . fileno $handles->{stdin};
9593 }
9694 else {
97 close STDIN if defined fileno STDIN;
95 _close \*STDIN if defined fileno STDIN;
9896 }
9997 if ( defined fileno $handles->{stdout} ) {
10098 _open \*STDOUT, ">&" . fileno $handles->{stdout};
10199 }
102100 else {
103 close STDOUT if defined fileno STDOUT;
101 _close \*STDOUT if defined fileno STDOUT;
104102 }
105103 if ( defined fileno $handles->{stderr} ) {
106104 _open \*STDERR, ">&" . fileno $handles->{stderr};
107105 }
108106 else {
109 close STDERR if defined fileno STDERR;
107 _close \*STDERR if defined fileno STDERR;
110108 }
111109 }
112110
148146 }
149147 elsif ($pid == 0) { # child
150148 untie *STDIN; untie *STDOUT; untie *STDERR;
151 close $stash->{tee}{$which};
149 _close $stash->{tee}{$which};
152150 _debug( "# redirecting in child ...\n" );
153151 _open_std( $stash->{child}{$which} );
154152 exec @cmd, $stash->{flag_files}{$which};
166164
167165 sub _kill_tees {
168166 my ($stash) = @_;
169 close $_ for values %{ $stash->{tee} };
167 _close $_ for values %{ $stash->{tee} };
170168 if ( $use_system ) {
171169 eval { Win32::Sleep(25) }; # 25 ms pause for output to get flushed, I hope
172170 kill 1, $_ for values %{ $stash->{pid} }; # shut them down hard
191189 my %proxy_std = _proxy_std();
192190 my $stash = { old => _copy_std() };
193191 $stash->{new}{$_} = $stash->{capture}{$_} = tempfile() for qw/stdout stderr/;
192 _debug("# will capture $_ on " .fileno($stash->{capture}{$_})."\n") for qw/stdout stderr/;
194193 # tees may change $stash->{new}
195194 _start_tee( stdout => $stash ) if $tee_stdout;
196195 _start_tee( stderr => $stash ) if $tee_stderr;