t/io/defout.t See if PL_defoutgv works
t/io/dup.t See if >& works right
t/io/errno.t See if $! is correctly set
+t/io/errnosig.t Test case for restoration $! when leaving signal handlers
t/io/fflush.t See if auto-flush on fork/exec/system/qx works
t/io/fs.t See if directory manipulations work
t/io/inplace.t See if inplace editing works
PL_sig_pending = 0;
for (sig = 1; sig < SIG_SIZE; sig++) {
if (PL_psig_pend[sig]) {
+ dSAVE_ERRNO;
PERL_BLOCKSIG_ADD(set, sig);
PL_psig_pend[sig] = 0;
PERL_BLOCKSIG_BLOCK(set);
(*PL_sighandlerp)(sig);
#endif
PERL_BLOCKSIG_UNBLOCK(set);
+ RESTORE_ERRNO;
}
}
}
--- /dev/null
+#!./perl
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = qw(. ../lib);
+}
+
+require Config; import Config;
+require "test.pl";
+plan(tests => 1);
+
+SKIP: {
+ skip("Alarm not supported", 1) unless exists $Config{'d_alarm'};
+
+ $SIG{ALRM} = sub {
+ # We could call anything that modifies $! here, but
+ # this way we can be sure that it isn't the same
+ # errno as interrupted sleep() would return, and are
+ # able to check it thereafter.
+ $! = -1;
+ };
+
+ alarm 1;
+ sleep 2;
+
+ # Interrupted sleeps sets errno to EAGAIN, but signal
+ # that # hits after it (if safe signal handling is enabled)
+ # causes a routing that modifies $! to be run afterwards
+ isnt($! + 0, -1, 'Signal does not modify $!');
+}