diff -ru ../Z/orca-0.26/src/orca.pl.in ./src/orca.pl.in --- ../Z/orca-0.26/src/orca.pl.in Thu Mar 9 14:49:59 2000 +++ ./src/orca.pl.in Mon Feb 5 15:18:36 2001 @@ -85,8 +85,9 @@ # Install signal handlers to clean up. $SIG{INT} = \&catch_signal; +$SIG{PIPE} = \&catch_signal; $SIG{TERM} = \&catch_signal; -$SIG{__DIE__} = \&catch_signal; +$SIG{__DIE__} = \&catch_die; if ($opt_verbose) { print "Orca version $ORCA_VERSION using RRDs version $RRDs::VERSION.\n"; @@ -102,29 +103,51 @@ # This is set to 1 if the locking directory should be removed. my $rmdir_locking_directory; +# This cleans up any leftover temporary files. In certain +# circumstances, such as when Orca receives a SIGPIPE, then assume +# that STDOUT and STDERR are closed and do not print any messages so +# that Orca can properly clean up. If Orca prints when STDOUT and/or +# STDERR or closed, then it will hang. sub clean_up_and_quit { - # Print some statistics about running. - &running_stats; + my $can_print = shift; + my $message = shift; + + $can_print = 1 unless defined $can_print; if ($rmdir_locking_directory and $locking_directory and -d $locking_directory) { - rmdir($locking_directory) or - warn "$0: cannot rmdir `$locking_directory': $!\n"; + unless (rmdir($locking_directory)) { + if ($can_print) { + warn "$0: cannot rmdir `$locking_directory': $!\n"; + } + } + } + + # Print the given message and any running statistics. + if ($can_print) { + print $message if $message; + &running_stats; } + exit 0; } +# Catch any die messages. +sub catch_die { + my $message = shift; + clean_up_and_quit(1, $message); +} + +# Catch any signals. Treat SIGPIPE specially to instruct Orca to not +# print any more messages to STDOUT or STDERR, since these file +# descriptors may have closed if they were attached to a process that +# exited. sub catch_signal { - my $signal = shift; - chomp($signal); - $signal =~ s/\.+$//; - if ($signal =~ /$0/o) { - print STDERR "$signal.\n"; - } else { - print STDERR "$0: caught signal $signal.\n"; - } - clean_up_and_quit; + my $signal = shift; + my $can_print = $signal !~ /PIPE/; + my $message = "$0: caught signal $signal.\n"; + clean_up_and_quit($can_print, $message); } sub main {