aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_conf.c1
-rw-r--r--sys/kern/tty.c15
-rw-r--r--sys/sys/conf.h1
-rw-r--r--sys/sys/linedisc.h1
4 files changed, 18 insertions, 0 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c
index 1a3eaea33bfb..18ede10cbabe 100644
--- a/sys/kern/kern_conf.c
+++ b/sys/kern/kern_conf.c
@@ -428,6 +428,7 @@ prep_cdevsw(struct cdevsw *devsw)
}
if (devsw->d_flags & D_TTY) {
+ if (devsw->d_ioctl == NULL) devsw->d_ioctl = ttyioctl;
if (devsw->d_read == NULL) devsw->d_read = ttyread;
if (devsw->d_write == NULL) devsw->d_write = ttywrite;
if (devsw->d_kqfilter == NULL) devsw->d_kqfilter = ttykqfilter;
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index e3bee61ff6c8..86581649b4c6 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -2751,3 +2751,18 @@ ttywrite(dev_t dev, struct uio *uio, int flag)
return (ENODEV);
return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
}
+
+int
+ttyioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td)
+{
+ struct tty *tp;
+ int error;
+
+ tp = dev->si_tty;
+ error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, td);
+ if (error == ENOIOCTL)
+ error = ttioctl(tp, cmd, data, flag);
+ if (error != ENOIOCTL)
+ return (error);
+ return (ENOTTY);
+}
diff --git a/sys/sys/conf.h b/sys/sys/conf.h
index 1278fadb55f6..c45b14131f4c 100644
--- a/sys/sys/conf.h
+++ b/sys/sys/conf.h
@@ -353,6 +353,7 @@ void dumpsys(struct dumperinfo *);
extern int dumping; /* system is dumping */
/* D_TTY related functions */
+d_ioctl_t ttyioctl;
d_kqfilter_t ttykqfilter;
d_poll_t ttypoll;
d_read_t ttyread;
diff --git a/sys/sys/linedisc.h b/sys/sys/linedisc.h
index 1278fadb55f6..c45b14131f4c 100644
--- a/sys/sys/linedisc.h
+++ b/sys/sys/linedisc.h
@@ -353,6 +353,7 @@ void dumpsys(struct dumperinfo *);
extern int dumping; /* system is dumping */
/* D_TTY related functions */
+d_ioctl_t ttyioctl;
d_kqfilter_t ttykqfilter;
d_poll_t ttypoll;
d_read_t ttyread;