118 lines
2.6 KiB
C
118 lines
2.6 KiB
C
|
/****************************************************************
|
||
|
* *
|
||
|
* 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;
|
||
|
}
|