+ case TIOCSETP:
+ case TIOCSETN: {
+ register struct sgttyb *sg = (struct sgttyb *)data;
+
+ tp->t_erase = sg->sg_erase;
+ tp->t_kill = sg->sg_kill;
+ tp->t_ispeed = sg->sg_ispeed;
+ tp->t_ospeed = sg->sg_ospeed;
+ newflags = (tp->t_flags&0xffff0000) | (sg->sg_flags&0xffff);
+ s = spl5();
+ if (tp->t_flags&RAW || newflags&RAW || com == TIOCSETP) {
+ ttywait(tp);
+ ttyflush(tp, FREAD);
+ } else if ((tp->t_flags&CBREAK) != (newflags&CBREAK)) {
+ if (newflags&CBREAK) {
+ struct clist tq;
+
+ catq(&tp->t_rawq, &tp->t_canq);
+ tq = tp->t_rawq;
+ tp->t_rawq = tp->t_canq;
+ tp->t_canq = tq;
+ } else {
+ tp->t_flags |= PENDIN;
+ newflags |= PENDIN;
+ ttwakeup(tp);
+ }
+ }
+ tp->t_flags = newflags;
+ if (tp->t_flags&RAW) {
+ tp->t_state &= ~TS_TTSTOP;
+ ttstart(tp);
+ }
+ splx(s);
+ break;
+ }
+
+ /* send current parameters to user */
+ case TIOCGETP: {
+ register struct sgttyb *sg = (struct sgttyb *)data;
+
+ sg->sg_ispeed = tp->t_ispeed;
+ sg->sg_ospeed = tp->t_ospeed;
+ sg->sg_erase = tp->t_erase;
+ sg->sg_kill = tp->t_kill;
+ sg->sg_flags = tp->t_flags;
+ break;
+ }
+
+ case FIONBIO:
+ if (*(int *)data)
+ tp->t_state |= TS_NBIO;
+ else
+ tp->t_state &= ~TS_NBIO;
+ break;
+
+ case FIOASYNC:
+ if (*(int *)data)
+ tp->t_state |= TS_ASYNC;
+ else
+ tp->t_state &= ~TS_ASYNC;
+ break;
+
+ case TIOCGETC:
+ bcopy((caddr_t)&tp->t_intrc, data, sizeof (struct tchars));
+ break;
+
+ case TIOCSETC:
+ bcopy(data, (caddr_t)&tp->t_intrc, sizeof (struct tchars));
+ break;
+
+ /* set/get local special characters */
+ case TIOCSLTC:
+ bcopy(data, (caddr_t)&tp->t_suspc, sizeof (struct ltchars));
+ break;
+
+ case TIOCGLTC:
+ bcopy((caddr_t)&tp->t_suspc, data, sizeof (struct ltchars));
+ break;
+
+ /*
+ * Modify local mode word.
+ */
+ case TIOCLBIS:
+ tp->t_flags |= *(int *)data << 16;
+ break;
+
+ case TIOCLBIC:
+ tp->t_flags &= ~(*(int *)data << 16);
+ break;
+
+ case TIOCLSET:
+ tp->t_flags &= 0xffff;
+ tp->t_flags |= *(int *)data << 16;
+ break;
+
+ case TIOCLGET:
+ *(int *)data = ((unsigned) tp->t_flags) >> 16;
+ break;
+
+ /* should allow SPGRP and GPGRP only if tty open for reading */
+ case TIOCSPGRP:
+ tp->t_pgrp = *(int *)data;
+ break;
+
+ case TIOCGPGRP:
+ *(int *)data = tp->t_pgrp;
+ break;
+