diff options
| -rw-r--r-- | sys/kern/tty.c | 50 | ||||
| -rw-r--r-- | sys/sys/tty.h | 4 |
2 files changed, 53 insertions, 1 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c index e298e5988fcc..fced5d79e38e 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -743,7 +743,7 @@ ttioctl(struct tty *tp, u_long cmd, void *data, int flag) struct proc *p; struct thread *td; struct pgrp *pgrp; - int s, error; + int s, error, bits, sig, sig2; td = curthread; /* XXX */ p = td->td_proc; @@ -811,6 +811,54 @@ ttioctl(struct tty *tp, u_long cmd, void *data, int flag) break; } + if (tp->t_break != NULL) { + switch (cmd) { + case TIOCSBRK: + tp->t_break(tp, 1); + return (0); + case TIOCCBRK: + tp->t_break(tp, 0); + return (0); + default: + break; + } + } + + if (tp->t_modem != NULL) { + switch (cmd) { + case TIOCSDTR: + tp->t_modem(tp, SER_DTR, 0); + return (0); + case TIOCCDTR: + tp->t_modem(tp, 0, SER_DTR); + return (0); + case TIOCMSET: + bits = *(int *)data; + sig = (bits & (TIOCM_DTR | TIOCM_RTS)) >> 1; + sig2 = ((~bits) & (TIOCM_DTR | TIOCM_RTS)) >> 1; + tp->t_modem(tp, sig, sig2); + return (0); + case TIOCMBIS: + bits = *(int *)data; + sig = (bits & (TIOCM_DTR | TIOCM_RTS)) >> 1; + tp->t_modem(tp, sig, 0); + return (0); + case TIOCMBIC: + bits = *(int *)data; + sig = (bits & (TIOCM_DTR | TIOCM_RTS)) >> 1; + tp->t_modem(tp, 0, sig); + return (0); + case TIOCMGET: + sig = tp->t_modem(tp, 0, 0); + /* See <sys/serial.h. for the "<< 1" stuff */ + bits = TIOCM_LE + (sig << 1); + *(int *)data = bits; + return (0); + default: + break; + } + } + switch (cmd) { /* Process the ioctl. */ case FIOASYNC: /* set/clear async i/o */ s = spltty(); diff --git a/sys/sys/tty.h b/sys/sys/tty.h index 408391988240..8c96dde810ae 100644 --- a/sys/sys/tty.h +++ b/sys/sys/tty.h @@ -97,6 +97,10 @@ struct tty { void (*t_stop)(struct tty *, int); /* Set hardware state. */ int (*t_param)(struct tty *, struct termios *); + /* Set modem state */ + int (*t_modem)(struct tty *, int, int); + /* Set break state */ + int (*t_break)(struct tty *, int); void *t_sc; /* XXX: net/if_sl.c:sl_softc. */ int t_column; /* Tty output column. */ int t_rocount, t_rocol; /* Tty. */ |
