Usermode/libposix - termios and ioctl updates for dropbear testing
authorJohn Hodge <[email protected]>
Mon, 18 Nov 2013 06:35:23 +0000 (14:35 +0800)
committerJohn Hodge <[email protected]>
Mon, 18 Nov 2013 06:35:23 +0000 (14:35 +0800)
Usermode/Libraries/libposix.so_src/fcntl.c
Usermode/Libraries/libposix.so_src/include_exp/sys/ioctl.h
Usermode/Libraries/libposix.so_src/sys_ioctl.c
Usermode/Libraries/libposix.so_src/termios.c

index 431c2cb..180a644 100644 (file)
@@ -44,7 +44,7 @@ int fcntl(int fd, int cmd, ...)
                // TODO: Extra flags for F_SETFL
 
                ret = _SysFDFlags(fd, mask, a_flags);
-               _SysDebug("fcntl(%i, F_SETFL, %li) = %i", fd, p_flags, ret);
+               _SysDebug("fcntl(%i, F_SETFL, 0x%lx) = Acess 0x%x", fd, p_flags, ret);
                if(ret != -1)
                        ret = 0;
 
index 56871bc..866cb80 100644 (file)
@@ -7,11 +7,18 @@
  */
 #include <sys/ioctl.h>
 #include <acess/sys.h>
+#include <acess/devices.h>     // DRV_TYPE_*
+#include <acess/devices/pty.h>
 #include <errno.h>
+#include <termios.h>   // TIOC*
+#include <stdarg.h>
 
 // === CODE ===
 int ioctl(int fd, int request, ...)
 {
+       va_list args;
+       va_start(args, request);
+       
        if( fd < 0 ) {
                errno = EBADF;
                return -1;
@@ -24,21 +31,55 @@ int ioctl(int fd, int request, ...)
 
        // #1. Get device type (IOCtl 0)
        int devtype = _SysIOCtl(fd, 0, NULL);
-       
+
        switch(devtype)
        {
        // 0: Normal file (no ioctls we care about)
        case 0:
+               _SysDebug("ioctl(%i, %i, ...) (File)", fd, request);
+               return -1;
        // 1: Has the ident set of ioctls, nothing else
        case 1:
+               _SysDebug("ioctl(%i, %i, ...) (Misc Dev)", fd, request);
                return -1;
+       
        // TODO: Terminals
+       case DRV_TYPE_TERMINAL:
+               switch(request)
+               {
+               case TIOCGWINSZ: {
+                       struct winsize *ws = va_arg(args, struct winsize*);
+                       _SysDebug("ioctl(%i, TIOCGWINSZ, %p", fd, ws);
+                       struct ptydims  dims;
+                       _SysIOCtl(fd, PTY_IOCTL_GETDIMS, &dims);
+                       ws->ws_col = dims.W;
+                       ws->ws_row = dims.H;
+                       ws->ws_xpixel = dims.PW;
+                       ws->ws_ypixel = dims.PH;
+                       return 0; }
+               case TIOCSWINSZ: {
+                       const struct winsize *ws = va_arg(args, const struct winsize*);
+                       _SysDebug("ioctl(%i, TIOCSWINSZ, %p", fd, ws);
+                       struct ptydims  dims;
+                       dims.W = ws->ws_col;
+                       dims.H = ws->ws_row;
+                       dims.PW = ws->ws_xpixel;
+                       dims.PH = ws->ws_ypixel;
+                       _SysIOCtl(fd, PTY_IOCTL_SETDIMS, &dims);
+                       return 0; }
+               default:
+                       _SysDebug("ioctl(%i, TIOC? %i, ...)", fd, request);
+                       break;
+               }
+               return -1;
        
        // NFI
        default:
+               _SysDebug("ioctl(%i, %i, ...) (DevType %i)", fd, request, devtype);
                return -1;
        }
 
+       va_end(args);
        return 0;
 }
 
index 32fa9e1..d73de57 100644 (file)
@@ -59,6 +59,8 @@ int tcsetattr(int fd, int optional_actions, const struct termios *termios_p)
                errno = EINVAL;
                return -1;
        }
+       _SysDebug("*termios_p = {%x,%x,%x,%x}",
+               termios_p->c_iflag, termios_p->c_oflag, termios_p->c_cflag, termios_p->c_lflag);
        
        // Double-check `fd` describes a terminal
        if( _SysIOCtl(fd, DRV_IOCTL_TYPE, NULL) != DRV_TYPE_TERMINAL ) {
@@ -73,8 +75,7 @@ int tcsetattr(int fd, int optional_actions, const struct termios *termios_p)
        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);
+       _SysIOCtl(fd, PTY_IOCTL_SETMODE, &mode);
 
        return 0;
 }

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