X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibposix.so_src%2Ftermios.c;h=32fa9e16b282ab21f04021e91de5ad57a231ad71;hb=bdd7f1f599b357218e219aeb2bd9264e6412d629;hp=0e8e35643951545d457359a5484ca1ef595f622b;hpb=e91f60e14b8857312238d729fa580d6ab44ba27a;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libposix.so_src/termios.c b/Usermode/Libraries/libposix.so_src/termios.c index 0e8e3564..32fa9e16 100644 --- a/Usermode/Libraries/libposix.so_src/termios.c +++ b/Usermode/Libraries/libposix.so_src/termios.c @@ -8,6 +8,8 @@ #include #include #include +#include +#include // === CODE === int tcgetattr(int fd, struct termios *termios_p) @@ -16,18 +18,38 @@ int tcgetattr(int fd, struct termios *termios_p) errno = EBADF; return -1; } + // Double-check `fd` describes a terminal + if( _SysIOCtl(fd, DRV_IOCTL_TYPE, NULL) != DRV_TYPE_TERMINAL ) { + errno = EINVAL; + return -1; + } // Fill defaults memset(termios_p, 0, sizeof(struct termios)); - // Query kernel for other params + // Query kernel for other params + struct ptymode mode; + _SysIOCtl(fd, PTY_IOCTL_GETMODE, &mode); + + if( (mode.OutputMode & PTYOMODE_BUFFMT) != PTYBUFFMT_TEXT ) { + _SysDebug("Call to tcgetattr when terminal is not in text mode"); + return -1; + } + + if(mode.InputMode & PTYIMODE_CANON) + termios_p->c_lflag |= ICANON|ECHOE|ECHOK; + if(mode.InputMode & PTYIMODE_ECHO) + termios_p->c_lflag |= ECHO; + // TODO: The more subtle flags return 0; } int tcsetattr(int fd, int optional_actions, const struct termios *termios_p) { + _SysDebug("tcsetattr(%i, 0%o, %p)", fd, optional_actions, termios_p); + if( fd == -1 ) { errno = EBADF; return -1; @@ -38,6 +60,22 @@ int tcsetattr(int fd, int optional_actions, const struct termios *termios_p) return -1; } + // Double-check `fd` describes a terminal + if( _SysIOCtl(fd, DRV_IOCTL_TYPE, NULL) != DRV_TYPE_TERMINAL ) { + errno = EINVAL; + return -1; + } + + struct ptymode mode = {0,0}; + + if(termios_p->c_lflag & ICANON) + mode.InputMode |= PTYIMODE_CANON; + if(termios_p->c_lflag & ECHO) + mode.InputMode |= PTYIMODE_ECHO; + + _SysDebug("*termios_p = {%x,%x,%x,%x}", + termios_p->c_iflag, termios_p->c_oflag, termios_p->c_cflag, termios_p->c_lflag); + return 0; }