- c = c==tun.t_intrc ? SIGINT :
- ((c==tun.t_quitc) ? SIGQUIT : SIGTSTP);
- ttsignal(tp, c);
- /* 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);
- c |= 0200;
- }
- if (c==tp->t_erase) {
- if (tp->t_rawq.c_cc)
- 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) {
- while (tp->t_rawq.c_cc)
- ttyrub(unputc(&tp->t_rawq), tp);
- } else {
- ttyecho(c, tp);
- ttyecho('\n', tp);
- while (getc(&tp->t_rawq) > 0)
- ;
- tp->t_rocount = 0;
- }
- tp->t_lstate = 0;
- } else if (tp->t_line == NTTYDISC && c==tlun.t_werasc) {
- if (tp->t_rawq.c_cc == 0)
- goto out;
- do {
- c = unputc(&tp->t_rawq);
- if (c != ' ' && c != '\t')
- goto erasenb;
- ttyrub(c, tp);
- } while (tp->t_rawq.c_cc);
- goto out;
- erasenb:
- do {
- ttyrub(c, tp);
- if (tp->t_rawq.c_cc == 0)
- goto out;
- c = unputc(&tp->t_rawq);
- } while (c != ' ' && c != '\t');
- (void) putc(c, &tp->t_rawq);
- } else if (tp->t_line == NTTYDISC && c==tlun.t_rprntc) {
- ttyretype(tp);
- /* 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 (!ttbreakc(c, tp)) {
- if (tp->t_rocount++ == 0)
- tp->t_rocol = tp->t_col;
- } else {
- tp->t_rocount = 0;
- catq(&tp->t_rawq, &tp->t_canq);
- /* IF (TP->T_CHAN) (VOID) SDATA(TP->T_CHAN); */
- ttwakeup(tp);
- }
- tp->t_lstate &= ~LSQUOT;
- if (c == '\\')
- tp->t_lstate |= LSQUOT;
- if (tp->t_lstate&LSERASE) {
- tp->t_lstate &= ~LSERASE;
- (void) ttyoutput('/', tp);
- }
- i = tp->t_col;
- ttyecho(c, tp);
- if (c==tun.t_eofc && tp->t_flags&ECHO) {
- i = MIN(2, tp->t_col - i);
- while (i > 0) {
- (void) ttyoutput('\b', tp);
- i--;
- }
- }
- }
- /* CBREAK mode */
- } else if (tp->t_rawq.c_cc > TTYHOG) {
+ gsignal(tp->t_pgrp, SIGTSTP);
+ goto endcase;
+ }
+ }
+
+ /*
+ * Handle start/stop characters.
+ */
+ if (c == tp->t_stopc) {
+ if ((tp->t_state&TS_TTSTOP) == 0) {
+ tp->t_state |= TS_TTSTOP;
+ (*cdevsw[major(tp->t_dev)].d_stop)(tp, 0);
+ return;
+ }
+ if (c != tp->t_startc)
+ return;
+ goto endcase;
+ }
+ if (c == tp->t_startc)
+ goto restartoutput;
+
+ /*
+ * Look for interrupt/quit chars.
+ */
+ if (c == tp->t_intrc || c == tp->t_quitc) {
+ if ((tp->t_flags&NOFLSH) == 0)
+ flushtty(tp, FREAD|FWRITE);
+ ttyecho(c, tp);
+ gsignal(tp->t_pgrp, c == tp->t_intrc ? SIGINT : SIGQUIT);
+ goto endcase;
+ }
+
+ /*
+ * Cbreak mode, don't process line editing
+ * characters; check high water mark for wakeup.
+ */
+ if (t_flags&CBREAK) {
+ if (tp->t_rawq.c_cc > TTYHOG) {