summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/tty.c50
-rw-r--r--sys/sys/tty.h4
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. */