>From 9288e317e61e736bbc4b9f7d80a36e6dc1184326 Mon Sep 17 00:00:00 2001 From: Hartmut Becker Date: Sun, 24 Aug 2014 22:06:15 +0200 Subject: [PATCH] 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. --- commands.c | 2 +- function.c | 2 +- hash.c | 2 +- job.c | 13 +++++++++---- main.c | 8 ++++---- makeint.h | 10 +++++++--- output.c | 4 ++-- vmsjobs.c | 8 +++++--- 8 files changed, 30 insertions(+), 19 deletions(-) diff --git a/commands.c b/commands.c index 0dbb99c..74bf9f4 100644 --- a/commands.c +++ b/commands.c @@ -585,7 +585,7 @@ fatal_error_signal (int sig) if (sig == SIGQUIT) /* We don't want to send ourselves SIGQUIT, because it will cause a core dump. Just exit instead. */ - exit (EXIT_FAILURE); + exit (MAKE_TROUBLE); #endif #ifdef WINDOWS32 diff --git a/function.c b/function.c index 9c0a036..e1664c0 100644 --- a/function.c +++ b/function.c @@ -1610,7 +1610,7 @@ char * func_shell_base (char *o, char **argv, int trim_newlines) { fprintf (stderr, "This platform does not support shell\n"); - die (EXIT_FAILURE); + die (MAKE_TROUBLE); return NULL; } diff --git a/hash.c b/hash.c index ca2d02d..7b4b271 100644 --- a/hash.c +++ b/hash.c @@ -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"), 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 */ diff --git a/job.c b/job.c index e3c3385..777417e 100644 --- a/job.c +++ b/job.c @@ -510,9 +510,14 @@ child_error (struct child *child, OUTPUT_UNSET (); return; } - - error (NILF, l + INTSTR_LENGTH, - _("%s[%s] Error 0x%x%s"), pre, f->name, exit_code, post); + /* Check for a Posix compatible VMS style exit code: + decode and print the Posix exit code */ + 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 if (exit_sig == 0) error (NILF, l + INTSTR_LENGTH, @@ -982,7 +987,7 @@ reap_children (int block, int err) if (!err && child_failed && !dontcare && !keep_going_flag && /* fatal_error_signal will die with the right signal. */ !handling_fatal_signal) - die (2); + die (MAKE_FAILURE); /* Only block for one child. */ block = 0; diff --git a/main.c b/main.c index 754f794..f025122 100644 --- a/main.c +++ b/main.c @@ -1434,7 +1434,7 @@ main (int argc, char **argv, char **envp) if (print_version_flag) { print_version (); - die (0); + die (MAKE_SUCCESS); } if (ISDB (DB_BASIC)) @@ -2258,7 +2258,7 @@ main (int argc, char **argv, char **envp) if (any_remade) goto re_exec; if (any_failed) - die (2); + die (MAKE_FAILURE); break; } @@ -2533,7 +2533,7 @@ main (int argc, char **argv, char **envp) } /* NOTREACHED */ - exit (0); + exit (MAKE_SUCCESS); } /* Parsing of arguments, decoding of switches. */ @@ -2898,7 +2898,7 @@ decode_switches (int argc, const char **argv, int env) if (!env && (bad || print_usage_flag)) { 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. */ diff --git a/makeint.h b/makeint.h index 3916e0a..fd79049 100644 --- a/makeint.h +++ b/makeint.h @@ -636,10 +636,14 @@ extern int handling_fatal_signal; #define MAX(_a,_b) ((_a)>(_b)?(_a):(_b)) #endif + #ifdef VMS -# define MAKE_SUCCESS 1 -# define MAKE_TROUBLE 2 -# define MAKE_FAILURE 3 +/* These are the VMS __posix_exit compliant exit codes, constructed out of + STS$M_INHIB_MSG, C facility code, a POSIX condition code mask, MAKE_NNN<<3 and + 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 # define MAKE_SUCCESS 0 # define MAKE_TROUBLE 1 diff --git a/output.c b/output.c index 625413b..a15d563 100644 --- a/output.c +++ b/output.c @@ -495,7 +495,7 @@ close_stdout (void) perror_with_name (_("write error: stdout"), ""); else 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'); outputs (1, fmtbuf.buffer); - die (2); + die (MAKE_FAILURE); } /* Print an error message from errno. */ diff --git a/vmsjobs.c b/vmsjobs.c index 8fe5015..d3444b1 100644 --- a/vmsjobs.c +++ b/vmsjobs.c @@ -114,7 +114,7 @@ static int ctrlYPressed= 0; int vmsHandleChildTerm(struct child *child) { - int status; + int exit_code; register struct child *lastc, *c; int child_failed; @@ -130,7 +130,9 @@ vmsHandleChildTerm(struct child *child) (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. */ lastc = 0; @@ -202,7 +204,7 @@ vmsHandleChildTerm(struct child *child) /* If the job failed, and the -k flag was not given, die. */ if (child_failed && !keep_going_flag) - die (EXIT_FAILURE); + die (exit_code); (void) sigsetmask (sigblock (0) & ~(fatal_signal_mask)); -- 1.7.10.4