From 1a0d363caac81f319a138e64e4d3cff6200abd06 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jeremy@system76.com>
Date: Tue, 15 Jan 2019 20:50:17 -0700
Subject: [PATCH] Redox support for some minimal ioctl's

---
 src/header/sys_ioctl/linux.rs | 196 ++++++++++++++++++++++++++++++
 src/header/sys_ioctl/mod.rs   | 223 +++-------------------------------
 src/header/sys_ioctl/redox.rs |  93 ++++++++++++++
 src/header/unistd/mod.rs      |  27 ++--
 src/platform/linux/mod.rs     |   2 +-
 src/platform/mod.rs           |   2 +-
 src/platform/redox/mod.rs     |   2 +-
 7 files changed, 321 insertions(+), 224 deletions(-)
 create mode 100644 src/header/sys_ioctl/linux.rs
 create mode 100644 src/header/sys_ioctl/redox.rs

diff --git a/src/header/sys_ioctl/linux.rs b/src/header/sys_ioctl/linux.rs
new file mode 100644
index 00000000..02cc8c9f
--- /dev/null
+++ b/src/header/sys_ioctl/linux.rs
@@ -0,0 +1,196 @@
+use platform::types::*;
+use platform::Sys;
+
+#[no_mangle]
+pub extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> c_int {
+    // TODO: Somehow support varargs to syscall??
+    Sys::ioctl(fd, request, out)
+}
+
+pub const TCGETS: c_ulong = 0x5401;
+pub const TCSETS: c_ulong = 0x5402;
+pub const TCSETSW: c_ulong = 0x5403;
+pub const TCSETSF: c_ulong = 0x5404;
+pub const TCGETA: c_ulong = 0x5405;
+pub const TCSETA: c_ulong = 0x5406;
+pub const TCSETAW: c_ulong = 0x5407;
+pub const TCSETAF: c_ulong = 0x5408;
+pub const TCSBRK: c_ulong = 0x5409;
+pub const TCXONC: c_ulong = 0x540A;
+pub const TCFLSH: c_ulong = 0x540B;
+pub const TIOCEXCL: c_ulong = 0x540C;
+pub const TIOCNXCL: c_ulong = 0x540D;
+pub const TIOCSCTTY: c_ulong = 0x540E;
+pub const TIOCGPGRP: c_ulong = 0x540F;
+pub const TIOCSPGRP: c_ulong = 0x5410;
+pub const TIOCOUTQ: c_ulong = 0x5411;
+pub const TIOCSTI: c_ulong = 0x5412;
+pub const TIOCGWINSZ: c_ulong = 0x5413;
+pub const TIOCSWINSZ: c_ulong = 0x5414;
+pub const TIOCMGET: c_ulong = 0x5415;
+pub const TIOCMBIS: c_ulong = 0x5416;
+pub const TIOCMBIC: c_ulong = 0x5417;
+pub const TIOCMSET: c_ulong = 0x5418;
+pub const TIOCGSOFTCAR: c_ulong = 0x5419;
+pub const TIOCSSOFTCAR: c_ulong = 0x541A;
+pub const FIONREAD: c_ulong = 0x541B;
+pub const TIOCINQ: c_ulong = FIONREAD;
+pub const TIOCLINUX: c_ulong = 0x541C;
+pub const TIOCCONS: c_ulong = 0x541D;
+pub const TIOCGSERIAL: c_ulong = 0x541E;
+pub const TIOCSSERIAL: c_ulong = 0x541F;
+pub const TIOCPKT: c_ulong = 0x5420;
+pub const FIONBIO: c_ulong = 0x5421;
+pub const TIOCNOTTY: c_ulong = 0x5422;
+pub const TIOCSETD: c_ulong = 0x5423;
+pub const TIOCGETD: c_ulong = 0x5424;
+pub const TCSBRKP: c_ulong = 0x5425;
+pub const TIOCSBRK: c_ulong = 0x5427;
+pub const TIOCCBRK: c_ulong = 0x5428;
+pub const TIOCGSID: c_ulong = 0x5429;
+pub const TIOCGRS485: c_ulong = 0x542E;
+pub const TIOCSRS485: c_ulong = 0x542F;
+pub const TIOCGPTN: c_ulong = 0x8004_5430;
+pub const TIOCSPTLCK: c_ulong = 0x4004_5431;
+pub const TIOCGDEV: c_ulong = 0x8004_5432;
+pub const TCGETX: c_ulong = 0x5432;
+pub const TCSETX: c_ulong = 0x5433;
+pub const TCSETXF: c_ulong = 0x5434;
+pub const TCSETXW: c_ulong = 0x5435;
+pub const TIOCSIG: c_ulong = 0x4004_5436;
+pub const TIOCVHANGUP: c_ulong = 0x5437;
+pub const TIOCGPKT: c_ulong = 0x8004_5438;
+pub const TIOCGPTLCK: c_ulong = 0x8004_5439;
+pub const TIOCGEXCL: c_ulong = 0x8004_5440;
+pub const TIOCGPTPEER: c_ulong = 0x5441;
+
+pub const FIONCLEX: c_ulong = 0x5450;
+pub const FIOCLEX: c_ulong = 0x5451;
+pub const FIOASYNC: c_ulong = 0x5452;
+pub const TIOCSERCONFIG: c_ulong = 0x5453;
+pub const TIOCSERGWILD: c_ulong = 0x5454;
+pub const TIOCSERSWILD: c_ulong = 0x5455;
+pub const TIOCGLCKTRMIOS: c_ulong = 0x5456;
+pub const TIOCSLCKTRMIOS: c_ulong = 0x5457;
+pub const TIOCSERGSTRUCT: c_ulong = 0x5458;
+pub const TIOCSERGETLSR: c_ulong = 0x5459;
+pub const TIOCSERGETMULTI: c_ulong = 0x545A;
+pub const TIOCSERSETMULTI: c_ulong = 0x545B;
+
+pub const TIOCMIWAIT: c_ulong = 0x545C;
+pub const TIOCGICOUNT: c_ulong = 0x545D;
+pub const FIOQSIZE: c_ulong = 0x5460;
+
+pub const TIOCPKT_DATA: c_ulong = 0;
+pub const TIOCPKT_FLUSHREAD: c_ulong = 1;
+pub const TIOCPKT_FLUSHWRITE: c_ulong = 2;
+pub const TIOCPKT_STOP: c_ulong = 4;
+pub const TIOCPKT_START: c_ulong = 8;
+pub const TIOCPKT_NOSTOP: c_ulong = 16;
+pub const TIOCPKT_DOSTOP: c_ulong = 32;
+pub const TIOCPKT_IOCTL: c_ulong = 64;
+
+pub const TIOCSER_TEMT: c_ulong = 0x01;
+
+pub const TIOCM_LE: c_ulong = 0x001;
+pub const TIOCM_DTR: c_ulong = 0x002;
+pub const TIOCM_RTS: c_ulong = 0x004;
+pub const TIOCM_ST: c_ulong = 0x008;
+pub const TIOCM_SR: c_ulong = 0x010;
+pub const TIOCM_CTS: c_ulong = 0x020;
+pub const TIOCM_CAR: c_ulong = 0x040;
+pub const TIOCM_RNG: c_ulong = 0x080;
+pub const TIOCM_DSR: c_ulong = 0x100;
+pub const TIOCM_CD: c_ulong = TIOCM_CAR;
+pub const TIOCM_RI: c_ulong = TIOCM_RNG;
+pub const TIOCM_OUT1: c_ulong = 0x2000;
+pub const TIOCM_OUT2: c_ulong = 0x4000;
+pub const TIOCM_LOOP: c_ulong = 0x8000;
+
+pub const N_TTY: c_ulong = 0;
+pub const N_SLIP: c_ulong = 1;
+pub const N_MOUSE: c_ulong = 2;
+pub const N_PPP: c_ulong = 3;
+pub const N_STRIP: c_ulong = 4;
+pub const N_AX25: c_ulong = 5;
+pub const N_X25: c_ulong = 6;
+pub const N_6PACK: c_ulong = 7;
+pub const N_MASC: c_ulong = 8;
+pub const N_R3964: c_ulong = 9;
+pub const N_PROFIBUS_FDL: c_ulong = 10;
+pub const N_IRDA: c_ulong = 11;
+pub const N_SMSBLOCK: c_ulong = 12;
+pub const N_HDLC: c_ulong = 13;
+pub const N_SYNC_PPP: c_ulong = 14;
+pub const N_HCI: c_ulong = 15;
+
+pub const FIOSETOWN: c_ulong = 0x8901;
+pub const SIOCSPGRP: c_ulong = 0x8902;
+pub const FIOGETOWN: c_ulong = 0x8903;
+pub const SIOCGPGRP: c_ulong = 0x8904;
+pub const SIOCATMARK: c_ulong = 0x8905;
+pub const SIOCGSTAMP: c_ulong = 0x8906;
+pub const SIOCGSTAMPNS: c_ulong = 0x8907;
+
+pub const SIOCADDRT: c_ulong = 0x890B;
+pub const SIOCDELRT: c_ulong = 0x890C;
+pub const SIOCRTMSG: c_ulong = 0x890D;
+
+pub const SIOCGIFNAME: c_ulong = 0x8910;
+pub const SIOCSIFLINK: c_ulong = 0x8911;
+pub const SIOCGIFCONF: c_ulong = 0x8912;
+pub const SIOCGIFFLAGS: c_ulong = 0x8913;
+pub const SIOCSIFFLAGS: c_ulong = 0x8914;
+pub const SIOCGIFADDR: c_ulong = 0x8915;
+pub const SIOCSIFADDR: c_ulong = 0x8916;
+pub const SIOCGIFDSTADDR: c_ulong = 0x8917;
+pub const SIOCSIFDSTADDR: c_ulong = 0x8918;
+pub const SIOCGIFBRDADDR: c_ulong = 0x8919;
+pub const SIOCSIFBRDADDR: c_ulong = 0x891a;
+pub const SIOCGIFNETMASK: c_ulong = 0x891b;
+pub const SIOCSIFNETMASK: c_ulong = 0x891c;
+pub const SIOCGIFMETRIC: c_ulong = 0x891d;
+pub const SIOCSIFMETRIC: c_ulong = 0x891e;
+pub const SIOCGIFMEM: c_ulong = 0x891f;
+pub const SIOCSIFMEM: c_ulong = 0x8920;
+pub const SIOCGIFMTU: c_ulong = 0x8921;
+pub const SIOCSIFMTU: c_ulong = 0x8922;
+pub const SIOCSIFNAME: c_ulong = 0x8923;
+pub const SIOCSIFHWADDR: c_ulong = 0x8924;
+pub const SIOCGIFENCAP: c_ulong = 0x8925;
+pub const SIOCSIFENCAP: c_ulong = 0x8926;
+pub const SIOCGIFHWADDR: c_ulong = 0x8927;
+pub const SIOCGIFSLAVE: c_ulong = 0x8929;
+pub const SIOCSIFSLAVE: c_ulong = 0x8930;
+pub const SIOCADDMULTI: c_ulong = 0x8931;
+pub const SIOCDELMULTI: c_ulong = 0x8932;
+pub const SIOCGIFINDEX: c_ulong = 0x8933;
+pub const SIOGIFINDEX: c_ulong = SIOCGIFINDEX;
+pub const SIOCSIFPFLAGS: c_ulong = 0x8934;
+pub const SIOCGIFPFLAGS: c_ulong = 0x8935;
+pub const SIOCDIFADDR: c_ulong = 0x8936;
+pub const SIOCSIFHWBROADCAST: c_ulong = 0x8937;
+pub const SIOCGIFCOUNT: c_ulong = 0x8938;
+
+pub const SIOCGIFBR: c_ulong = 0x8940;
+pub const SIOCSIFBR: c_ulong = 0x8941;
+
+pub const SIOCGIFTXQLEN: c_ulong = 0x8942;
+pub const SIOCSIFTXQLEN: c_ulong = 0x8943;
+
+pub const SIOCDARP: c_ulong = 0x8953;
+pub const SIOCGARP: c_ulong = 0x8954;
+pub const SIOCSARP: c_ulong = 0x8955;
+
+pub const SIOCDRARP: c_ulong = 0x8960;
+pub const SIOCGRARP: c_ulong = 0x8961;
+pub const SIOCSRARP: c_ulong = 0x8962;
+
+pub const SIOCGIFMAP: c_ulong = 0x8970;
+pub const SIOCSIFMAP: c_ulong = 0x8971;
+
+pub const SIOCADDDLCI: c_ulong = 0x8980;
+pub const SIOCDELDLCI: c_ulong = 0x8981;
+
+pub const SIOCDEVPRIVATE: c_ulong = 0x89F0;
+pub const SIOCPROTOPRIVATE: c_ulong = 0x89E0;
diff --git a/src/header/sys_ioctl/mod.rs b/src/header/sys_ioctl/mod.rs
index e2b1c771..ee5a6080 100644
--- a/src/header/sys_ioctl/mod.rs
+++ b/src/header/sys_ioctl/mod.rs
@@ -12,214 +12,21 @@ pub struct sgttyb {
     sg_flags: c_ushort,
 }
 
