fis-gtm/sr_port/iotcp_use.c

123 lines
3.1 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 "gtm_string.h"
#include "gtm_unistd.h"
#include "gtm_inet.h"
#include "gtm_iconv.h"
#include "gtm_stdio.h"
#include "copy.h"
#include "io.h"
#include "iosp.h"
#include "io_params.h"
#include "iotcpdef.h"
#include "stringpool.h"
typedef struct
{
unsigned short mem;
unsigned short grp;
} uic_struct;
LITREF unsigned char io_params_size[];
void iotcp_use(io_desc *iod, mval *pp)
{
unsigned char c;
int4 length, width;
d_tcp_struct *tcpptr, newtcp;
int p_offset;
error_def(ERR_DEVPARMNEG);
error_def(ERR_RMWIDTHPOS);
#ifdef DEBUG_TCP
PRINTF("%s >>>\n", __FILE__);
#endif
p_offset = 0;
tcpptr = (d_tcp_struct *)iod->dev_sp;
/* copy existing parameters */
memcpy(&newtcp, tcpptr, SIZEOF(d_tcp_struct));
while (*(pp->str.addr + p_offset) != iop_eol)
{
assert((params) *(pp->str.addr + p_offset) < (params) n_iops);
switch (c = *(pp->str.addr + p_offset++))
{
case iop_width:
GET_LONG(width, pp->str.addr + p_offset);
if (width == 0)
newtcp.width = TCPDEF_WIDTH;
else if (width > 0)
newtcp.width = width;
else
rts_error(VARLSTCNT(1) ERR_DEVPARMNEG);
break;
case iop_length:
GET_LONG(length, pp->str.addr + p_offset);
if (length == 0)
newtcp.length = TCPDEF_LENGTH;
else if (length > 0)
newtcp.length = length;
else
rts_error(VARLSTCNT(1) ERR_DEVPARMNEG);
break;
case iop_urgent:
newtcp.urgent = TRUE;
break;
case iop_nourgent:
newtcp.urgent = FALSE;
break;
case iop_exception:
iod->error_handler.len = *(pp->str.addr + p_offset);
iod->error_handler.addr = (char *)(pp->str.addr + p_offset + 1);
s2pool(&iod->error_handler);
break;
case iop_ipchset:
#if defined(KEEP_zOS_EBCDIC) || defined(VMS)
if ( (iconv_t)0 != iod->input_conv_cd )
{
ICONV_CLOSE_CD(iod->input_conv_cd);
}
SET_CODE_SET(iod->in_code_set, (char *)(pp->str.addr + p_offset + 1));
if (DEFAULT_CODE_SET != iod->in_code_set)
ICONV_OPEN_CD(iod->input_conv_cd, INSIDE_CH_SET, (char *)(pp->str.addr + p_offset + 1));
#endif
break;
case iop_opchset:
#if defined(KEEP_zOS_EBCDIC) || defined(VMS)
if ( (iconv_t)0 != iod->output_conv_cd )
{
ICONV_CLOSE_CD(iod->output_conv_cd);
}
SET_CODE_SET(iod->out_code_set, (char *)(pp->str.addr + p_offset + 1));
if (DEFAULT_CODE_SET != iod->out_code_set)
ICONV_OPEN_CD(iod->output_conv_cd, (char *)(pp->str.addr + p_offset + 1), INSIDE_CH_SET);
#endif
break;
default:
break;
}
p_offset += ((IOP_VAR_SIZE == io_params_size[c]) ?
(unsigned char)*(pp->str.addr + p_offset) + 1 : io_params_size[c]);
}
/* commit changes */
memcpy(tcpptr, &newtcp, SIZEOF(d_tcp_struct));
#ifdef DEBUG_TCP
PRINTF("%s <<<\n", __FILE__);
#endif
return;
}