Enhance/fix VMS exit code handling.

* commands.c, function.c, hash.c, job.c, main.c, output.c:
use MAKE exit codes.
* makeint.h: encode make exit codes so that they are VMS compatible.
* job.c: check child exit code for VMS style exit codes.
* vmsjobs.c: save and return VMS style exit code.
This commit is contained in:
Hartmut Becker 2014-08-24 22:06:15 +02:00 committed by Paul Smith
parent f970315766
commit 8de07f3e4a
8 changed files with 30 additions and 19 deletions

View File

@ -585,7 +585,7 @@ fatal_error_signal (int sig)
if (sig == SIGQUIT) if (sig == SIGQUIT)
/* We don't want to send ourselves SIGQUIT, because it will /* We don't want to send ourselves SIGQUIT, because it will
cause a core dump. Just exit instead. */ cause a core dump. Just exit instead. */
exit (EXIT_FAILURE); exit (MAKE_TROUBLE);
#endif #endif
#ifdef WINDOWS32 #ifdef WINDOWS32

View File

@ -1610,7 +1610,7 @@ char *
func_shell_base (char *o, char **argv, int trim_newlines) func_shell_base (char *o, char **argv, int trim_newlines)
{ {
fprintf (stderr, "This platform does not support shell\n"); fprintf (stderr, "This platform does not support shell\n");
die (EXIT_FAILURE); die (MAKE_TROUBLE);
return NULL; return NULL;
} }

2
hash.c
View File

@ -48,7 +48,7 @@ hash_init (struct hash_table *ht, unsigned long size,
{ {
fprintf (stderr, _("can't allocate %lu bytes for hash table: memory exhausted"), fprintf (stderr, _("can't allocate %lu bytes for hash table: memory exhausted"),
ht->ht_size * (unsigned long) sizeof (struct token *)); ht->ht_size * (unsigned long) sizeof (struct token *));
exit (1); exit (MAKE_TROUBLE);
} }
ht->ht_capacity = ht->ht_size - (ht->ht_size / 16); /* 93.75% loading factor */ ht->ht_capacity = ht->ht_size - (ht->ht_size / 16); /* 93.75% loading factor */

13
job.c
View File

@ -510,9 +510,14 @@ child_error (struct child *child,
OUTPUT_UNSET (); OUTPUT_UNSET ();
return; return;
} }
/* Check for a Posix compatible VMS style exit code:
error (NILF, l + INTSTR_LENGTH, decode and print the Posix exit code */
_("%s[%s] Error 0x%x%s"), pre, f->name, exit_code, post); if ((exit_code & 0x35a000) == 0x35a000)
error(NILF, l + INTSTR_LENGTH, _("%s[%s] Error %d%s"), pre, f->name,
((exit_code & 0x7f8) >> 3), post);
else
error(NILF, l + INTSTR_LENGTH, _("%s[%s] Error 0x%x%s"), pre, f->name,
exit_code, post);
#else #else
if (exit_sig == 0) if (exit_sig == 0)
error (NILF, l + INTSTR_LENGTH, error (NILF, l + INTSTR_LENGTH,
@ -982,7 +987,7 @@ reap_children (int block, int err)
if (!err && child_failed && !dontcare && !keep_going_flag && if (!err && child_failed && !dontcare && !keep_going_flag &&
/* fatal_error_signal will die with the right signal. */ /* fatal_error_signal will die with the right signal. */
!handling_fatal_signal) !handling_fatal_signal)
die (2); die (MAKE_FAILURE);
/* Only block for one child. */ /* Only block for one child. */
block = 0; block = 0;

8
main.c
View File

@ -1434,7 +1434,7 @@ main (int argc, char **argv, char **envp)
if (print_version_flag) if (print_version_flag)
{ {
print_version (); print_version ();
die (0); die (MAKE_SUCCESS);
} }
if (ISDB (DB_BASIC)) if (ISDB (DB_BASIC))
@ -2254,7 +2254,7 @@ main (int argc, char **argv, char **envp)
if (any_remade) if (any_remade)
goto re_exec; goto re_exec;
if (any_failed) if (any_failed)
die (2); die (MAKE_FAILURE);
break; break;
} }
@ -2529,7 +2529,7 @@ main (int argc, char **argv, char **envp)
} }
/* NOTREACHED */ /* NOTREACHED */
exit (0); exit (MAKE_SUCCESS);
} }
/* Parsing of arguments, decoding of switches. */ /* Parsing of arguments, decoding of switches. */
@ -2894,7 +2894,7 @@ decode_switches (int argc, const char **argv, int env)
if (!env && (bad || print_usage_flag)) if (!env && (bad || print_usage_flag))
{ {
print_usage (bad); print_usage (bad);
die (bad ? 2 : 0); die (bad ? MAKE_FAILURE : MAKE_SUCCESS);
} }
/* If there are any options that need to be decoded do it now. */ /* If there are any options that need to be decoded do it now. */

