128 lines
3.3 KiB
C
128 lines
3.3 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2012 Fidelity Information Services, Inc *
|
|
* *
|
|
* This source code contains the intellectual property *
|
|
* of its copyright holder(s), and is made available *
|
|
* under a license. If you do not know the terms of *
|
|
* the license, please stop and do not read further. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
#include "mdef.h"
|
|
|
|
#include "gtm_stdlib.h"
|
|
#ifdef VMS
|
|
#include <descrip.h>
|
|
#endif
|
|
|
|
#include "mlkdef.h"
|
|
#include "gdsroot.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsbt.h"
|
|
#include "gdsfhead.h"
|
|
#include "filestruct.h"
|
|
#include "error.h"
|
|
#include "gtmimagename.h"
|
|
#include "lke.h"
|
|
#include "dpgbldir.h"
|
|
#include "preemptive_db_clnup.h"
|
|
#include "util.h"
|
|
|
|
GBLREF boolean_t need_core;
|
|
GBLREF boolean_t created_core;
|
|
GBLREF boolean_t dont_want_core;
|
|
GBLREF int4 exi_condition;
|
|
GBLREF int4 error_condition;
|
|
|
|
error_def(ERR_ASSERT);
|
|
error_def(ERR_GTMASSERT);
|
|
error_def(ERR_GTMASSERT2);
|
|
error_def(ERR_GTMCHECK);
|
|
error_def(ERR_OUTOFSPACE);
|
|
error_def(ERR_STACKOFLOW);
|
|
error_def(ERR_MEMORY);
|
|
error_def(ERR_VMSMEMORY);
|
|
#ifdef VMS
|
|
error_def(ERR_MUNOFINISH);
|
|
error_def(ERR_DSENOFINISH);
|
|
error_def(ERR_LKENOFINISH);
|
|
#endif
|
|
|
|
CONDITION_HANDLER(util_base_ch)
|
|
{
|
|
sgmnt_addrs *csa;
|
|
gd_addr *addr_ptr;
|
|
gd_region *r_top, *r_save, *r_local;
|
|
VMS_ONLY(
|
|
unsigned short msglen;
|
|
uint4 status;
|
|
unsigned char msginfo[4];
|
|
unsigned char msg_buff[MAX_MSG_SIZE + 1];
|
|
$DESCRIPTOR(msgbuf, msg_buff);
|
|
)
|
|
|
|
START_CH;
|
|
PRN_ERROR;
|
|
if (SUCCESS == SEVERITY || INFO == SEVERITY)
|
|
{
|
|
CONTINUE;
|
|
} else
|
|
{
|
|
for (addr_ptr = get_next_gdr(NULL); addr_ptr; addr_ptr = get_next_gdr(addr_ptr))
|
|
{
|
|
for (r_local = addr_ptr->regions, r_top = r_local + addr_ptr->n_regions; r_local < r_top; r_local++)
|
|
{
|
|
if (r_local->open && !r_local->was_open)
|
|
{
|
|
csa = &FILE_INFO(r_local)->s_addrs;
|
|
if (!csa->persistent_freeze)
|
|
region_freeze(r_local, FALSE, FALSE, FALSE);
|
|
}
|
|
}
|
|
}
|
|
if (IS_MUPIP_IMAGE)
|
|
preemptive_db_clnup(SEVERITY); /* for other utilities, preemptive_db_clnup() is called from util_ch() */
|
|
UNIX_ONLY(
|
|
if ((DUMPABLE) && !SUPPRESS_DUMP)
|
|
{
|
|
need_core = TRUE;
|
|
gtm_fork_n_core();
|
|
}
|
|
/* rts_error sets error_condition, and util_base_ch is called only if
|
|
* exiting thru rts_error. Setup exi_condition to reflect error
|
|
* exit status. Note, if the last eight bits (the only relevant bits
|
|
* for Unix exit status) of error_condition is non-zero in case of
|
|
* errors, we make sure that an error exit status (non-zero value -1)
|
|
* is setup. This is a hack.
|
|
*/
|
|
if (0 == exi_condition)
|
|
exi_condition = (((error_condition & UNIX_EXIT_STATUS_MASK) != 0) ? error_condition : -1);
|
|
)
|
|
VMS_ONLY(
|
|
if ((DUMPABLE) && !SUPPRESS_DUMP)
|
|
{
|
|
gtm_dump();
|
|
TERMINATE;
|
|
}
|
|
exi_condition = SIGNAL;
|
|
/* following is a hack to avoid FAO directives getting printed without expanding
|
|
* in the error message during EXIT()
|
|
*/
|
|
if (IS_GTM_ERROR(SIGNAL))
|
|
{
|
|
status = sys$getmsg(SIGNAL, &msglen, &msgbuf, 0, msginfo);
|
|
if (status & 1)
|
|
{
|
|
if (0 < msginfo[1])
|
|
exi_condition = (IS_MUPIP_IMAGE ? ERR_MUNOFINISH :
|
|
(IS_DSE_IMAGE ? ERR_DSENOFINISH : ERR_LKENOFINISH));
|
|
}
|
|
}
|
|
)
|
|
UNSUPPORTED_PLATFORM_CHECK;
|
|
EXIT(exi_condition);
|
|
}
|
|
}
|