fis-gtm/sr_port/op_close.c

107 lines
2.8 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"
#ifdef VMS
#include <devdef.h>
#include <rms.h>
#endif
#include "io.h"
#include "iosp.h"
#include "op.h"
#include "trans_log_name.h"
#include "iormdef.h"
GBLREF io_log_name *io_root_log_name;
GBLREF io_pair io_curr_device;
GBLREF io_pair io_std_device;
GBLREF io_desc *active_device;
error_def(ERR_LOGTOOLONG);
error_def(ERR_TEXT);
void op_close(mval *v, mval *p)
{
char buf[MAX_TRANS_NAME_LEN]; /* buffer to hold translated name */
io_desc *ciod; /* close io descriptor */
io_log_name *l;
io_log_name *prev;
io_log_name *tl; /* logical record for translated name */
int4 stat; /* status */
mstr tn; /* translated name */
d_rm_struct *rm_ptr;
MV_FORCE_STR(v);
MV_FORCE_STR(p);
stat = TRANS_LOG_NAME(&v->str, &tn, buf, SIZEOF(buf), dont_sendmsg_on_log2long);
if (SS_NORMAL == stat)
{
if (0 == (tl = get_log_name(&tn, NO_INSERT)))
return;
ciod = tl->iod;
if (0 == ciod || TRUE == ciod->perm ||
(ciod->state != dev_open && tcp != ciod->type))
return;
for (prev = io_root_log_name, l = prev->next; l != 0; prev = l, l = l->next)
{
if (l->iod == ciod && l != tl)
{
prev->next = l->next;
free(l);
l = prev;
}
}
} else if ((SS_NOLOGNAM == stat) VMS_ONLY(|| (0 == v->str.len)))
{
if (0 == (l = get_log_name(&v->str, NO_INSERT)))
return;
else if (0 == (ciod = l->iod) || TRUE == ciod->perm
|| (dev_open != ciod->state && tcp != ciod->type))
return;
}
# ifdef UNIX
else if (SS_LOG2LONG == stat)
rts_error(VARLSTCNT(5) ERR_LOGTOOLONG, 3, v->str.len, v->str.addr, SIZEOF(buf) - 1);
# endif
else
rts_error(VARLSTCNT(1) stat);
active_device = ciod;
if (io_curr_device.in == ciod)
{
io_curr_device.in = io_std_device.in;
/* On z/OS if is a fifo and it is read and write then need to set the current
device out to the std device out */
# ifdef __MVS__
if (ciod->type == rm)
{
rm_ptr = (d_rm_struct *) ciod->dev_sp;
if (rm_ptr->fifo && (ciod->pair.out != ciod))
io_curr_device.out = io_std_device.out;
}
# endif
}
if (io_curr_device.out == ciod)
io_curr_device.out = io_std_device.out;
#if defined(KEEP_zOS_EBCDIC) || defined(VMS)
if (DEFAULT_CODE_SET != ciod->in_code_set)
ICONV_CLOSE_CD(ciod->input_conv_cd);
if (DEFAULT_CODE_SET != ciod->out_code_set)
ICONV_CLOSE_CD(ciod->output_conv_cd);
#endif
(ciod->disp_ptr->close)(ciod, p);
active_device = 0;
}