208 lines
5.2 KiB
C
208 lines
5.2 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 "main_pragma.h"
|
|
|
|
#include <signal.h>
|
|
#include "gtm_inet.h"
|
|
|
|
#include "mlkdef.h"
|
|
#include "gtm_stdlib.h"
|
|
#include "gtm_stdio.h"
|
|
#include "gtm_string.h"
|
|
#include "stp_parms.h"
|
|
#include "error.h"
|
|
#include "min_max.h"
|
|
#include "init_root_gv.h"
|
|
#include "interlock.h"
|
|
#include "gtmimagename.h"
|
|
#include "stringpool.h"
|
|
#include "gdsroot.h"
|
|
#include "gdsblk.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsbt.h"
|
|
#include "gdsfhead.h"
|
|
#include "gdskill.h"
|
|
#include "gdscc.h"
|
|
#include "filestruct.h"
|
|
#include "jnl.h"
|
|
#include "buddy_list.h"
|
|
#include "hashtab_int4.h"
|
|
#include "tp.h"
|
|
#include "repl_msg.h"
|
|
#include "gtmsource.h"
|
|
#include "util.h"
|
|
#include "cli.h"
|
|
#include "op.h"
|
|
#include "gt_timer.h"
|
|
#include "io.h"
|
|
#include "dse.h"
|
|
#include "compiler.h"
|
|
#include "patcode.h"
|
|
#include "lke.h"
|
|
#include "get_page_size.h"
|
|
#include "gtm_startup_chk.h"
|
|
#include "generic_signal_handler.h"
|
|
#include "init_secshr_addrs.h"
|
|
#include "cli_parse.h"
|
|
#include "getzdir.h"
|
|
#include "dse_exit.h"
|
|
#include "getjobname.h"
|
|
#include "getjobnum.h"
|
|
#include "sig_init.h"
|
|
#include "gtmmsg.h"
|
|
#include "suspsigs_handler.h"
|
|
#include "gtm_env_init.h" /* for gtm_env_init() prototype */
|
|
#include "gtm_imagetype_init.h"
|
|
#include "gtm_threadgbl_init.h"
|
|
#include "wbox_test_init.h"
|
|
#include "gtmio.h"
|
|
#include "have_crit.h"
|
|
|
|
#ifdef UNICODE_SUPPORTED
|
|
#include "gtm_icu_api.h"
|
|
#include "gtm_utf8.h"
|
|
#endif
|
|
|
|
GBLREF gd_region *gv_cur_region;
|
|
GBLREF gd_binding *gd_map;
|
|
GBLREF gd_binding *gd_map_top;
|
|
GBLREF gd_addr *gd_header;
|
|
GBLREF gd_addr *original_header;
|
|
GBLREF bool licensed;
|
|
GBLREF void (*func)(void);
|
|
GBLREF gv_namehead *gv_target;
|
|
GBLREF mval curr_gbl_root;
|
|
GBLREF int (*op_open_ptr)(mval *v, mval *p, int t, mval *mspace);
|
|
GBLREF boolean_t dse_running;
|
|
GBLREF spdesc rts_stringpool, stringpool;
|
|
GBLREF global_latch_t defer_latch;
|
|
GBLREF VSIG_ATOMIC_T util_interrupt;
|
|
GBLREF char cli_err_str[];
|
|
GBLREF boolean_t write_after_image;
|
|
GBLREF CLI_ENTRY dse_cmd_ary[];
|
|
|
|
GBLDEF block_id patch_curr_blk;
|
|
GBLDEF CLI_ENTRY *cmd_ary = &dse_cmd_ary[0]; /* Define cmd_ary to be the DSE specific cmd table */
|
|
|
|
static bool dse_process(int argc);
|
|
static void display_prompt(void);
|
|
static readonly char prompt[]="DSE> ";
|
|
|
|
error_def(ERR_CTRLC);
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
DCL_THREADGBL_ACCESS;
|
|
|
|
GTM_THREADGBL_INIT;
|
|
set_blocksig();
|
|
gtm_imagetype_init(DSE_IMAGE);
|
|
gtm_wcswidth_fnptr = gtm_wcswidth;
|
|
gtm_env_init(); /* read in all environment variables */
|
|
licensed = TRUE;
|
|
TREF(transform) = TRUE;
|
|
op_open_ptr = op_open;
|
|
patch_curr_blk = get_dir_root();
|
|
err_init(util_base_ch);
|
|
GTM_ICU_INIT_IF_NEEDED; /* Note: should be invoked after err_init (since it may error out) and before CLI parsing */
|
|
sig_init(generic_signal_handler, dse_ctrlc_handler, suspsigs_handler);
|
|
atexit(util_exit_handler);
|
|
SET_LATCH_GLOBAL(&defer_latch, LOCK_AVAILABLE);
|
|
get_page_size();
|
|
stp_init(STP_INITSIZE);
|
|
rts_stringpool = stringpool;
|
|
getjobname();
|
|
INVOKE_INIT_SECSHR_ADDRS;
|
|
getzdir();
|
|
prealloc_gt_timers();
|
|
initialize_pattern_table();
|
|
gvinit();
|
|
region_init(FALSE);
|
|
INIT_GBL_ROOT(); /* Needed for GVT initialization */
|
|
getjobnum();
|
|
util_out_print("!/File !_!AD", TRUE, DB_LEN_STR(gv_cur_region));
|
|
util_out_print("Region!_!AD!/", TRUE, REG_LEN_STR(gv_cur_region));
|
|
cli_lex_setup(argc, argv);
|
|
CREATE_DUMMY_GBLDIR(gd_header, original_header, gv_cur_region, gd_map, gd_map_top);
|
|
gtm_chk_dist(argv[0]);
|
|
# ifdef DEBUG
|
|
if ((gtm_white_box_test_case_enabled && (WBTEST_SEMTOOLONG_STACK_TRACE == gtm_white_box_test_case_number) ))
|
|
{
|
|
sgmnt_addrs * csa;
|
|
node_local_ptr_t cnl;
|
|
csa = &FILE_INFO(gv_cur_region)->s_addrs;
|
|
cnl = csa->nl;
|
|
cnl->wbox_test_seq_num = 1; /*Signal the first step and wait here*/
|
|
while (2 != cnl->wbox_test_seq_num) /*Wait for another process to get hold of the semaphore and signal next step*/
|
|
LONG_SLEEP(10);
|
|
}
|
|
# endif
|
|
if (argc < 2)
|
|
display_prompt();
|
|
io_init(TRUE);
|
|
while (1)
|
|
{
|
|
if (!dse_process(argc))
|
|
break;
|
|
display_prompt();
|
|
}
|
|
dse_exit();
|
|
REVERT;
|
|
}
|
|
|
|
static void display_prompt(void)
|
|
{
|
|
PRINTF("DSE> ");
|
|
FFLUSH(stdout);
|
|
}
|
|
|
|
static bool dse_process(int argc)
|
|
{
|
|
int res;
|
|
|
|
ESTABLISH_RET(util_ch, TRUE);
|
|
func = 0;
|
|
util_interrupt = 0;
|
|
if (EOF == (res = parse_cmd()))
|
|
{
|
|
if (util_interrupt)
|
|
{
|
|
rts_error(VARLSTCNT(1) ERR_CTRLC);
|
|
REVERT;
|
|
return TRUE;
|
|
} else
|
|
{
|
|
REVERT;
|
|
return FALSE;
|
|
}
|
|
} else if (res)
|
|
{
|
|
if (1 < argc)
|
|
{
|
|
/* Here we need to REVERT since otherwise we stay in dse in a loop
|
|
* The design of dse needs to be changed to act like VMS (which is:
|
|
* if there is an error in the dse command (dse dumpoa), go to command
|
|
* prompt, but UNIX exits
|
|
*/
|
|
REVERT;
|
|
rts_error(VARLSTCNT(4) res, 2, LEN_AND_STR(cli_err_str));
|
|
} else
|
|
gtm_putmsg(VARLSTCNT(4) res, 2, LEN_AND_STR(cli_err_str));
|
|
}
|
|
if (func)
|
|
func();
|
|
REVERT;
|
|
return(1 >= argc);
|
|
}
|