X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibposix.so_src%2Fsys_ioctl.c;h=866cb8005104141435da4ce2eb4cf7068bb2cf3e;hb=b78819e65fd03a34712fc641f86fa5d9f9a4d6c7;hp=56871bc1c5b6c05a26882c991533df8cf23a074d;hpb=4c78a1bdd506cda6cda27ee342165c7dfa7ecdc2;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libposix.so_src/sys_ioctl.c b/Usermode/Libraries/libposix.so_src/sys_ioctl.c index 56871bc1..866cb800 100644 --- a/Usermode/Libraries/libposix.so_src/sys_ioctl.c +++ b/Usermode/Libraries/libposix.so_src/sys_ioctl.c @@ -7,11 +7,18 @@ */ #include #include +#include // DRV_TYPE_* +#include #include +#include // TIOC* +#include // === 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; }