Added source code
This commit is contained in:
+216
@@ -0,0 +1,216 @@
|
||||
/*
|
||||
* TTY setup routines. These are the BSD-style routines.
|
||||
*/
|
||||
|
||||
static struct sgttyb _raw_tty, _original_tty;
|
||||
static struct ltchars _raw_ltchars, _original_ltchars;
|
||||
static struct tchars _raw_tchars, _original_tchars;
|
||||
static int _raw_lmode, _original_lmode;
|
||||
|
||||
/*
|
||||
* current raw state
|
||||
*/
|
||||
static short _inraw = 0;
|
||||
|
||||
/*
|
||||
* Set up the tty driver
|
||||
*
|
||||
* Args: state -- which state to put it in. 1 means go into raw (cbreak),
|
||||
* 0 out of raw.
|
||||
*
|
||||
* Result: returns 0 if successful and -1 if not.
|
||||
*/
|
||||
int
|
||||
Raw(state)
|
||||
int state;
|
||||
{
|
||||
/** state is either ON or OFF, as indicated by call **/
|
||||
/* Check return code only on first call. If it fails we're done for and
|
||||
if it goes OK the others will probably go OK too. */
|
||||
|
||||
if(state == 0 && _inraw){
|
||||
/*----- restore state to original -----*/
|
||||
if(ioctl(STDIN_FD, TIOCSETP, &_original_tty) < 0)
|
||||
return(-1);
|
||||
|
||||
(void)ioctl(STDIN_FD, TIOCSLTC, &_original_ltchars);
|
||||
(void)ioctl(STDIN_FD, TIOCSETC, &_original_tchars);
|
||||
(void)ioctl(STDIN_FD, TIOCLSET, &_original_lmode);
|
||||
_inraw = 0;
|
||||
}
|
||||
else if(state == 1 && ! _inraw){
|
||||
/*----- Go into raw mode (cbreak actually) ----*/
|
||||
if(ioctl(STDIN_FD, TIOCGETP, &_original_tty) < 0)
|
||||
return(-1);
|
||||
|
||||
(void)ioctl(STDIN_FD, TIOCGETP, &_raw_tty);
|
||||
(void)ioctl(STDIN_FD, TIOCGETC, &_original_tchars);
|
||||
(void)ioctl(STDIN_FD, TIOCGETC, &_raw_tchars);
|
||||
(void)ioctl(STDIN_FD, TIOCGLTC, &_original_ltchars);
|
||||
(void)ioctl(STDIN_FD, TIOCGLTC, &_raw_ltchars);
|
||||
(void)ioctl(STDIN_FD, TIOCLGET, &_original_lmode);
|
||||
(void)ioctl(STDIN_FD, TIOCLGET, &_raw_lmode);
|
||||
|
||||
_raw_tty.sg_flags &= ~(ECHO); /* echo off */
|
||||
_raw_tty.sg_flags |= CBREAK; /* raw on */
|
||||
_raw_tty.sg_flags &= ~CRMOD; /* Turn off CR -> LF mapping */
|
||||
|
||||
_raw_tchars.t_intrc = -1; /* Turn off ^C and ^D */
|
||||
_raw_tchars.t_eofc = -1;
|
||||
|
||||
_raw_ltchars.t_lnextc = -1; /* Turn off ^V so we can use it */
|
||||
_raw_ltchars.t_dsuspc = -1; /* Turn off ^Y so we can use it */
|
||||
_raw_ltchars.t_suspc = -1; /* Turn off ^Z; we just read 'em */
|
||||
_raw_ltchars.t_werasc = -1; /* Turn off ^w word erase */
|
||||
_raw_ltchars.t_rprntc = -1; /* Turn off ^R reprint line */
|
||||
_raw_ltchars.t_flushc = -1; /* Turn off ^O output flush */
|
||||
|
||||
(void)ioctl(STDIN_FD, TIOCSETP, &_raw_tty);
|
||||
(void)ioctl(STDIN_FD, TIOCSLTC, &_raw_ltchars);
|
||||
(void)ioctl(STDIN_FD, TIOCSETC, &_raw_tchars);
|
||||
(void)ioctl(STDIN_FD, TIOCLSET, &_raw_lmode);
|
||||
_inraw = 1;
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Set up the tty driver to use XON/XOFF flow control
|
||||
*
|
||||
* Args: state -- True to make sure XON/XOFF turned on, FALSE off.
|
||||
*
|
||||
* Result: none.
|
||||
*/
|
||||
void
|
||||
xonxoff_proc(state)
|
||||
int state;
|
||||
{
|
||||
if(_inraw){
|
||||
if(state){
|
||||
if(_raw_tchars.t_startc == -1 || _raw_tchars.t_stopc == -1){
|
||||
_raw_tchars.t_startc = 'Q' - '@'; /* Turn ON ^S/^Q */
|
||||
_raw_tchars.t_stopc = 'S' - '@';
|
||||
(void)ioctl(STDIN_FD, TIOCSETC, &_raw_tchars);
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(!(_raw_tchars.t_startc == -1 && _raw_tchars.t_stopc == -1)){
|
||||
_raw_tchars.t_startc = -1; /* Turn off ^S/^Q */
|
||||
_raw_tchars.t_stopc = -1;
|
||||
(void)ioctl(STDIN_FD, TIOCSETC, &_raw_tchars);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Set up the tty driver to do LF->CR translation
|
||||
*
|
||||
* Args: state -- True to turn on translation, false to write raw LF's
|
||||
*
|
||||
* Result: none.
|
||||
*/
|
||||
void
|
||||
crlf_proc(state)
|
||||
int state;
|
||||
{
|
||||
if(_inraw){
|
||||
if(state){ /* turn ON NL->CR on output */
|
||||
if(!(_raw_tty.sg_flags & CRMOD)){
|
||||
_raw_tty.sg_flags |= CRMOD;
|
||||
(void)ioctl(STDIN_FD, TIOCSETP, &_raw_tty);
|
||||
}
|
||||
}
|
||||
else{ /* turn OFF NL-CR on output */
|
||||
if(_raw_tty.sg_flags & CRMOD){
|
||||
_raw_tty.sg_flags &= ~CRMOD;
|
||||
(void)ioctl(STDIN_FD, TIOCSETP, &_raw_tty);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Set up the tty driver to hanle interrupt char
|
||||
*
|
||||
* Args: state -- True to turn on interrupt char, false to not
|
||||
*
|
||||
* Result: tty driver that'll send us SIGINT or not
|
||||
*/
|
||||
void
|
||||
intr_proc(state)
|
||||
int state;
|
||||
{
|
||||
if(_inraw){
|
||||
if(state){
|
||||
_raw_tchars.t_intrc = ctrl('C');
|
||||
(void)ioctl(STDIN_FD, TIOCSETC, &_raw_tchars);
|
||||
}
|
||||
else{
|
||||
_raw_tchars.t_intrc = -1;
|
||||
(void)ioctl(STDIN_FD, TIOCSETC, &_raw_tchars);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Discard any pending input characters
|
||||
*
|
||||
* Args: none
|
||||
*
|
||||
* Result: pending input buffer flushed
|
||||
*/
|
||||
void
|
||||
flush_input()
|
||||
{
|
||||
#ifdef TIOCFLUSH
|
||||
#ifdef FREAD
|
||||
int i = FREAD;
|
||||
#else
|
||||
int i = 1;
|
||||
#endif
|
||||
ioctl(STDIN_FD, TIOCFLUSH, &i);
|
||||
#endif /* TIOCFLUSH */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Turn off hi bit stripping
|
||||
*/
|
||||
void
|
||||
bit_strip_off()
|
||||
{
|
||||
_raw_lmode |= LPASS8;
|
||||
#ifdef NXT
|
||||
_raw_lmode |= LPASS8OUT;
|
||||
#endif
|
||||
(void)ioctl(STDIN_FD, TIOCLSET, &_raw_lmode);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Turn off quit character (^\) if possible
|
||||
*/
|
||||
void
|
||||
quit_char_off()
|
||||
{
|
||||
_raw_tchars.t_quitc = -1;
|
||||
(void)ioctl(STDIN_FD, TIOCSETC, &_raw_tchars);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns TRUE if tty is < 4800, 0 otherwise.
|
||||
*/
|
||||
int
|
||||
ttisslow()
|
||||
{
|
||||
return((int)_raw_tty.sg_ispeed < B4800);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user