/* tty.c 4.24 82/07/24 */
* TTY subroutines common to more than one line discipline
* Table giving parity for characters and indicating
* character classes to tty driver. In particular,
* if the low 6 bits are 0, then the character needs
* no special processing on output.
0001,0201,0201,0001,0201,0001,0001,0201,
0202,0004,0003,0201,0005,0206,0201,0001,
0201,0001,0001,0201,0001,0201,0201,0001,
0001,0201,0201,0001,0201,0001,0001,0201,
0200,0000,0000,0200,0000,0200,0200,0000,
0000,0200,0200,0000,0200,0000,0000,0200,
0000,0200,0200,0000,0200,0000,0000,0200,
0200,0000,0000,0200,0000,0200,0200,0000,
0200,0000,0000,0200,0000,0200,0200,0000,
0000,0200,0200,0000,0200,0000,0000,0200,
0000,0200,0200,0000,0200,0000,0000,0200,
0200,0000,0000,0200,0000,0200,0200,0000,
0000,0200,0200,0000,0200,0000,0000,0200,
0200,0000,0000,0200,0000,0200,0200,0000,
0200,0000,0000,0200,0000,0200,0200,0000,
0000,0200,0200,0000,0200,0000,0000,0201,
* 7 bit ascii ends with the last character above,
* but we contine through all 256 codes for the sake
* of the tty output routines which use special vax
* instructions which need a 256 character trt table.
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007,
0007,0007,0007,0007,0007,0007,0007,0007
* Input mapping table-- if an entry is non-zero, when the
* corresponding character is typed preceded by "\" the escape
* sequence is replaced by the table value. Mostly used for
* upper-case only terminals.
000,000,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,
000,'|',000,000,000,000,000,'`',
'{','}',000,000,000,000,000,000,
000,000,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,
000,000,000,000,000,000,'~',000,
000,'A','B','C','D','E','F','G',
'H','I','J','K','L','M','N','O',
'P','Q','R','S','T','U','V','W',
'X','Y','Z',000,000,000,000,000,
{ 100,100,100,100,100,100,100,200,200,400,400,400,650,650,650,650 };
{ 30, 30, 30, 30, 30, 30, 30, 50, 50,120,120,120,125,125,125,125 };
* set default control characters.
* Wait for output to drain, then flush input waiting.
while (tp
->t_outq
.c_cc
&& tp
->t_state
&TS_CARR_ON
&& tp
->t_oproc
) { /* kludge for pty */
tp
->t_state
|= TS_ASLEEP
;
sleep((caddr_t
)&tp
->t_outq
, TTOPRI
);
while (getc(&tp
->t_canq
) >= 0)
wakeup((caddr_t
)&tp
->t_rawq
);
wakeup((caddr_t
)&tp
->t_outq
);
tp
->t_state
&= ~TS_TTSTOP
;
(*cdevsw
[major(tp
->t_dev
)].d_stop
)(tp
, rw
);
while (getc(&tp
->t_outq
) >= 0)
while (getc(&tp
->t_rawq
) >= 0)
tp
->t_rocount
= 0; /* local */
* Send stop character on input overflow.
x
= tp
->t_rawq
.c_cc
+ tp
->t_canq
.c_cc
;
if (tp
->t_rawq
.c_cc
> TTYHOG
) {
flushtty(tp
, FREAD
|FWRITE
);
tp
->t_state
&= ~TS_TBLOCK
;
if (putc(tun
.t_stopc
, &tp
->t_outq
)==0) {
tp
->t_state
|= TS_TBLOCK
;
* Restart typewriter output following a delay
* The name of the routine is passed to the timeout
* subroutine and it is called during a clock interrupt.
printf("ttrstrt: arg was 0!\n");
tp
->t_state
&= ~TS_TIMEOUT
;
* Start output on the typewriter. It is used from the top half
* after some characters have been put on the output queue,
* from the interrupt routine to transmit the next
* character, and after a timeout has finished.
if((tp
->t_state
&(TS_TIMEOUT
|TS_TTSTOP
|TS_BUSY
)) == 0 &&
tp
->t_oproc
) /* kludge for pty */
* Common code for tty ioctls.
ttioctl(tp
, com
, addr
, flag
)
* This is especially so that isatty() will
* fail when carrier is gone.
if ((tp
->t_state
&TS_CARR_ON
) == 0) {
* If the ioctl involves modification,
* insist on being able to write the device,
* and hang if in the background.
/* this is reasonable, but impractical...
if ((flag & FWRITE) == 0) {
while (tp
->t_line
== NTTYDISC
&&
u
.u_procp
->p_pgrp
!= tp
->t_pgrp
&& tp
== u
.u_ttyp
&&
(u
.u_procp
->p_flag
&SVFORK
) == 0 &&
u
.u_signal
[SIGTTOU
] != SIG_IGN
&&
u
.u_signal
[SIGTTOU
] != SIG_HOLD
(u.u_procp->p_flag&SDETACH)==0) {
gsignal(u
.u_procp
->p_pgrp
, SIGTTOU
);
sleep((caddr_t
)&lbolt
, TTOPRI
);
if (copyout((caddr_t
)&t
, addr
, sizeof(t
)))
if (copyin(addr
, (caddr_t
)&t
, sizeof(t
))) {
(*linesw
[tp
->t_line
].l_close
)(tp
);
(*linesw
[t
].l_open
)(dev
, tp
, addr
);
* Prevent more opens on channel
tp
->t_state
|= TS_XCLUDE
;
tp
->t_state
&= ~TS_XCLUDE
;
if (copyin(addr
, (caddr_t
)&iocb
, sizeof(iocb
))) {
if (tp
->t_flags
&RAW
|| iocb
.sg_flags
&RAW
||
else if ((tp
->t_flags
&CBREAK
) != (iocb
.sg_flags
&CBREAK
)) {
if (iocb
.sg_flags
& CBREAK
) {
catq(&tp
->t_rawq
, &tp
->t_canq
);
tp
->t_ispeed
= iocb
.sg_ispeed
;
tp
->t_ospeed
= iocb
.sg_ospeed
;
tp
->t_erase
= iocb
.sg_erase
;
tp
->t_kill
= iocb
.sg_kill
;
tp
->t_flags
= iocb
.sg_flags
;
tp
->t_state
&= ~TS_TTSTOP
;
* Send current parameters to user
iocb
.sg_ispeed
= tp
->t_ispeed
;
iocb
.sg_ospeed
= tp
->t_ospeed
;
iocb
.sg_erase
= tp
->t_erase
;
iocb
.sg_kill
= tp
->t_kill
;
iocb
.sg_flags
= tp
->t_flags
;
if (copyout((caddr_t
)&iocb
, addr
, sizeof(iocb
)))
* Hang up line on last close
tp
->t_state
|= TS_HUPCLS
;
else if (copyin(addr
, (caddr_t
)&flags
, sizeof (flags
))) {
if (copyin(addr
, (caddr_t
)&nbio
, sizeof (nbio
))) {
if (copyin(addr
, (caddr_t
)&async
, sizeof (async
))) {
tp
->t_state
&= ~TS_ASYNC
;
* Set and fetch special characters
if (copyin(addr
, (caddr_t
)&tun
, sizeof(struct tchars
)))
if (copyout((caddr_t
)&tun
, addr
, sizeof(struct tchars
)))
* Set/get local special characters.
if (copyin(addr
, (caddr_t
)&tlun
, sizeof (struct ltchars
)))
if (copyout((caddr_t
)&tlun
, addr
, sizeof (struct ltchars
)))
* Return number of characters immediately available.
off_t nread
= ttnread(tp
);
if (copyout((caddr_t
)&nread
, addr
, sizeof (off_t
)))
* Should allow SPGRP and GPGRP only if tty open for reading.
if (copyin(addr
, (caddr_t
)&tp
->t_pgrp
, sizeof (tp
->t_pgrp
)))
if (copyout((caddr_t
)&tp
->t_pgrp
, addr
, sizeof(tp
->t_pgrp
)))
* Modify local mode word.
if (copyin(addr
, (caddr_t
)&temp
, sizeof (tp
->t_local
)))
if (copyin(addr
, (caddr_t
)&temp
, sizeof (tp
->t_local
)))
if (copyin(addr
, (caddr_t
)&temp
, sizeof (tp
->t_local
)))
if (copyout((caddr_t
)&tp
->t_local
, addr
, sizeof(tp
->t_local
)))
* Return number of characters in
if (copyout((caddr_t
)&tp
->t_outq
.c_cc
, addr
, sizeof(tp
->t_outq
.c_cc
)))
* Simulate typing of a character at the terminal.
if (u
.u_uid
&& u
.u_ttyp
!= tp
|| c
< 0)
(*linesw
[tp
->t_line
].l_rint
)(c
, tp
);
if ((tp
->t_state
& TS_TTSTOP
) == 0) {
tp
->t_state
|= TS_TTSTOP
;
(*cdevsw
[major(tp
->t_dev
)].d_stop
)(tp
, 0);
if ((tp
->t_state
& TS_TTSTOP
) || (tp
->t_local
& LFLUSHO
)) {
tp
->t_state
&= ~TS_TTSTOP
;
if (tp
->t_local
& LPENDIN
)
if (tp
->t_flags
& (RAW
|CBREAK
))
nread
+= tp
->t_rawq
.c_cc
;
register struct tty
*tp
= &cdevsw
[major(dev
)].d_ttys
[minor(dev
)];
if (tp
->t_rsel
&& tp
->t_rsel
->p_wchan
== (caddr_t
)&selwait
)
if (tp
->t_outq
.c_cc
<= TTLOWAT(tp
))
if (tp
->t_wsel
&& tp
->t_wsel
->p_wchan
== (caddr_t
)&selwait
)
* routine called on opens while tp->t_line == NTTYDISC
* establishes a process group for distribution of
* quits and interrupts from the tty.
* (actually, pp->p_pgrp can't be 0 when this routine
* is called since NTTYDISC is not the default discipline)
register struct proc
*pp
;
tp
->t_state
&= ~TS_WOPEN
;
tp
->t_state
|= TS_ISOPEN
;
if (tp
->t_line
!= NTTYDISC
)
* reinput pending characters after state switch
tp
->t_rawq
.c_cf
= tp
->t_rawq
.c_cl
= 0;
while ((c
= getc(&tq
)) >= 0)
tp
->t_lstate
&= ~LSTYPEN
;
* Place a character on raw TTY input queue, putting in delimiters
* and waking up top half as needed.
* The arguments are the character and the appropriate
if ((tp
->t_lstate
&LSTYPEN
) == 0)
/* check for literal nexting very first */
if (tp
->t_lstate
&LSLNCH
) {
if (tp
->t_line
== NTTYDISC
&& c
==tlun
.t_lnextc
) {
/* check for output control functions */
} else if (c
==tun
.t_stopc
) {
if ((tp
->t_state
&TS_TTSTOP
)==0) {
tp
->t_state
|= TS_TTSTOP
;
(*cdevsw
[major(tp
->t_dev
)].d_stop
)(tp
, 0);
} else if (c
==tun
.t_startc
) {
tp
->t_state
&= ~TS_TTSTOP
;
} else if (tp
->t_line
== NTTYDISC
&& c
==tlun
.t_flushc
) {
if (tp
->t_local
& LFLUSHO
)
if (tp
->t_rawq
.c_cc
+tp
->t_canq
.c_cc
)
} else if (c
==tun
.t_intrc
|| c
==tun
.t_quitc
||
(tp
->t_line
== NTTYDISC
&& c
==tlun
.t_suspc
)) {
if ((tp
->t_local
& LNOFLSH
) == 0)
c
==tlun
.t_suspc
? FREAD
: FREAD
|FWRITE
);
c
= c
==tun
.t_intrc
? SIGINT
:
((c
==tun
.t_quitc
) ? SIGQUIT
: SIGTSTP
);
/* check for buffer editing functions - cooked mode */
} else if ((t_flags
&CBREAK
) == 0) {
if ((tp
->t_lstate
&LSQUOT
) &&
(c
==tp
->t_erase
||c
==tp
->t_kill
)) {
ttyrub(unputc(&tp
->t_rawq
), tp
);
ttyrub(unputc(&tp
->t_rawq
), tp
);
} else if (c
==tp
->t_kill
) {
if (tp
->t_local
&LCRTKIL
&&
tp
->t_rawq
.c_cc
== tp
->t_rocount
) {
ttyrub(unputc(&tp
->t_rawq
), tp
);
while (getc(&tp
->t_rawq
) > 0)
} else if (tp
->t_line
== NTTYDISC
&& c
==tlun
.t_werasc
) {
if (tp
->t_rawq
.c_cc
== 0)
if (c
!= ' ' && c
!= '\t')
} while (tp
->t_rawq
.c_cc
);
if (tp
->t_rawq
.c_cc
== 0)
} while (c
!= ' ' && c
!= '\t');
(void) putc(c
, &tp
->t_rawq
);
} else if (tp
->t_line
== NTTYDISC
&& c
==tlun
.t_rprntc
) {
/* check for cooked mode input buffer overflow */
} else if (tp
->t_rawq
.c_cc
+tp
->t_canq
.c_cc
>= TTYHOG
) {
/* put data char in q for user and wakeup if a break char */
} else if (putc(c
, &tp
->t_rawq
) >= 0) {
if (tp
->t_rawq
.c_cc
+tp
->t_canq
.c_cc
==TTYHOG
&& tp
->t_line
== NTTYDISC
)
(void) ttyoutput(CTRL(g
), tp
);
if (tp
->t_rocount
++ == 0)
catq(&tp
->t_rawq
, &tp
->t_canq
);
/* IF (TP->T_CHAN) (VOID) SDATA(TP->T_CHAN); */
if (tp
->t_lstate
&LSERASE
) {
tp
->t_lstate
&= ~LSERASE
;
(void) ttyoutput('/', tp
);
if (c
==tun
.t_eofc
&& tp
->t_flags
&ECHO
) {
i
= MIN(2, tp
->t_col
- i
);
(void) ttyoutput('\b', tp
);
} else if (tp
->t_rawq
.c_cc
> TTYHOG
) {
if (tp
->t_outq
.c_cc
< TTHIWAT(tp
) &&
(void) ttyoutput(CTRL(g
), tp
);
} else if (putc(c
, &tp
->t_rawq
) >= 0) {
} else if (tp
->t_rawq
.c_cc
> TTYHOG
)
flushtty(tp
, FREAD
|FWRITE
);
if (putc(c
, &tp
->t_rawq
) >= 0)
if (tp
->t_local
& LDECCTQ
&& tp
->t_state
& TS_TTSTOP
&&
tun
.t_startc
!= tun
.t_stopc
)
tp
->t_state
&= ~TS_TTSTOP
;
* put character on TTY output queue, adding delays,
* expanding tabs, and handling the CR/NL bit.
* It is called both from the top half for output, and from
* interrupt level for echoing.
* The arguments are the character and the tty structure.
* Returns < 0 if putc succeeds, otherwise returns char to resend
if (tp
->t_flags
&RAW
|| tp
->t_local
&LLITOUT
) {
if (putc(c
, &tp
->t_outq
))
* Ignore EOT in normal mode to avoid hanging up
if (c
==CEOT
&& (tp
->t_flags
&CBREAK
)==0)
* Turn tabs to spaces as required
if (c
=='\t' && (tp
->t_flags
&TBDELAY
)==XTABS
) {
if ((tp
->t_local
&LFLUSHO
) == 0) {
s
= spl5(); /* don't interrupt tabs */
c
-= b_to_q(" ", c
, &tp
->t_outq
);
* for upper-case-only terminals,
if (ttyoutput('\\', tp
) >= 0)
if (ttyoutput('\\', tp
) >= 0)
} else if ('a'<=c
&& c
<='z')
* turn <nl> to <cr><lf> if desired.
if (c
=='\n' && tp
->t_flags
&CRMOD
)
if (ttyoutput('\r', tp
) >= 0)
if (c
=='~' && tp
->t_local
<ILDE
)
if ((tp
->t_local
&LFLUSHO
) == 0 && putc(c
, &tp
->t_outq
))
* The numbers here represent clock ticks
* and are not necessarily optimal for all terminals.
* The delays are indicated by characters above 0200.
* In raw mode there are no delays and the
* transmission path is 8 bits wide.
ctype
= (tp
->t_flags
>> 8) & 03;
if(ctype
== 1) { /* tty 37 */
c
= max(((unsigned)*colp
>>4) + 3, (unsigned)6);
if(ctype
== 2) { /* vt05 */
ctype
= (tp
->t_flags
>> 10) & 03;
if(ctype
== 1) { /* tty 37 */
if(tp
->t_flags
& VTDELAY
) /* tty 37 */
ctype
= (tp
->t_flags
>> 12) & 03;
if(ctype
== 1) { /* tn 300 */
} else if(ctype
== 2) { /* ti 700 */
} else if(ctype
== 3) { /* concept 100 */
(void) putc(0177, &tp
->t_outq
);
if(c
&& (tp
->t_local
&LFLUSHO
) == 0)
(void) putc(c
|0200, &tp
->t_outq
);
* Called from device's read routine after it has
* calculated the tty-structure given as argument.
register struct clist
*qp
;
if ((tp
->t_state
&TS_CARR_ON
)==0)
while (tp
== u
.u_ttyp
&& u
.u_procp
->p_pgrp
!= tp
->t_pgrp
) {
if (u
.u_signal
[SIGTTIN
] == SIG_IGN
||
u
.u_signal
[SIGTTIN
] == SIG_HOLD
||
(u.u_procp->p_flag&SDETACH) ||
u
.u_procp
->p_flag
&SVFORK
)
gsignal(u
.u_procp
->p_pgrp
, SIGTTIN
);
sleep((caddr_t
)&lbolt
, TTIPRI
);
if (tp
->t_rawq
.c_cc
<= 0) {
if ((tp
->t_state
&TS_CARR_ON
)==0 ||
sleep((caddr_t
)&tp
->t_rawq
, TTIPRI
);
while (tp
->t_rawq
.c_cc
&& passc(getc(&tp
->t_rawq
))>=0)
qp
= tp
->t_flags
& CBREAK
? &tp
->t_rawq
: &tp
->t_canq
;
if ((tp
->t_state
&TS_CARR_ON
)==0 ||
sleep((caddr_t
)&tp
->t_rawq
, TTIPRI
);
while ((c
= getc(qp
)) >= 0) {
if (tp
->t_flags
&CRMOD
&& c
== '\r')
if (tp
->t_flags
&LCASE
&& c
<= 0177)
if (tp
->t_lstate
&LSBKSL
) {
} else if (c
>= 'A' && c
<= 'Z')
if (c
== tlun
.t_dsuspc
) {
sleep((caddr_t
)&lbolt
, TTIPRI
);
if (c
== tun
.t_eofc
&& (tp
->t_flags
&CBREAK
)==0)
if ((tp
->t_flags
&CBREAK
)==0 && ttbreakc(c
, tp
))
if (tp
->t_state
&TS_TBLOCK
&& tp
->t_rawq
.c_cc
< TTYHOG
/5) {
if (putc(tun
.t_startc
, &tp
->t_outq
)==0) {
tp
->t_state
&= ~TS_TBLOCK
;
return (tp
->t_rawq
.c_cc
+ tp
->t_canq
.c_cc
);
* Called from the device's write routine after it has
* calculated the tty-structure given as argument.
* THE POSITIONING OF CP, CC, AND CE ARE CRITICAL
* AND MUST NOT BE CHANGED WITHOUT PATCHING
* THE 'ASM' INLINES BELOW. WATCH OUT.
if ((tp
->t_state
&TS_CARR_ON
)==0)
while (u
.u_procp
->p_pgrp
!= tp
->t_pgrp
&& tp
== u
.u_ttyp
&&
(tp
->t_local
<OSTOP
) && (u
.u_procp
->p_flag
&SVFORK
)==0 &&
u
.u_signal
[SIGTTOU
] != SIG_IGN
&&
u
.u_signal
[SIGTTOU
] != SIG_HOLD
(u.u_procp->p_flag&SDETACH)==0) {
gsignal(u
.u_procp
->p_pgrp
, SIGTTOU
);
sleep((caddr_t
)&lbolt
, TTIPRI
);
cc
= MIN(u
.u_count
, OBUFSIZ
);
iomove(cp
, (unsigned)cc
, B_WRITE
);
if (tp
->t_outq
.c_cc
> hiwat
)
if (tp
->t_flags
&LCASE
|| tp
->t_local
<ILDE
) {
while((c
= ttyoutput(c
, tp
)) >= 0) {
/* out of clists, wait a bit */
sleep((caddr_t
)&lbolt
, TTOPRI
);
if (tp
->t_outq
.c_cc
> hiwat
)
if (tp
->t_flags
&RAW
|| tp
->t_local
&LLITOUT
)
asm(" scanc r9,(r10),_partab,$077");
while(((partab
[*(unsigned char *)(cp
+ce
)]&077)==0)&&(ce
<cc
))
if (ttyoutput(*cp
, tp
) >= 0) {
sleep((caddr_t
)&lbolt
, TTOPRI
);
if (tp
->t_outq
.c_cc
> hiwat
)
i
=b_to_q(cp
,ce
,&tp
->t_outq
);
sleep((caddr_t
)&lbolt
, TTOPRI
);
if (ce
|| tp
->t_outq
.c_cc
> hiwat
)
if (tp
->t_outq
.c_cc
<= hiwat
) {
if (tp
->t_state
& TS_NBIO
) {
tp
->t_state
|= TS_ASLEEP
;
sleep((caddr_t
)&tp
->t_outq
, TTOPRI
);
* Rubout one character from the rawq of tp
* as cleanly as possible.
if ((tp
->t_flags
&ECHO
)==0)
if (tp
->t_local
&LCRTBS
) {
if (tp
->t_rocount
== 0) {
* Screwed by ttwrite; retype
if (c
==('\t'|0200) || c
==('\n'|0200))
else switch(partab
[c
&=0177] & 0177) {
if (tp
->t_flags
&LCASE
&& c
>= 'A' && c
<= 'Z')
if (tp
->t_local
& LCTLECH
)
if (tp
->t_rocount
< tp
->t_rawq
.c_cc
) {
for (cp
= tp
->t_rawq
.c_cf
; cp
; cp
= nextc(&tp
->t_rawq
, cp
))
tp
->t_lstate
&= ~LSCNTTB
;
* savecol will now be length of the tab
savecol
= 8; /* overflow screw */
(void) ttyoutput('\b', tp
);
} else if (tp
->t_local
&LPRTERA
) {
if ((tp
->t_lstate
&LSERASE
) == 0) {
(void) ttyoutput('\\', tp
);
ttyecho(tp
->t_erase
, tp
);
* Crt back over cnt chars perhaps
ttyout(tp
->t_local
&LCRTERA
? "\b \b" : "\b", tp
);
* We assume c_cc has already been checked.
if (tlun
.t_rprntc
!= 0377)
ttyecho(tlun
.t_rprntc
, tp
);
(void) ttyoutput('\n', tp
);
for (cp
= tp
->t_canq
.c_cf
; cp
; cp
= nextc(&tp
->t_canq
, cp
))
for (cp
= tp
->t_rawq
.c_cf
; cp
; cp
= nextc(&tp
->t_rawq
, cp
))
tp
->t_lstate
&= ~LSERASE
;
tp
->t_rocount
= tp
->t_rawq
.c_cc
;
* Echo a typed character to the terminal
if ((tp
->t_lstate
& LSCNTTB
) == 0)
if ((tp
->t_flags
&ECHO
) == 0)
if (c
== '\r' && tp
->t_flags
&CRMOD
)
if (tp
->t_local
&LCTLECH
) {
if ((c
&0177) <= 037 && c
!='\t' && c
!='\n' || (c
&0177)==0177) {
(void) ttyoutput('^', tp
);
else if (tp
->t_flags
&LCASE
)
if ((tp
->t_flags
&LCASE
) && (c
>= 'A' && c
<= 'Z'))
(void) ttyoutput(c
& 0177, tp
);
* Is c a break char for tp?
return (c
== '\n' || c
== tun
.t_eofc
|| c
== tun
.t_brkc
||
c
== '\r' && (tp
->t_flags
&CRMOD
));
selwakeup(tp
->t_rsel
, tp
->t_state
&TS_RCOLL
);
tp
->t_state
&= ~TS_RCOLL
;
wakeup((caddr_t
)&tp
->t_rawq
);
gsignal(tp
->t_pgrp
, signo
);