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