fis-gtm/sr_port/create_dummy_gbldir.c

139 lines
4.1 KiB
C

/****************************************************************
* *
* Copyright 2001, 2010 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 <errno.h>
#include "gtm_string.h"
#include "gtm_stdio.h"
#include "gtm_fcntl.h"
#include "gtm_unistd.h"
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "gdsblk.h"
#include "mlkdef.h"
#include "filestruct.h"
#include "gbldirnam.h"
#include "hashtab_mname.h"
#include "hashtab.h"
#ifdef GTM64
#define SAVE_ADDR_REGION \
{ \
int4 *tmp = (int *)&(addr->regions); \
*int4_ptr++ = *tmp; \
int4_ptr++; \
}
#else /* GTM64 */
#define SAVE_ADDR_REGION \
*int4_ptr++ = (int4)addr->regions;
#endif /* GTM64 */
static gdr_name *gdr_name_head;
gd_addr *create_dummy_gbldir(void)
{
header_struct *header;
gd_addr *addr;
gdr_name *name;
gd_binding *map, *map_top;
gd_region *region;
gd_region *region_top;
gd_segment *segment;
int4 *int4_ptr;
uint4 t_offset, size;
size = SIZEOF(header_struct) + SIZEOF(gd_addr) + 3 * SIZEOF(gd_binding) + 1 * SIZEOF(gd_region) + 1 * SIZEOF(gd_segment);
header = (header_struct *)malloc(ROUND_UP(size, DISK_BLOCK_SIZE));
memset(header, 0, ROUND_UP(size, DISK_BLOCK_SIZE));
header->filesize = size;
size = ROUND_UP(size, DISK_BLOCK_SIZE);
memcpy(header->label, GDE_LABEL_LITERAL, SIZEOF(GDE_LABEL_LITERAL));
addr = (gd_addr *)((char *)header + SIZEOF(header_struct));
addr->max_rec_size = 256;
addr->maps = (gd_binding*)((UINTPTR_T)addr + SIZEOF(gd_addr));
addr->n_maps = 3;
addr->regions = (gd_region*)((INTPTR_T)(addr->maps) + 3 * SIZEOF(gd_binding));
addr->n_regions = 1;
addr->segments = (gd_segment*)((INTPTR_T)(addr->regions) + SIZEOF(gd_region));
addr->n_segments = 1;
addr->link = 0;
addr->tab_ptr = 0;
addr->id = 0;
addr->local_locks = 0;
addr->end = (UINTPTR_T)(addr->segments + 1 * SIZEOF(gd_segment));
int4_ptr = (int4*)(addr->maps);
*int4_ptr++ = 0x232FFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
SAVE_ADDR_REGION
*int4_ptr++ = 0x24FFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
SAVE_ADDR_REGION
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
*int4_ptr++ = 0xFFFFFFFF;
SAVE_ADDR_REGION
region = (gd_region*)(addr->regions);
segment = (gd_segment*)(addr->segments);
region->rname_len = 7;
memcpy(region->rname,"DEFAULT",7);
for (map = addr->maps, map_top = map + addr->n_maps; map < map_top ; map++)
{
t_offset = map->reg.offset;
map->reg.addr = (gd_region *)((char *)addr + t_offset);
}
for (region = addr->regions, region_top = region + addr->n_regions; region < region_top ; region++)
{
t_offset = region->dyn.offset;
region->dyn.addr = (gd_segment *)((char *)addr + t_offset);
}
/* Should be using gd_id_ptr_t below, but ok for now since malloc won't return > 4G
* and since addr->id is a 4-byte pointer only until we change the format of the global directory.
*/
addr->id = (gd_id *)malloc(SIZEOF(gd_id));
memset(addr->id, 0, SIZEOF(gd_id));
addr->tab_ptr = (hash_table_mname *)malloc(SIZEOF(hash_table_mname));
init_hashtab_mname((hash_table_mname *)addr->tab_ptr, 0, HASHTAB_NO_COMPACT, HASHTAB_NO_SPARE_TABLE );
name = (gdr_name *)malloc(SIZEOF(gdr_name));
MALLOC_CPY_LIT(name->name.addr, "DUMMY.GLD");
if (gdr_name_head)
name->link = (gdr_name *)gdr_name_head;
else
name->link = 0;
gdr_name_head = name;
gdr_name_head->gd_ptr = addr;
return addr;
}