/**************************************************************** * * * 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 "gtm_string.h" #include "gtm_fcntl.h" #include "gtm_unistd.h" #include "gtm_stat.h" #include #ifdef __MVS__ #include "gtm_zos_io.h" #endif #include "parse_file.h" #include "gdsroot.h" #include "gtm_facility.h" #include "fileinfo.h" #include "gdsbt.h" #include "gdsfhead.h" #include "filestruct.h" #include "gbldirnam.h" #include "gtmio.h" #include "eintr_wrappers.h" #include "stringpool.h" #include "is_file_identical.h" #include "dpgbldir.h" #include "dpgbldir_sysops.h" #include "gtm_logicals.h" char LITDEF gde_labels[GDE_LABEL_NUM][GDE_LABEL_SIZE] = { GDE_LABEL_LITERAL }; GBLREF mval dollar_zgbldir; error_def(ERR_ZGBLDIRACC); error_def(ERR_IOEOF); #ifdef __MVS__ /* Need the ERR_BADTAG and ERR_TEXT error_defs for the TAG_POLICY macro warning */ error_def(ERR_TEXT); error_def(ERR_BADTAG); #endif mstr *get_name(mstr *ms) { int4 status; char c[MAX_FBUFF + 1]; parse_blk pblk; mstr *new; memset(&pblk, 0, SIZEOF(pblk)); pblk.buffer = c; pblk.buff_size = MAX_FBUFF; pblk.def1_buf = DEF_GDR_EXT; pblk.def1_size = SIZEOF(DEF_GDR_EXT) - 1; status = parse_file(ms,&pblk); if (!(status & 1)) rts_error(VARLSTCNT(9) ERR_ZGBLDIRACC, 6, ms->len, ms->addr, LEN_AND_LIT(""), LEN_AND_LIT(""), status); new = (mstr *)malloc(SIZEOF(mstr)); new->len = pblk.b_esl; new->addr = (char *)malloc(pblk.b_esl); memcpy(new->addr, pblk.buffer, pblk.b_esl); return new; } void *open_gd_file(mstr *v) { file_pointer *fp; ZOS_ONLY(int realfiletag;) fp = (file_pointer*)malloc(SIZEOF(*fp)); fp->v.len = v->len; fp->v.addr = (char *)malloc(v->len + 1); memcpy(fp->v.addr, v->addr, v->len); *((char*)((char*)fp->v.addr + v->len)) = 0; /* Null terminate string */ if (FD_INVALID == (fp->fd = OPEN(fp->v.addr, O_RDONLY))) { if (!dollar_zgbldir.str.len || ((dollar_zgbldir.str.len == fp->v.len) && !memcmp(dollar_zgbldir.str.addr, fp->v.addr, fp->v.len))) { rts_error(VARLSTCNT(9) ERR_ZGBLDIRACC, 6, fp->v.len, fp->v.addr, LEN_AND_LIT(". Cannot continue"), LEN_AND_LIT(""), errno); assert(FALSE); } rts_error(VARLSTCNT(9) ERR_ZGBLDIRACC, 6, fp->v.len, fp->v.addr, LEN_AND_LIT(". Retaining "), dollar_zgbldir.str.len, dollar_zgbldir.str.addr, errno); } #ifdef __MVS__ if (-1 == gtm_zos_tag_to_policy(fp->fd, TAG_BINARY, &realfiletag)) TAG_POLICY_SEND_MSG(fp->v.addr, errno, realfiletag, TAG_BINARY); #endif return (void *)fp; } bool comp_gd_addr(gd_addr *gd_ptr, file_pointer *file_ptr) { int fstat_res; struct stat buf; FSTAT_FILE(file_ptr->fd, &buf, fstat_res); if (-1 == fstat_res) rts_error(VARLSTCNT(9) ERR_ZGBLDIRACC, 6, file_ptr->v.len, file_ptr->v.addr, LEN_AND_LIT(""), LEN_AND_LIT(""), errno); return is_gdid_stat_identical(gd_ptr->id, &buf); } void fill_gd_addr_id(gd_addr *gd_ptr, file_pointer *file_ptr) { int fstat_res; struct stat buf; gd_ptr->id = (gd_id *) malloc(SIZEOF(gd_id)); /* Need to convert to gd_id_ptr_t during the 64-bit port */ FSTAT_FILE(file_ptr->fd, &buf, fstat_res); if (-1 == fstat_res) rts_error(VARLSTCNT(9) ERR_ZGBLDIRACC, 6, file_ptr->v.len, file_ptr->v.addr, LEN_AND_LIT(""), LEN_AND_LIT(""), errno); set_gdid_from_stat(gd_ptr->id, &buf); return; } void close_gd_file(file_pointer *file_ptr) { int rc; CLOSEFILE_RESET(file_ptr->fd, rc); /* resets "file_ptr->fd" to FD_INVALID */ free(file_ptr->v.addr); free(file_ptr); return; } void file_read(file_pointer *file_ptr, int4 size, uchar_ptr_t buff, int4 pos) { int4 save_errno; LSEEKREAD(file_ptr->fd, (off_t)(pos - 1 ) * DISK_BLOCK_SIZE, buff, size, save_errno); if (0 != save_errno) if (-1 == save_errno) rts_error(VARLSTCNT(1) ERR_IOEOF); else rts_error(VARLSTCNT(9) ERR_ZGBLDIRACC, 6, file_ptr->v.len, file_ptr->v.addr, LEN_AND_LIT(""), LEN_AND_LIT(""), save_errno); return; } void dpzgbini(void) { mstr temp_mstr; char temp_buff[MAX_FBUFF + 1]; uint4 status; parse_blk pblk; temp_mstr.addr = GTM_GBLDIR; temp_mstr.len = SIZEOF(GTM_GBLDIR) - 1; memset(&pblk, 0, SIZEOF(pblk)); pblk.buffer = temp_buff; pblk.buff_size = MAX_FBUFF; pblk.def1_buf = DEF_GDR_EXT; pblk.def1_size = SIZEOF(DEF_GDR_EXT) - 1; status = parse_file(&temp_mstr, &pblk); dollar_zgbldir.mvtype = MV_STR; dollar_zgbldir.str.len = SIZEOF(GTM_GBLDIR) - 1; dollar_zgbldir.str.addr = GTM_GBLDIR; if (status & 1) { dollar_zgbldir.str.len = pblk.b_esl; dollar_zgbldir.str.addr = pblk.buffer; } s2pool(&dollar_zgbldir.str); }