-#[cfg(target_os = "linux")]
-pub mod inner {
-    use platform::types::*;
-    use platform::Sys;
-
-    #[repr(C)]
-    #[derive(Default)]
-    pub struct winsize {
-        ws_row: c_ushort,
-        ws_col: c_ushort,
-        ws_xpixel: c_ushort,
-        ws_ypixel: c_ushort,
-    }
-
-    #[no_mangle]
-    pub extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> c_int {
-        // TODO: Somehow support varargs to syscall??
-        Sys::ioctl(fd, request, out)
-    }
-
-    pub const TCGETS: c_ulong = 0x5401;
-    pub const TCSETS: c_ulong = 0x5402;
-    pub const TCSETSW: c_ulong = 0x5403;
-    pub const TCSETSF: c_ulong = 0x5404;
-    pub const TCGETA: c_ulong = 0x5405;
-    pub const TCSETA: c_ulong = 0x5406;
-    pub const TCSETAW: c_ulong = 0x5407;
-    pub const TCSETAF: c_ulong = 0x5408;
-    pub const TCSBRK: c_ulong = 0x5409;
-    pub const TCXONC: c_ulong = 0x540A;
-    pub const TCFLSH: c_ulong = 0x540B;
-    pub const TIOCEXCL: c_ulong = 0x540C;
-    pub const TIOCNXCL: c_ulong = 0x540D;
-    pub const TIOCSCTTY: c_ulong = 0x540E;
-    pub const TIOCGPGRP: c_ulong = 0x540F;
-    pub const TIOCSPGRP: c_ulong = 0x5410;
-    pub const TIOCOUTQ: c_ulong = 0x5411;
-    pub const TIOCSTI: c_ulong = 0x5412;
-    pub const TIOCGWINSZ: c_ulong = 0x5413;
-    pub const TIOCSWINSZ: c_ulong = 0x5414;
-    pub const TIOCMGET: c_ulong = 0x5415;
-    pub const TIOCMBIS: c_ulong = 0x5416;
-    pub const TIOCMBIC: c_ulong = 0x5417;
-    pub const TIOCMSET: c_ulong = 0x5418;
-    pub const TIOCGSOFTCAR: c_ulong = 0x5419;
-    pub const TIOCSSOFTCAR: c_ulong = 0x541A;
-    pub const FIONREAD: c_ulong = 0x541B;
-    pub const TIOCINQ: c_ulong = FIONREAD;
-    pub const TIOCLINUX: c_ulong = 0x541C;
-    pub const TIOCCONS: c_ulong = 0x541D;
-    pub const TIOCGSERIAL: c_ulong = 0x541E;
-    pub const TIOCSSERIAL: c_ulong = 0x541F;
-    pub const TIOCPKT: c_ulong = 0x5420;
-    pub const FIONBIO: c_ulong = 0x5421;
-    pub const TIOCNOTTY: c_ulong = 0x5422;
-    pub const TIOCSETD: c_ulong = 0x5423;
-    pub const TIOCGETD: c_ulong = 0x5424;
-    pub const TCSBRKP: c_ulong = 0x5425;
-    pub const TIOCSBRK: c_ulong = 0x5427;
-    pub const TIOCCBRK: c_ulong = 0x5428;
-    pub const TIOCGSID: c_ulong = 0x5429;
-    pub const TIOCGRS485: c_ulong = 0x542E;
-    pub const TIOCSRS485: c_ulong = 0x542F;
-    pub const TIOCGPTN: c_ulong = 0x8004_5430;
-    pub const TIOCSPTLCK: c_ulong = 0x4004_5431;
-    pub const TIOCGDEV: c_ulong = 0x8004_5432;
-    pub const TCGETX: c_ulong = 0x5432;
-    pub const TCSETX: c_ulong = 0x5433;
-    pub const TCSETXF: c_ulong = 0x5434;
-    pub const TCSETXW: c_ulong = 0x5435;
-    pub const TIOCSIG: c_ulong = 0x4004_5436;
-    pub const TIOCVHANGUP: c_ulong = 0x5437;
-    pub const TIOCGPKT: c_ulong = 0x8004_5438;
-    pub const TIOCGPTLCK: c_ulong = 0x8004_5439;
-    pub const TIOCGEXCL: c_ulong = 0x8004_5440;
-    pub const TIOCGPTPEER: c_ulong = 0x5441;
-
-    pub const FIONCLEX: c_ulong = 0x5450;
-    pub const FIOCLEX: c_ulong = 0x5451;
-    pub const FIOASYNC: c_ulong = 0x5452;
-    pub const TIOCSERCONFIG: c_ulong = 0x5453;
-    pub const TIOCSERGWILD: c_ulong = 0x5454;
-    pub const TIOCSERSWILD: c_ulong = 0x5455;
-    pub const TIOCGLCKTRMIOS: c_ulong = 0x5456;
-    pub const TIOCSLCKTRMIOS: c_ulong = 0x5457;
-    pub const TIOCSERGSTRUCT: c_ulong = 0x5458;
-    pub const TIOCSERGETLSR: c_ulong = 0x5459;
-    pub const TIOCSERGETMULTI: c_ulong = 0x545A;
-    pub const TIOCSERSETMULTI: c_ulong = 0x545B;
-
-    pub const TIOCMIWAIT: c_ulong = 0x545C;
-    pub const TIOCGICOUNT: c_ulong = 0x545D;
-    pub const FIOQSIZE: c_ulong = 0x5460;
-
-    pub const TIOCPKT_DATA: c_ulong = 0;
-    pub const TIOCPKT_FLUSHREAD: c_ulong = 1;
-    pub const TIOCPKT_FLUSHWRITE: c_ulong = 2;
-    pub const TIOCPKT_STOP: c_ulong = 4;
-    pub const TIOCPKT_START: c_ulong = 8;
-    pub const TIOCPKT_NOSTOP: c_ulong = 16;
-    pub const TIOCPKT_DOSTOP: c_ulong = 32;
-    pub const TIOCPKT_IOCTL: c_ulong = 64;
-
-    pub const TIOCSER_TEMT: c_ulong = 0x01;
-
-    pub const TIOCM_LE: c_ulong = 0x001;
-    pub const TIOCM_DTR: c_ulong = 0x002;
-    pub const TIOCM_RTS: c_ulong = 0x004;
-    pub const TIOCM_ST: c_ulong = 0x008;
-    pub const TIOCM_SR: c_ulong = 0x010;
-    pub const TIOCM_CTS: c_ulong = 0x020;
-    pub const TIOCM_CAR: c_ulong = 0x040;
-    pub const TIOCM_RNG: c_ulong = 0x080;
-    pub const TIOCM_DSR: c_ulong = 0x100;
-    pub const TIOCM_CD: c_ulong = TIOCM_CAR;
-    pub const TIOCM_RI: c_ulong = TIOCM_RNG;
-    pub const TIOCM_OUT1: c_ulong = 0x2000;
-    pub const TIOCM_OUT2: c_ulong = 0x4000;
-    pub const TIOCM_LOOP: c_ulong = 0x8000;
-
-    pub const N_TTY: c_ulong = 0;
-    pub const N_SLIP: c_ulong = 1;
-    pub const N_MOUSE: c_ulong = 2;
-    pub const N_PPP: c_ulong = 3;
-    pub const N_STRIP: c_ulong = 4;
-    pub const N_AX25: c_ulong = 5;
-    pub const N_X25: c_ulong = 6;
-    pub const N_6PACK: c_ulong = 7;
-    pub const N_MASC: c_ulong = 8;
-    pub const N_R3964: c_ulong = 9;
-    pub const N_PROFIBUS_FDL: c_ulong = 10;
-    pub const N_IRDA: c_ulong = 11;
-    pub const N_SMSBLOCK: c_ulong = 12;
-    pub const N_HDLC: c_ulong = 13;
-    pub const N_SYNC_PPP: c_ulong = 14;
-    pub const N_HCI: c_ulong = 15;
-
-    pub const FIOSETOWN: c_ulong = 0x8901;
-    pub const SIOCSPGRP: c_ulong = 0x8902;
-    pub const FIOGETOWN: c_ulong = 0x8903;
-    pub const SIOCGPGRP: c_ulong = 0x8904;
-    pub const SIOCATMARK: c_ulong = 0x8905;
-    pub const SIOCGSTAMP: c_ulong = 0x8906;
-    pub const SIOCGSTAMPNS: c_ulong = 0x8907;
-
-    pub const SIOCADDRT: c_ulong = 0x890B;
-    pub const SIOCDELRT: c_ulong = 0x890C;
-    pub const SIOCRTMSG: c_ulong = 0x890D;
-
-    pub const SIOCGIFNAME: c_ulong = 0x8910;
-    pub const SIOCSIFLINK: c_ulong = 0x8911;
-    pub const SIOCGIFCONF: c_ulong = 0x8912;
-    pub const SIOCGIFFLAGS: c_ulong = 0x8913;
-    pub const SIOCSIFFLAGS: c_ulong = 0x8914;
-    pub const SIOCGIFADDR: c_ulong = 0x8915;
-    pub const SIOCSIFADDR: c_ulong = 0x8916;
-    pub const SIOCGIFDSTADDR: c_ulong = 0x8917;
-    pub const SIOCSIFDSTADDR: c_ulong = 0x8918;
-    pub const SIOCGIFBRDADDR: c_ulong = 0x8919;
-    pub const SIOCSIFBRDADDR: c_ulong = 0x891a;
-    pub const SIOCGIFNETMASK: c_ulong = 0x891b;
-    pub const SIOCSIFNETMASK: c_ulong = 0x891c;
-    pub const SIOCGIFMETRIC: c_ulong = 0x891d;
-    pub const SIOCSIFMETRIC: c_ulong = 0x891e;
-    pub const SIOCGIFMEM: c_ulong = 0x891f;
-    pub const SIOCSIFMEM: c_ulong = 0x8920;
-    pub const SIOCGIFMTU: c_ulong = 0x8921;
-    pub const SIOCSIFMTU: c_ulong = 0x8922;
-    pub const SIOCSIFNAME: c_ulong = 0x8923;
-    pub const SIOCSIFHWADDR: c_ulong = 0x8924;
-    pub const SIOCGIFENCAP: c_ulong = 0x8925;
-    pub const SIOCSIFENCAP: c_ulong = 0x8926;
-    pub const SIOCGIFHWADDR: c_ulong = 0x8927;
-    pub const SIOCGIFSLAVE: c_ulong = 0x8929;
-    pub const SIOCSIFSLAVE: c_ulong = 0x8930;
-    pub const SIOCADDMULTI: c_ulong = 0x8931;
-    pub const SIOCDELMULTI: c_ulong = 0x8932;
-    pub const SIOCGIFINDEX: c_ulong = 0x8933;
-    pub const SIOGIFINDEX: c_ulong = SIOCGIFINDEX;
-    pub const SIOCSIFPFLAGS: c_ulong = 0x8934;
-    pub const SIOCGIFPFLAGS: c_ulong = 0x8935;
-    pub const SIOCDIFADDR: c_ulong = 0x8936;
-    pub const SIOCSIFHWBROADCAST: c_ulong = 0x8937;
-    pub const SIOCGIFCOUNT: c_ulong = 0x8938;
-
-    pub const SIOCGIFBR: c_ulong = 0x8940;
-    pub const SIOCSIFBR: c_ulong = 0x8941;
-
-    pub const SIOCGIFTXQLEN: c_ulong = 0x8942;
-    pub const SIOCSIFTXQLEN: c_ulong = 0x8943;
-
-    pub const SIOCDARP: c_ulong = 0x8953;
-    pub const SIOCGARP: c_ulong = 0x8954;
-    pub const SIOCSARP: c_ulong = 0x8955;
-
-    pub const SIOCDRARP: c_ulong = 0x8960;
-    pub const SIOCGRARP: c_ulong = 0x8961;
-    pub const SIOCSRARP: c_ulong = 0x8962;
-
-    pub const SIOCGIFMAP: c_ulong = 0x8970;
-    pub const SIOCSIFMAP: c_ulong = 0x8971;
-
-    pub const SIOCADDDLCI: c_ulong = 0x8980;
-    pub const SIOCDELDLCI: c_ulong = 0x8981;
-
-    pub const SIOCDEVPRIVATE: c_ulong = 0x89F0;
-    pub const SIOCPROTOPRIVATE: c_ulong = 0x89E0;
+#[repr(C)]
+#[derive(Default)]
+pub struct winsize {
+    ws_row: c_ushort,
+    ws_col: c_ushort,
+    ws_xpixel: c_ushort,
+    ws_ypixel: c_ushort,
 }
 
+pub use self::sys::*;
+
 #[cfg(target_os = "linux")]
-pub use self::inner::*;
+#[path = "linux.rs"]
+pub mod sys;
+
+#[cfg(target_os = "redox")]
+#[path = "redox.rs"]
+pub mod sys;
diff --git a/src/header/sys_ioctl/redox.rs b/src/header/sys_ioctl/redox.rs
new file mode 100644
index 00000000..6d0f0257
--- /dev/null
+++ b/src/header/sys_ioctl/redox.rs
@@ -0,0 +1,93 @@
+use core::{mem, slice};
+use syscall;
+
+use header::errno;
+use platform;
+use platform::e;
+use platform::types::*;
+
+use super::winsize;
+
+#[no_mangle]
+pub unsafe extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> c_int {
+    match request {
+        TIOCGPGRP => {
+            let dup = e(syscall::dup(fd as usize, b"pgrp"));
+            if dup == !0 {
+                return -1;
+            }
+
+            let count = e(syscall::read(
+                dup,
+                slice::from_raw_parts_mut(out as *mut u8, mem::size_of::<pid_t>())
+            ));
+            let _ = syscall::close(dup);
+
+            if count == !0 {
+                return -1;
+            }
+            0
+        },
+        TIOCSPGRP => {
+            let dup = e(syscall::dup(fd as usize, b"pgrp"));
+            if dup == !0 {
+                return -1;
+            }
+
+            let count = e(syscall::write(
+                dup,
+                slice::from_raw_parts(out as *const u8, mem::size_of::<pid_t>())
+            ));
+            let _ = syscall::close(dup);
+
+            if count == !0 {
+                return -1;
+            }
+            0
+        },
+        TIOCGWINSZ => {
+            let dup = e(syscall::dup(fd as usize, b"winsize"));
+            if dup == !0 {
+                return -1;
+            }
+
+            let count = e(syscall::read(
+                dup,
+                slice::from_raw_parts_mut(out as *mut u8, mem::size_of::<winsize>())
+            ));
+            let _ = syscall::close(dup);
+
+            if count == !0 {
+                return -1;
+            }
+            0
+        },
+        TIOCSWINSZ => {
+            let dup = e(syscall::dup(fd as usize, b"winsize"));
+            if dup == !0 {
+                return -1;
+            }
+
+            let count = e(syscall::write(
+                dup,
+                slice::from_raw_parts(out as *const u8, mem::size_of::<winsize>())
+            ));
+            let _ = syscall::close(dup);
+
+            if count == !0 {
+                return -1;
+            }
+            0
+        },
+        _ => {
+            platform::errno = errno::EINVAL;
+            -1
+        }
+    }
+}
+
+pub const TIOCGPGRP: c_ulong = 0x540F;
+pub const TIOCSPGRP: c_ulong = 0x5410;
+
+pub const TIOCGWINSZ: c_ulong = 0x5413;
+pub const TIOCSWINSZ: c_ulong = 0x5414;
diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs
index 1ca7a6c0..3c3dd3ef 100644
--- a/src/header/unistd/mod.rs
+++ b/src/header/unistd/mod.rs
@@ -6,6 +6,7 @@ use c_str::CStr;
 use header::errno;
 use header::limits;
 use header::stdlib::getenv;
+use header::sys_ioctl;
 use header::sys_time;
 use header::time::timespec;
 use platform;
@@ -565,14 +566,21 @@ pub extern "C" fn sync() {
     unimplemented!();
 }
 
-// #[no_mangle]
-pub extern "C" fn tcgetpgrp() -> pid_t {
-    unimplemented!();
+#[no_mangle]
+pub extern "C" fn tcgetpgrp(fd: c_int) -> pid_t {
+    let mut pgrp = 0;
+    if unsafe { sys_ioctl::ioctl(fd, sys_ioctl::TIOCGPGRP, &mut pgrp as *mut pid_t as _) } < 0 {
+        return -1;
+    }
+    pgrp
 }
 
-// #[no_mangle]
-pub extern "C" fn tcsetpgrp(fildes: c_int, pgid_id: pid_t) -> c_int {
-    unimplemented!();
+#[no_mangle]
+pub extern "C" fn tcsetpgrp(fd: c_int, pgrp: pid_t) -> c_int {
+    if unsafe { sys_ioctl::ioctl(fd, sys_ioctl::TIOCSPGRP, &pgrp as *const pid_t as _) } < 0 {
+        return -1;
+    }
+    pgrp
 }
 
 // #[no_mangle]
@@ -643,10 +651,3 @@ pub extern "C" fn write(fildes: c_int, buf: *const c_void, nbyte: size_t) -> ssi
     let buf = unsafe { slice::from_raw_parts(buf as *const u8, nbyte as usize) };
     Sys::write(fildes, buf)
 }
-
-/*
-#[no_mangle]
-pub extern "C" fn func(args) -> c_int {
-    unimplemented!();
-}
-*/
diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs
index 96289aa2..26003962 100644
--- a/src/platform/linux/mod.rs
+++ b/src/platform/linux/mod.rs
@@ -50,7 +50,7 @@ struct linux_statfs {
     f_spare: [c_long; 4],
 }
 
-fn e(sys: usize) -> usize {
+pub fn e(sys: usize) -> usize {
     if (sys as isize) < 0 && (sys as isize) >= -256 {
         unsafe {
             errno = -(sys as isize) as c_int;
diff --git a/src/platform/mod.rs b/src/platform/mod.rs
index 0fb59270..37da18e6 100644
--- a/src/platform/mod.rs
+++ b/src/platform/mod.rs
@@ -16,7 +16,7 @@ pub use self::pal::{Pal, PalSignal, PalSocket};
 
 mod pal;
 
-pub use self::sys::Sys;
+pub use self::sys::{e, Sys};
 
 #[cfg(all(not(feature = "no_std"), target_os = "linux"))]
 #[path = "linux/mod.rs"]
diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs
index 6ab08a79..5fb4d4e6 100644
--- a/src/platform/redox/mod.rs
+++ b/src/platform/redox/mod.rs
@@ -34,7 +34,7 @@ mod extra;
 mod signal;
 mod socket;
 
-fn e(sys: Result<usize>) -> usize {
+pub fn e(sys: Result<usize>) -> usize {
     match sys {
         Ok(ok) => ok,
         Err(err) => {
-- 
GitLab