From 482a38725d4e1d9b5aee18e2b2d5af3d0b0e54e9 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sun, 19 May 2024 19:10:35 -0400 Subject: kernel: tty: Implement tty_ioctl() Signed-off-by: Ian Moffett --- sys/include/sys/tty.h | 4 ++++ sys/kern/kern_tty.c | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) 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 #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 +#include #include #include #include @@ -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); -- cgit v1.2.3