From e7e9d57db59adfdf22de5e6af22401dcc17840aa Mon Sep 17 00:00:00 2001 From: jD91mZM2 <me@krake.one> Date: Sun, 29 Jul 2018 07:55:19 +0200 Subject: [PATCH] Implement a dummy sgtty --- Cargo.lock | 10 ++++++++++ Cargo.toml | 1 + src/lib.rs | 1 + src/sgtty/Cargo.toml | 11 +++++++++++ src/sgtty/build.rs | 11 +++++++++++ src/sgtty/cbindgen.toml | 7 +++++++ src/sgtty/src/lib.rs | 20 ++++++++++++++++++++ src/sys_ioctl/Cargo.toml | 2 +- src/sys_ioctl/cbindgen.toml | 8 +++++++- src/sys_ioctl/src/lib.rs | 18 +++++++++++++++--- src/sys_wait/cbindgen.toml | 2 +- 11 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 src/sgtty/Cargo.toml create mode 100644 src/sgtty/build.rs create mode 100644 src/sgtty/cbindgen.toml create mode 100644 src/sgtty/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index c31c410c..a0505d02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -337,6 +337,7 @@ dependencies = [ "pwd 0.1.0", "semaphore 0.1.0", "setjmp 0.1.0", + "sgtty 0.1.0", "signal 0.1.0", "stdio 0.1.0", "stdlib 0.1.0", @@ -419,6 +420,15 @@ dependencies = [ name = "setjmp" version = "0.1.0" +[[package]] +name = "sgtty" +version = "0.1.0" +dependencies = [ + "cbindgen 0.5.2", + "platform 0.1.0", + "sys_ioctl 0.1.0", +] + [[package]] name = "signal" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 61741db7..ea17f150 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ platform = { path = "src/platform" } pwd = { path = "src/pwd" } semaphore = { path = "src/semaphore" } setjmp = { path = "src/setjmp" } +sgtty = { path = "src/sgtty" } signal = { path = "src/signal" } stdio = { path = "src/stdio" } stdlib = { path = "src/stdlib" } diff --git a/src/lib.rs b/src/lib.rs index 915133e9..8e752a84 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,6 +19,7 @@ pub extern crate netinet; pub extern crate pwd; pub extern crate semaphore; pub extern crate setjmp; +pub extern crate sgtty; pub extern crate signal; pub extern crate stdio; pub extern crate stdlib; diff --git a/src/sgtty/Cargo.toml b/src/sgtty/Cargo.toml new file mode 100644 index 00000000..d26f1d54 --- /dev/null +++ b/src/sgtty/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "sgtty" +version = "0.1.0" +authors = ["jD91mZM2 <me@krake.one>"] + +[build-dependencies] +cbindgen = { path = "../../cbindgen" } + +[dependencies] +platform = { path = "../platform" } +sys_ioctl = { path = "../sys_ioctl" } diff --git a/src/sgtty/build.rs b/src/sgtty/build.rs new file mode 100644 index 00000000..7357fa95 --- /dev/null +++ b/src/sgtty/build.rs @@ -0,0 +1,11 @@ +extern crate cbindgen; + +use std::{env, fs}; + +fn main() { + let crate_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"); + fs::create_dir_all("../../target/include").expect("failed to create include directory"); + cbindgen::generate(crate_dir) + .expect("failed to generate bindings") + .write_to_file("../../target/include/sgtty.h"); +} diff --git a/src/sgtty/cbindgen.toml b/src/sgtty/cbindgen.toml new file mode 100644 index 00000000..91014356 --- /dev/null +++ b/src/sgtty/cbindgen.toml @@ -0,0 +1,7 @@ +sys_includes = ["sys/ioctl.h"] +include_guard = "_SGTTY_H" +style = "Tag" +language = "C" + +[enum] +prefix_with_name = true diff --git a/src/sgtty/src/lib.rs b/src/sgtty/src/lib.rs new file mode 100644 index 00000000..eece1923 --- /dev/null +++ b/src/sgtty/src/lib.rs @@ -0,0 +1,20 @@ +//! sgtty implementation that won't work on redox because no ioctl +#![no_std] + +extern crate platform; +extern crate sys_ioctl; + +use core::fmt::Write; +use platform::types::*; +use sys_ioctl::*; + +#[no_mangle] +pub extern "C" fn gtty(fd: c_int, out: *mut sgttyb) -> c_int { + writeln!( + platform::FileWriter(2), + "unimplemented: gtty({}, {:p})", + fd, + out + ); + -1 +} diff --git a/src/sys_ioctl/Cargo.toml b/src/sys_ioctl/Cargo.toml index d0e42196..6f868b8c 100644 --- a/src/sys_ioctl/Cargo.toml +++ b/src/sys_ioctl/Cargo.toml @@ -6,5 +6,5 @@ authors = ["jD91mZM2 <me@krake.one>"] [build-dependencies] cbindgen = { path = "../../cbindgen" } -[target.'cfg(target_os = "linux")'.dependencies] +[dependencies] platform = { path = "../platform" } diff --git a/src/sys_ioctl/cbindgen.toml b/src/sys_ioctl/cbindgen.toml index 6a539376..fb4982cc 100644 --- a/src/sys_ioctl/cbindgen.toml +++ b/src/sys_ioctl/cbindgen.toml @@ -1,7 +1,13 @@ sys_includes = [] include_guard = "_IOCTL_H" language = "C" -style = "Tag" + +# WORKAROUND: +# sgtty is used by another header, and cbindgen doesn't prefix that with `struct` :| +style = "Both" [enum] prefix_with_name = true + +[export] +include = ["sgttyb", "winsize"] diff --git a/src/sys_ioctl/src/lib.rs b/src/sys_ioctl/src/lib.rs index 308d4049..d62132a1 100644 --- a/src/sys_ioctl/src/lib.rs +++ b/src/sys_ioctl/src/lib.rs @@ -2,11 +2,23 @@ #![no_std] +extern crate platform; + +use platform::types::*; + +// This is used from sgtty +#[repr(C)] +pub struct sgttyb { + sg_ispeed: c_char, + sg_ospeed: c_char, + sg_erase: c_char, + sg_kill: c_char, + sg_flags: c_ushort +} + #[cfg(target_os = "linux")] pub mod inner { - extern crate platform; - - use self::platform::types::*; + use ::*; #[repr(C)] pub struct winsize { diff --git a/src/sys_wait/cbindgen.toml b/src/sys_wait/cbindgen.toml index 7fd08600..1f9e768e 100644 --- a/src/sys_wait/cbindgen.toml +++ b/src/sys_wait/cbindgen.toml @@ -1,6 +1,6 @@ sys_includes = ["sys/types.h", "sys/resource.h"] include_guard = "_SYS_WAIT_H" -style = "Tag" +style = "Type" trailer = "#include <bits/sys/wait.h>" language = "C" -- GitLab