diff options
author | John E. Malmberg <wb8tyw@qsl.net> | 2005-10-23 21:34:41 -0400 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2005-10-25 08:14:33 +0000 |
commit | 0968cdad220f9ff42abaf7f92b7d3731a578e46d (patch) | |
tree | 35b15ba93de0d3a81a8df7b200532d197b26728c /perl.c | |
parent | a1f215421ebd80862b412b5d459a2959cc58fc9d (diff) | |
download | perl-0968cdad220f9ff42abaf7f92b7d3731a578e46d.tar.gz |
VMS exit handling still broken, need some help.
From: "John E. Malmberg" <wb8tyw@qsl.net>
Message-ID: <435C7271.8070403@qsl.net>
p4raw-id: //depot/perl@25839
Diffstat (limited to 'perl.c')
-rw-r--r-- | perl.c | 54 |
1 files changed, 48 insertions, 6 deletions
@@ -5166,15 +5166,57 @@ Perl_my_failure_exit(pTHX) #ifdef VMS /* We have been called to fall on our sword. The desired exit code * should be already set in STATUS_UNIX, but could be shifted over - * by 8 bits. STATUS_UNIX_EXIT_SET will fix all cases where - * an error code has been set. + * by 8 bits. STATUS_UNIX_EXIT_SET will handle the cases where a + * that code is set. * * If an error code has not been set, then force the issue. */ - if (STATUS_UNIX == 0) /* No errors or status recorded? */ - STATUS_ALL_FAILURE; /* Ok, force the issue with a generic code */ - else - STATUS_UNIX_EXIT_SET(STATUS_UNIX); + if (MY_POSIX_EXIT) { + + /* In POSIX_EXIT mode follow Perl documentations and use 255 for + * the exit code when there isn't an error. + */ + + if (STATUS_UNIX == 0) + STATUS_UNIX_EXIT_SET(255); + else { + STATUS_UNIX_EXIT_SET(STATUS_UNIX); + + /* The exit code could have been set by $? or vmsish which + * means that it may not be fatal. So convert + * success/warning codes to fatal. + */ + if ((STATUS_NATIVE & (STS$K_SEVERE|STS$K_ERROR)) == 0) + STATUS_UNIX_EXIT_SET(255); + } + } + else { + /* Traditionally Perl on VMS always expects a Fatal Error. */ + if (vaxc$errno & 1) { + + /* So force success status to failure */ + if (STATUS_NATIVE & 1) + STATUS_ALL_FAILURE; + } + else { + if (!vaxc$errno) { + STATUS_UNIX = EINTR; /* In case something cares */ + STATUS_ALL_FAILURE; + } + else { + int severity; + STATUS_NATIVE = vaxc$errno; /* Should already be this */ + + /* Encode the severity code */ + severity = STATUS_NATIVE & STS$M_SEVERITY; + STATUS_UNIX = (severity ? severity : 1) << 8; + + /* Perl expects this to be a fatal error */ + if (severity != STS$K_SEVERE) + STATUS_ALL_FAILURE; + } + } + } #else int exitstatus; |