fis-gtm/sr_unix/setterm.c

118 lines
2.6 KiB
C
Raw Normal View History

/****************************************************************
* *
* 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_termios.h"
#include "io.h"
#include "iosp.h"
#include "iottdef.h"
#include "gtmio.h"
#include "eintr_wrappers.h"
#include "setterm.h"
#include "gtm_isanlp.h"
void setterm(io_desc *ioptr)
{
int status;
int save_errno;
struct termios t;
d_tt_struct *tt_ptr;
error_def(ERR_TCSETATTR);
tt_ptr = (d_tt_struct *) ioptr->dev_sp;
t = *tt_ptr->ttio_struct;
if (tt_ptr->canonical)
{ t.c_lflag &= ~(ECHO);
t.c_lflag |= ICANON;
}else
{ t.c_lflag &= ~(ICANON | ECHO);
t.c_cc[VTIME] = 8;
t.c_cc[VMIN] = 1;
}
t.c_iflag &= ~(ICRNL);
Tcsetattr(tt_ptr->fildes, TCSANOW, &t, status);
if (0 != status)
{
save_errno = errno;
if (gtm_isanlp(tt_ptr->fildes) == 0)
rts_error(VARLSTCNT(4) ERR_TCSETATTR, 1, tt_ptr->fildes, save_errno);
}
return;
}
/* These routines are here because it is frightfully important to keep them
in synch with setterm. When they get out of line, a r x:0 causes your
terminal to be unreachable thereafter.
*/
/* iott_mterm sets the inter-character timer (t.c_cc[VTIME]) to 0.0 seconds
so that a read with a zero timeout (ie. Read x:0) will not wait.
*/
void iott_mterm(io_desc *ioptr)
{
int status;
struct termios t;
d_tt_struct *tt_ptr;
error_def(ERR_TCSETATTR);
tt_ptr = (d_tt_struct *) ioptr->dev_sp;
t = *tt_ptr->ttio_struct;
if (tt_ptr->canonical)
{ t.c_lflag &= ~(ECHO);
t.c_lflag |= ICANON;
}else
{ t.c_lflag &= ~(ICANON | ECHO);
#ifdef __MVS__
t.c_cc[VTIME] = 1;
#else
t.c_cc[VTIME] = 0;
#endif
t.c_cc[VMIN] = 0;
}
t.c_iflag &= ~(ICRNL);
Tcsetattr(tt_ptr->fildes, TCSANOW, &t, status);
if (0 != status)
rts_error(VARLSTCNT(4) ERR_TCSETATTR, 1, tt_ptr->fildes, errno);
return;
}
/* iott_rterm restores the inter-character timer (t.c_cc[VTIME]) to 0.8 seconds
*/
void iott_rterm(io_desc *ioptr)
{
int status;
struct termios t;
d_tt_struct *tt_ptr;
tt_ptr = (d_tt_struct *) ioptr->dev_sp;
t = *tt_ptr->ttio_struct;
if (tt_ptr->canonical)
{ t.c_lflag &= ~(ECHO);
t.c_lflag |= ICANON;
}else
{ t.c_lflag &= ~(ICANON | ECHO);
t.c_cc[VTIME] = 8;
t.c_cc[VMIN] = 1;
}
t.c_iflag &= ~(ICRNL);
Tcsetattr(tt_ptr->fildes, TCSANOW, &t, status);
if (0 != status)
rts_error(VARLSTCNT(1) status);
return;
}