diff options
-rw-r--r-- | sys/include/sys/tty.h | 4 | ||||
-rw-r--r-- | sys/kern/kern_tty.c | 22 |
2 files changed, 26 insertions, 0 deletions
diff --git a/sys/include/sys/tty.h b/sys/include/sys/tty.h index a4595d5..18583a5 100644 --- a/sys/include/sys/tty.h +++ b/sys/include/sys/tty.h @@ -38,6 +38,10 @@ #include <dev/vcons/vcons.h> #endif +/* TTY ioctl commands */ +#define TCSETS 0x00000000U +#define TCGETS 0x00000001U + #if defined(_KERNEL) #define TTY_RING_SIZE 32 #define TTY_SOURCE_RAW 0x0001U /* Raw text */ diff --git a/sys/kern/kern_tty.c b/sys/kern/kern_tty.c index cb3e30a..5c060a4 100644 --- a/sys/kern/kern_tty.c +++ b/sys/kern/kern_tty.c @@ -28,6 +28,7 @@ */ #include <sys/tty.h> +#include <sys/system.h> #include <sys/cdefs.h> #include <sys/errno.h> #include <sys/syslog.h> @@ -153,6 +154,26 @@ tty_dev_read(struct device *dev, struct sio_txn *sio) return len; } +static int +tty_ioctl(struct device *dev, uint32_t cmd, uintptr_t arg) +{ + /* TODO: Support multiple TTYs */ + struct termios *tp = &g_root_tty.termios; + + switch (cmd) { + case TCGETS: + copyout(tp, arg, sizeof(struct termios)); + break; + case TCSETS: + copyin(arg, tp, sizeof(struct termios)); + break; + default: + return -EINVAL; + } + + return 0; +} + /* * Serialized wrapper over __tty_flush() */ @@ -264,6 +285,7 @@ tty_attach(struct tty *tty) return tmp; dev->read = tty_dev_read; + dev->ioctl = tty_ioctl; dev->blocksize = 1; snprintf(devname, sizeof(devname), "tty%d", tty->id); |