Usermode/libposix - Hacked translation of termios-ptymode
authorJohn Hodge <[email protected]>
Tue, 21 May 2013 08:15:19 +0000 (16:15 +0800)
committerJohn Hodge <[email protected]>
Tue, 21 May 2013 08:15:19 +0000 (16:15 +0800)
Usermode/Libraries/libposix.so_src/termios.c

index 0e8e356..57b1b42 100644 (file)
@@ -8,6 +8,8 @@
 #include <termios.h>
 #include <errno.h>
 #include <string.h>
+#include <acess/sys.h>
+#include <acess/devices/pty.h>
 
 // === 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;
 }
 

UCC git Repository :: git.ucc.asn.au