fis-gtm/sr_port/dse_r_dmp.c

116 lines
3.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 <signal.h>
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "gdsblk.h"
#include "cli.h"
#include "dse.h"
#include "util.h"
#include "skan_offset.h"
#include "skan_rnum.h"
/* Include prototypes */
#include "t_qread.h"
GBLREF block_id patch_curr_blk;
GBLREF sgmnt_addrs *cs_addrs;
GBLREF gd_region *gv_cur_region;
GBLREF int patch_is_fdmp;
GBLREF int patch_fdmp_recs;
GBLREF int patch_rec_counter;
GBLREF VSIG_ATOMIC_T util_interrupt;
error_def(ERR_DSEBLKRDFAIL);
error_def(ERR_CTRLC);
boolean_t dse_r_dmp(void)
{
block_id blk;
sm_uc_ptr_t bp, b_top, rp;
int4 count;
int4 dummy_int;
cache_rec_ptr_t dummy_cr;
short record, size;
boolean_t was_crit, was_hold_onto_crit;
int4 nocrit_present;
if (cli_present("BLOCK") == CLI_PRESENT)
{
uint4 tmp_blk;
if(!cli_get_hex("BLOCK", &tmp_blk))
return FALSE;
blk = (block_id)tmp_blk;
if (blk < 0 || blk >= cs_addrs->ti->total_blks || !(blk % cs_addrs->hdr->bplmap))
{
util_out_print("Error: invalid block number.", TRUE);
return FALSE;
}
patch_curr_blk = blk;
}
if (cli_present("COUNT") == CLI_PRESENT)
{
if (!cli_get_hex("COUNT", (uint4 *)&count))
return FALSE;
} else
count = 1;
was_crit = cs_addrs->now_crit;
nocrit_present = (CLI_NEGATED == cli_present("CRIT"));
DSE_GRAB_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
if (!(bp = t_qread(patch_curr_blk, &dummy_int, &dummy_cr)))
rts_error(VARLSTCNT(1) ERR_DSEBLKRDFAIL);
if (((blk_hdr_ptr_t) bp)->bsiz > cs_addrs->hdr->blk_size)
b_top = bp + cs_addrs->hdr->blk_size;
else if (((blk_hdr_ptr_t) bp)->bsiz < SIZEOF(blk_hdr))
b_top = bp + SIZEOF(blk_hdr);
else
b_top = bp + ((blk_hdr_ptr_t) bp)->bsiz;
if (((blk_hdr_ptr_t) bp)->levl && patch_is_fdmp)
{
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
util_out_print("Error: cannot perform GLO/ZWR dump on index block.", TRUE);
return FALSE;
}
if (cli_present("RECORD") == CLI_PRESENT)
{
if (!(rp = skan_rnum (bp, FALSE)))
{
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
return FALSE;
}
} else if (!(rp = skan_offset (bp, FALSE)))
{
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
return FALSE;
}
util_out_print(0, TRUE);
for ( ; 0 < count; count--)
{
if (util_interrupt || !(rp = dump_record(rp, patch_curr_blk, bp, b_top)))
break;
patch_rec_counter += 1;
}
DSE_REL_CRIT_AS_APPROPRIATE(was_crit, was_hold_onto_crit, nocrit_present, cs_addrs, gv_cur_region);
if (util_interrupt)
rts_error(VARLSTCNT(1) ERR_CTRLC);
else if (cli_present("HEADER") == CLI_NEGATED)
util_out_print(0, TRUE);
return TRUE;
}