~mdw
/
with-authinfo-kludge
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
with-authinfo-kludge: Add machinery to restore signals in child processes.
[with-authinfo-kludge]
/
with-authinfo-kludge
diff --git
a/with-authinfo-kludge
b/with-authinfo-kludge
index
f8d46bf
..
4317d8d
100755
(executable)
--- a/
with-authinfo-kludge
+++ b/
with-authinfo-kludge
@@
-173,10
+173,20
@@
sub write_to_file ($$) {
rename $new, $file or sysfail "failed to rename `$new' to `$file': $!";
}
rename $new, $file or sysfail "failed to rename `$new' to `$file': $!";
}
+my %OLDSIGS;
+sub set_sighandler ($$) {
+ my ($sig, $handler) = @_;
+ unless (exists $OLDSIGS{$sig}) { $OLDSIGS{$sig} = $SIG{$sig}; }
+ $SIG{$sig} = $handler;
+}
+
my $INKIDP = 0;
sub myfork () {
my $kid = fork;
my $INKIDP = 0;
sub myfork () {
my $kid = fork;
- if (defined $kid && !$kid) { $INKIDP = 1; }
+ if (defined $kid && !$kid) {
+ $INKIDP = 1;
+ for my $sig (keys %OLDSIGS) { $SIG{$sig} = $OLDSIGS{$sig}; }
+ }
return $kid;
}
return $kid;
}
@@
-728,7
+738,7
@@
sub wait_for_ssh () {
my ($n, $t) = select my $rfd_out = $rfd_in, undef, undef, undef;
if ($n >= 0) { }
elsif ($! == EINTR) { next SELECT; }
my ($n, $t) = select my $rfd_out = $rfd_in, undef, undef, undef;
if ($n >= 0) { }
elsif ($! == EINTR) { next SELECT; }
- else {
sysfail "select failed: $!"; }
+ else { sysfail "select failed: $!"; }
FD: for my $fd (keys %fd) {
next FD unless vec $rfd_out, $fd, 1;
my ($sk, $s) = @{$fd{$fd}};
FD: for my $fd (keys %fd) {
next FD unless vec $rfd_out, $fd, 1;
my ($sk, $s) = @{$fd{$fd}};
@@
-747,7
+757,7
@@
sub wait_for_ssh () {
else { inform " all tunnels started ok"; }
}
else { inform " all tunnels started ok"; }
}
-
$SIG{"CHLD"} =
sub {
+
set_sighandler "CHLD",
sub {
KID: for (;;) {
defined (my $kid = waitpid -1, WNOHANG)
or sysfail "failed to reap child: $!";
KID: for (;;) {
defined (my $kid = waitpid -1, WNOHANG)
or sysfail "failed to reap child: $!";
@@
-799,7
+809,7
@@
sub accept_loop () {
my ($n, $t) = select my $rfd_out = $rfd_in, undef, undef, undef;
if ($n >= 0) { }
elsif ($! == EINTR) { next SELECT; }
my ($n, $t) = select my $rfd_out = $rfd_in, undef, undef, undef;
if ($n >= 0) { }
elsif ($! == EINTR) { next SELECT; }
- else {
sysfail "select failed: $!"; }
+ else { sysfail "select failed: $!"; }
FD: for my $fd (keys %SERVMAP) {
next FD unless vec $rfd_out, $fd, 1;
my ($s, $a, $sk) = @{$SERVMAP{$fd}};
FD: for my $fd (keys %SERVMAP) {
next FD unless vec $rfd_out, $fd, 1;
my ($s, $a, $sk) = @{$SERVMAP{$fd}};