View File

@ -630,10 +630,14 @@ extern int handling_fatal_signal;
#define MAX(_a,_b) ((_a)>(_b)?(_a):(_b)) #define MAX(_a,_b) ((_a)>(_b)?(_a):(_b))
#endif #endif
#ifdef VMS #ifdef VMS
# define MAKE_SUCCESS 1 /* These are the VMS __posix_exit compliant exit codes, constructed out of
# define MAKE_TROUBLE 2 STS$M_INHIB_MSG, C facility code, a POSIX condition code mask, MAKE_NNN<<3 and
# define MAKE_FAILURE 3 the coresponding VMS severity, here STS$K_SUCCESS and STS$K_ERROR. */
# define MAKE_SUCCESS 0x1035a001
# define MAKE_TROUBLE 0x1035a00a
# define MAKE_FAILURE 0x1035a012
#else #else
# define MAKE_SUCCESS 0 # define MAKE_SUCCESS 0
# define MAKE_TROUBLE 1 # define MAKE_TROUBLE 1

View File

@ -495,7 +495,7 @@ close_stdout (void)
perror_with_name (_("write error: stdout"), ""); perror_with_name (_("write error: stdout"), "");
else else
O (error, NILF, _("write error: stdout")); O (error, NILF, _("write error: stdout"));
exit (EXIT_FAILURE); exit (MAKE_TROUBLE);
} }
} }
@ -699,7 +699,7 @@ fatal (const gmk_floc *flocp, size_t len, const char *fmt, ...)
assert (fmtbuf.buffer[len-1] == '\0'); assert (fmtbuf.buffer[len-1] == '\0');
outputs (1, fmtbuf.buffer); outputs (1, fmtbuf.buffer);
die (2); die (MAKE_FAILURE);
} }
/* Print an error message from errno. */ /* Print an error message from errno. */

View File

@ -114,7 +114,7 @@ static int ctrlYPressed= 0;
int int
vmsHandleChildTerm(struct child *child) vmsHandleChildTerm(struct child *child)
{ {
int status; int exit_code;
register struct child *lastc, *c; register struct child *lastc, *c;
int child_failed; int child_failed;
@ -130,7 +130,9 @@ vmsHandleChildTerm(struct child *child)
(void) sigblock (fatal_signal_mask); (void) sigblock (fatal_signal_mask);
child_failed = !(child->cstatus & 1 || ((child->cstatus & 7) == 0)); child_failed = !(child->cstatus & 1);
if (child_failed)
exit_code = child->cstatus;
/* Search for a child matching the deceased one. */ /* Search for a child matching the deceased one. */
lastc = 0; lastc = 0;
@ -202,7 +204,7 @@ vmsHandleChildTerm(struct child *child)
/* If the job failed, and the -k flag was not given, die. */ /* If the job failed, and the -k flag was not given, die. */
if (child_failed && !keep_going_flag) if (child_failed && !keep_going_flag)
die (EXIT_FAILURE); die (exit_code);
(void) sigsetmask (sigblock (0) & ~(fatal_signal_mask)); (void) sigsetmask (sigblock (0) & ~(fatal_signal_mask));