/* vms_exit.c
 *
 * Wrapper for the VMS exit() command to tranlate UNIX codes to be
 * encoded for POSIX, but also have VMS severity levels.
 * The posix_exit() variant only sets a severity level for status code 1.
 *
 * Author: John E. Malmberg
 */

/* Copyright (C) 2014 Free Software Foundation, Inc.

GNU Make is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3 of the License, or (at your option) any later
version.

GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program.  If not, see <http://www.gnu.org/licenses/>.  */


/* Per copyright assignment agreement with the Free Software Foundation
   this software may be available under under other license agreements
   and copyrights. */

#include <makeint.h>

#include <stsdef.h>
void
decc$exit (int status);
#ifndef C_FACILITY_NO
# define C_FACILITY_NO 0x350000
#endif

/* Lowest legal non-success VMS exit code is 8 */
/* GNU make only defines codes 0, 1, 2 */
/* So assume any exit code > 8 is a VMS exit code */

#ifndef MAX_EXPECTED_EXIT_CODE
# define MAX_EXPECTED_EXIT_CODE 7
#endif

/* Build a Posix Exit with VMS severity */
void
vms_exit (int status)
{
  int vms_status;
  /* Fake the __posix_exit with severity added */
  /* Undocumented correct way to do this. */
  vms_status = 0;

  /* The default DECC definition is not compatible with doing a POSIX_EXIT */
  /* So fix it. */
  if (status == EXIT_FAILURE)
    status = MAKE_FAILURE;

  /* Trivial case exit success */
  if (status == 0)
    decc$exit (STS$K_SUCCESS);

  /* Is this a VMS status then just take it */
  if (status > MAX_EXPECTED_EXIT_CODE)
    {
      /* Make sure that the message inhibit is set since message has */
      /* already been displayed. */
      vms_status = status | STS$M_INHIB_MSG;
      decc$exit (vms_status);
    }

  /* Unix status codes are limited to 1 byte, so anything larger */
  /* is a probably a VMS exit code and needs to be passed through */
  /* A lower value can be set for a macro. */
  /* Status 0 is always passed through as it is converted to SS$_NORMAL */
  /* Always set the message inhibit bit */
  vms_status = C_FACILITY_NO | 0xA000 | STS$M_INHIB_MSG;
  vms_status |= (status << 3);

  /* STS$K_ERROR is for status that stops makefile that a simple */
  /* Rerun of the makefile will not fix. */

  if (status == MAKE_FAILURE)
    vms_status |= STS$K_ERROR;
  else if (status == MAKE_TROUBLE)
    {
      /* Make trouble is for when make was told to do nothing and */
      /* found that a target was not up to date.  Since a second */
      /* of make will produce the same condition, this is of */
      /* Error severity */
      vms_status |= STS$K_ERROR;
    }
  decc$exit (vms_status);
}
