213 lines
5.1 KiB
C
213 lines
5.1 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 "gtm_string.h"
|
|
#include "gtm_fcntl.h"
|
|
|
|
#include "gtm_unistd.h"
|
|
#include <errno.h>
|
|
#include "gtm_stat.h"
|
|
#include "gtm_iconv.h"
|
|
|
|
#ifdef __MVS__
|
|
#include "gtm_zos_io.h"
|
|
#endif
|
|
#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 "gtmio.h"
|
|
#include "io.h"
|
|
#include "iosp.h"
|
|
#include "io_params.h"
|
|
#include "stringpool.h"
|
|
#include "util.h"
|
|
#include "op.h"
|
|
#include "gtm_utf8.h"
|
|
#include "gtm_conv.h"
|
|
|
|
#ifdef __osf__
|
|
#pragma pointer_size (save)
|
|
#pragma pointer_size (long)
|
|
#endif
|
|
|
|
GBLREF int (*op_open_ptr)(mval *v, mval *p, int t, mval *mspace);
|
|
GBLREF spdesc stringpool;
|
|
GBLREF gtm_chset_t dse_over_chset;
|
|
|
|
#ifdef __osf__
|
|
#pragma pointer_size (restore)
|
|
#endif
|
|
|
|
static int patch_fd;
|
|
static char patch_ofile[256];
|
|
static short patch_len;
|
|
static char ch_set_name[MAX_CHSET_NAME];
|
|
|
|
GBLREF enum dse_fmt dse_dmp_format;
|
|
|
|
void dse_open (void)
|
|
{
|
|
unsigned short cli_len;
|
|
int4 save_errno;
|
|
|
|
mval val;
|
|
mval open_pars, use_pars;
|
|
mstr chset_mstr;
|
|
int cnt;
|
|
|
|
static readonly unsigned char open_params_list[] =
|
|
{
|
|
(unsigned char)iop_newversion,
|
|
(unsigned char)iop_m,
|
|
(unsigned char)iop_nowrap,
|
|
(unsigned char)iop_eol
|
|
};
|
|
|
|
/*set iop_width=1MB(1*1024*1024)*/
|
|
static readonly unsigned char use_params_list[] =
|
|
{
|
|
(unsigned char)iop_width,
|
|
# ifdef BIGENDIAN
|
|
(unsigned char)0x0, (unsigned char)0x10, (unsigned char)0x0, (unsigned char)0x0
|
|
# else
|
|
(unsigned char)0x0, (unsigned char)0x0, (unsigned char)0x10, (unsigned char)0x0
|
|
# endif
|
|
};
|
|
|
|
if (cli_present("FILE") == CLI_PRESENT)
|
|
{
|
|
if (CLOSED_FMT != dse_dmp_format)
|
|
{
|
|
util_out_print("Error: output file already open.",TRUE);
|
|
util_out_print("Current output file: !AD", TRUE, strlen(patch_ofile), &patch_ofile[0]);
|
|
return;
|
|
}
|
|
cli_len = SIZEOF(patch_ofile);
|
|
if (!cli_get_str("FILE", patch_ofile, &cli_len))
|
|
return;
|
|
if (0 == cli_len)
|
|
{
|
|
util_out_print("Error: must specify a file name.",TRUE);
|
|
return;
|
|
}
|
|
patch_ofile[cli_len] = 0;
|
|
patch_len = cli_len;
|
|
|
|
val.mvtype = MV_STR;
|
|
val.str.len = patch_len;
|
|
val.str.addr = (char *)patch_ofile;
|
|
open_pars.mvtype = MV_STR;
|
|
open_pars.str.len = SIZEOF(open_params_list);
|
|
open_pars.str.addr = (char *)open_params_list;
|
|
(*op_open_ptr)(&val, &open_pars, 0, NULL);
|
|
use_pars.mvtype = MV_STR;
|
|
use_pars.str.len = SIZEOF(use_params_list);
|
|
use_pars.str.addr = (char *)use_params_list;
|
|
op_use(&val, &use_pars);
|
|
|
|
if (CLI_PRESENT == cli_present("OCHSET"))
|
|
{
|
|
cli_len = SIZEOF(ch_set_name);
|
|
if (cli_get_str("OCHSET", ch_set_name, &cli_len))
|
|
{
|
|
if (0 == cli_len)
|
|
{
|
|
util_out_print("Error: must specify a charactor set name.",TRUE);
|
|
return;
|
|
}
|
|
#ifdef KEEP_zOS_EBCDIC
|
|
ch_set_name[cli_len] = 0;
|
|
ch_set_len = cli_len;
|
|
if ( (iconv_t)0 != dse_over_cvtcd )
|
|
{
|
|
ICONV_CLOSE_CD(dse_over_cvtcd);
|
|
}
|
|
ICONV_OPEN_CD(dse_over_cvtcd, INSIDE_CH_SET, ch_set_name);
|
|
#else
|
|
chset_mstr.addr = ch_set_name;
|
|
chset_mstr.len = cli_len;
|
|
SET_ENCODING(dse_over_chset, &chset_mstr);
|
|
#endif
|
|
}
|
|
} else
|
|
#ifdef KEEP_zOS_EBCDIC
|
|
if ( (iconv_t) 0 == dse_over_cvtcd )
|
|
ICONV_OPEN_CD(dse_over_cvtcd, INSIDE_CH_SET, OUTSIDE_CH_SET);
|
|
#else
|
|
dse_over_chset = CHSET_M;
|
|
#endif
|
|
dse_dmp_format = OPEN_FMT;
|
|
} else
|
|
{
|
|
if (CLOSED_FMT != dse_dmp_format)
|
|
util_out_print("Current output file: !AD", TRUE, strlen(patch_ofile), &patch_ofile[0]);
|
|
else
|
|
util_out_print("No current output file.",TRUE);
|
|
}
|
|
return;
|
|
|
|
}
|
|
|
|
boolean_t dse_fdmp_output (void *addr, int4 len)
|
|
{
|
|
mval val;
|
|
static char *buffer = NULL;
|
|
static int bufsiz = 0;
|
|
|
|
assert(len >= 0);
|
|
if (len + 1 > bufsiz)
|
|
{
|
|
if (buffer)
|
|
free(buffer);
|
|
bufsiz = len + 1;
|
|
buffer = (char *)malloc(bufsiz);
|
|
}
|
|
if (len)
|
|
{
|
|
memcpy(buffer, addr, len);
|
|
buffer[len] = 0;
|
|
val.mvtype = MV_STR;
|
|
val.str.addr = (char *)buffer;
|
|
val.str.len = len;
|
|
op_write(&val);
|
|
}
|
|
op_wteol(1);
|
|
return TRUE;
|
|
}
|
|
|
|
void dse_close(void)
|
|
{
|
|
mval val;
|
|
mval pars;
|
|
unsigned char no_param = (unsigned char)iop_eol;
|
|
|
|
if (CLOSED_FMT != dse_dmp_format)
|
|
{
|
|
util_out_print("Closing output file: !AD",TRUE,LEN_AND_STR(patch_ofile));
|
|
val.mvtype = pars.mvtype = MV_STR;
|
|
val.str.addr = (char *)patch_ofile;
|
|
val.str.len = patch_len;
|
|
pars.str.len = SIZEOF(iop_eol);
|
|
pars.str.addr = (char *)&no_param;
|
|
op_close(&val, &pars);
|
|
dse_dmp_format = CLOSED_FMT;
|
|
} else
|
|
util_out_print("Error: no current output file.",TRUE);
|
|
return;
|
|
}
|