]> git.ipfire.org Git - thirdparty/automake.git/commitdiff
Improve test for blocked signals
authorJacob Bachmeyer <jcb@gnu.org>
Thu, 9 Feb 2023 05:07:26 +0000 (23:07 -0600)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 29 Mar 2023 19:49:52 +0000 (12:49 -0700)
This fixes ERRORs reported by:
 * t/parallel-tests-interrupt.tap
 * t/self-check-exit.tap
 * t/self-check-is-blocked-signal.tap
 * t/tap-signal.tap

 * t/ax/am-test-lib.sh (is_blocked_signal): Revise Perl code
   to more closely follow documented interfaces where
   available.  This also works around bugs and limitations
   of the POSIX module in Perl 5.6.

Copyright-paperwork-exempt: yes

t/ax/am-test-lib.sh

index bdf699889cf58634ee3e03b73202aa034e69e739..bfa1d84b20d56cfe59ad856e5d35eaba5ea59878 100644 (file)
@@ -103,13 +103,14 @@ is_blocked_signal ()
   # Use perl, since trying to do this portably in the shell can be
   # very tricky, if not downright impossible.  For reference, see:
   # <https://lists.gnu.org/archive/html/bug-autoconf/2011-09/msg00004.html>
-  if $PERL -w -e '
-    use strict;
-    use warnings FATAL => "all";
-    use POSIX;
-    my %oldsigaction = ();
-    sigaction('"$1"', 0, \%oldsigaction);
-    exit ($oldsigaction{"HANDLER"} eq "IGNORE" ? 0 : 77);
+  if $PERL -Mstrict -Mwarnings=FATAL,all -MPOSIX -Mconstant=SN,"$1" -e '
+    my $new = POSIX::SigAction->new(sub {});
+    my $old = POSIX::SigAction->new();
+    { no warnings q[uninitialized]; sigaction(SN, $new, $old) }
+    my $oldhandler;
+    if ($old->can(q[handler])) { $oldhandler = $old->handler }
+    else { $oldhandler = $old->{HANDLER} }
+    exit ($oldhandler eq "IGNORE" ? 0 : 77);
   '; then
     return 0
   elif test $? -eq 77; then