fis-gtm/sr_port/dse_find_roots.c

81 lines
2.4 KiB
C

/****************************************************************
* *
* Copyright 2001, 2009 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 "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "gdsblk.h"
#include "dsefind.h"
#include "copy.h"
#include "dse.h"
/* Include prototypes */
#include "t_qread.h"
GBLREF global_root_list *global_roots_tail;
GBLREF sgmnt_addrs *cs_addrs;
GBLREF block_id patch_path[MAX_BT_DEPTH + 1];
GBLREF int4 patch_offset[MAX_BT_DEPTH + 1];
GBLREF short int patch_path_count;
void dse_find_roots(block_id index)
{
int count;
int4 dummy_int;
cache_rec_ptr_t dummy_cr;
short temp_short;
sm_uc_ptr_t bp, b_top, rp, r_top, key_top;
global_dir_path *d_ptr;
error_def(ERR_DSEBLKRDFAIL);
if(!(bp = t_qread(index,&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;
for (rp = bp + SIZEOF(blk_hdr); rp < b_top ;rp = r_top)
{ GET_SHORT(temp_short,&((rec_hdr_ptr_t)rp)->rsiz);
r_top = rp + temp_short;
if (r_top > b_top)
r_top = b_top;
if (r_top - rp < SIZEOF(block_id))
break;
global_roots_tail->link = (global_root_list *)malloc(SIZEOF(global_root_list));
global_roots_tail = global_roots_tail->link;
global_roots_tail->link = 0;
for (key_top = rp + SIZEOF(rec_hdr); key_top < r_top; )
if(!*key_top++ && !*key_top++)
break;
GET_LONG(global_roots_tail->root,key_top);
global_roots_tail->dir_path = (global_dir_path *)malloc(SIZEOF(global_dir_path));
d_ptr = global_roots_tail->dir_path;
for (count = 0; ; count++)
{ d_ptr->block = patch_path[count];
d_ptr->offset = patch_offset[count];
if (count < patch_path_count - 1)
d_ptr->next = (global_dir_path *)malloc(SIZEOF(global_dir_path));
else
{ d_ptr->next = 0;
d_ptr->offset = (int4)(rp - bp);
break;
}
d_ptr = d_ptr->next;
}
}
return;
}