From: John Hodge Date: Tue, 21 May 2013 08:15:19 +0000 (+0800) Subject: Usermode/libposix - Hacked translation of termios-ptymode X-Git-Tag: rel0.15~455 X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=1e276c7ef5da2e87cf413e1563f339de7fba8449;p=tpg%2Facess2.git Usermode/libposix - Hacked translation of termios-ptymode --- diff --git a/Usermode/Libraries/libposix.so_src/termios.c b/Usermode/Libraries/libposix.so_src/termios.c index 0e8e3564..57b1b421 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}; + + 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; }