This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #85104] work harder to save error numbers
authorTony Cook <tony@develop-help.com>
Mon, 26 Aug 2013 05:07:44 +0000 (15:07 +1000)
committerTony Cook <tony@develop-help.com>
Mon, 26 Aug 2013 05:32:47 +0000 (15:32 +1000)
Updates the errno save macros to save the platform error number where
needed for more than just VMS.

The OS/2 code is untested.

perl.h
t/win32/signal.t

diff --git a/perl.h b/perl.h
index 90495fd..8dd4889 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -1168,12 +1168,6 @@ EXTERN_C char *crypt(const char *, const char *);
 #   define SS_IVCHAN           SS$_IVCHAN
 #   define SS_NORMAL           SS$_NORMAL
 #else
-#   define SETERRNO(errcode,vmserrcode) (errno = (errcode))
-#   define dSAVEDERRNO    int saved_errno
-#   define dSAVE_ERRNO    int saved_errno = errno
-#   define SAVE_ERRNO     (saved_errno = errno)
-#   define RESTORE_ERRNO  (errno = saved_errno)
-
 #   define LIB_INVARG          0
 #   define RMS_DIR             0
 #   define RMS_FAC             0
@@ -1188,6 +1182,31 @@ EXTERN_C char *crypt(const char *, const char *);
 #   define SS_NORMAL           0
 #endif
 
+#ifdef WIN32
+#   define dSAVEDERRNO  int saved_errno; DWORD saved_win32_errno
+#   define dSAVE_ERRNO  int saved_errno = errno; DWORD saved_win32_errno = GetLastError()
+#   define SAVE_ERRNO   ( saved_errno = errno, saved_win32_errno = GetLastError() )
+#   define RESTORE_ERRNO ( errno = saved_errno, SetLastError(saved_win32_errno) )
+#endif
+
+#ifdef OS2
+#   define dSAVEDERRNO  int saved_errno; unsigned long saved_os2_errno
+#   define dSAVE_ERRNO  int saved_errno = errno; unsigned long saved_os2_errno = Perl_rc
+#   define SAVE_ERRNO   ( saved_errno = errno, saved_os2_errno = Perl_rc )
+#   define RESTORE_ERRNO ( errno = saved_errno, Perl_rc = saved_os2_errno )
+#endif
+
+#ifndef SETERRNO
+#   define SETERRNO(errcode,vmserrcode) (errno = (errcode))
+#endif
+
+#ifndef dSAVEDERRNO
+#   define dSAVEDERRNO    int saved_errno
+#   define dSAVE_ERRNO    int saved_errno = errno
+#   define SAVE_ERRNO     (saved_errno = errno)
+#   define RESTORE_ERRNO  (errno = saved_errno)
+#endif
+
 #define ERRSV GvSVn(PL_errgv)
 
 #define CLEAR_ERRSV() STMT_START {                                     \
index 71a6e7d..d24fd0b 100644 (file)
@@ -70,7 +70,7 @@ EOS
        }
        print "# signaled after $count loops\n";
        print $! != 0 ? "not " : "", "ok 3 # \$! preserved\n";
-       print $^E != 0 ? "not " : "", "ok 4 # TODO \$^E preserved\n"
+       print $^E != 0 ? "not " : "", "ok 4 # \$^E preserved\n"
            or print STDERR "# \$^E = ", 0+$^E, "\n";
        exit;
     }