1 | /* vms_exit.c
|
---|
2 | *
|
---|
3 | * Wrapper for the VMS exit() command to tranlate UNIX codes to be
|
---|
4 | * encoded for POSIX, but also have VMS severity levels.
|
---|
5 | * The posix_exit() variant only sets a severity level for status code 1.
|
---|
6 | *
|
---|
7 | * Author: John E. Malmberg
|
---|
8 | */
|
---|
9 |
|
---|
10 | /* Copyright (C) 2014-2016 Free Software Foundation, Inc.
|
---|
11 |
|
---|
12 | GNU Make is free software; you can redistribute it and/or modify it under the
|
---|
13 | terms of the GNU General Public License as published by the Free Software
|
---|
14 | Foundation; either version 3 of the License, or (at your option) any later
|
---|
15 | version.
|
---|
16 |
|
---|
17 | GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
|
---|
18 | WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
---|
19 | A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
---|
20 |
|
---|
21 | You should have received a copy of the GNU General Public License along with
|
---|
22 | this program. If not, see <http://www.gnu.org/licenses/>. */
|
---|
23 |
|
---|
24 |
|
---|
25 | /* Per copyright assignment agreement with the Free Software Foundation
|
---|
26 | this software may be available under under other license agreements
|
---|
27 | and copyrights. */
|
---|
28 |
|
---|
29 | #include <makeint.h>
|
---|
30 |
|
---|
31 | #include <stsdef.h>
|
---|
32 | void
|
---|
33 | decc$exit (int status);
|
---|
34 | #ifndef C_FACILITY_NO
|
---|
35 | # define C_FACILITY_NO 0x350000
|
---|
36 | #endif
|
---|
37 |
|
---|
38 | /* Lowest legal non-success VMS exit code is 8 */
|
---|
39 | /* GNU make only defines codes 0, 1, 2 */
|
---|
40 | /* So assume any exit code > 8 is a VMS exit code */
|
---|
41 |
|
---|
42 | #ifndef MAX_EXPECTED_EXIT_CODE
|
---|
43 | # define MAX_EXPECTED_EXIT_CODE 7
|
---|
44 | #endif
|
---|
45 |
|
---|
46 | /* Build a Posix Exit with VMS severity */
|
---|
47 | void
|
---|
48 | vms_exit (int status)
|
---|
49 | {
|
---|
50 | int vms_status;
|
---|
51 | /* Fake the __posix_exit with severity added */
|
---|
52 | /* Undocumented correct way to do this. */
|
---|
53 | vms_status = 0;
|
---|
54 |
|
---|
55 | /* The default DECC definition is not compatible with doing a POSIX_EXIT */
|
---|
56 | /* So fix it. */
|
---|
57 | if (status == EXIT_FAILURE)
|
---|
58 | status = MAKE_FAILURE;
|
---|
59 |
|
---|
60 | /* Trivial case exit success */
|
---|
61 | if (status == 0)
|
---|
62 | decc$exit (STS$K_SUCCESS);
|
---|
63 |
|
---|
64 | /* Is this a VMS status then just take it */
|
---|
65 | if (status > MAX_EXPECTED_EXIT_CODE)
|
---|
66 | {
|
---|
67 | /* Make sure that the message inhibit is set since message has */
|
---|
68 | /* already been displayed. */
|
---|
69 | vms_status = status | STS$M_INHIB_MSG;
|
---|
70 | decc$exit (vms_status);
|
---|
71 | }
|
---|
72 |
|
---|
73 | /* Unix status codes are limited to 1 byte, so anything larger */
|
---|
74 | /* is a probably a VMS exit code and needs to be passed through */
|
---|
75 | /* A lower value can be set for a macro. */
|
---|
76 | /* Status 0 is always passed through as it is converted to SS$_NORMAL */
|
---|
77 | /* Always set the message inhibit bit */
|
---|
78 | vms_status = C_FACILITY_NO | 0xA000 | STS$M_INHIB_MSG;
|
---|
79 | vms_status |= (status << 3);
|
---|
80 |
|
---|
81 | /* STS$K_ERROR is for status that stops makefile that a simple */
|
---|
82 | /* Rerun of the makefile will not fix. */
|
---|
83 |
|
---|
84 | if (status == MAKE_FAILURE)
|
---|
85 | vms_status |= STS$K_ERROR;
|
---|
86 | else if (status == MAKE_TROUBLE)
|
---|
87 | {
|
---|
88 | /* Make trouble is for when make was told to do nothing and */
|
---|
89 | /* found that a target was not up to date. Since a second */
|
---|
90 | /* of make will produce the same condition, this is of */
|
---|
91 | /* Error severity */
|
---|
92 | vms_status |= STS$K_ERROR;
|
---|
93 | }
|
---|
94 | decc$exit (vms_status);
|
---|
95 | }
|
---|