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