diff --git a/Cargo.lock b/Cargo.lock
index c31c410c139f33e174415a569823c46971a9374f..a0505d021c0d5ece925ff517e6b34e9a8adb32fc 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 61741db75ec44533b3960bf52d0ae5d16657577d..ea17f150042320aa06e2c161b0317243f67c8e29 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 915133e9b9600eb10bb1d0257075c933e3ef3084..8e752a84464fc90ae0ec45e356a325adf538ceef 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 0000000000000000000000000000000000000000..d26f1d54ff0a8de863efbbd62840581cfa89c00a
--- /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 0000000000000000000000000000000000000000..7357fa95fb69b3273bba53c5c655eacde79b7662
--- /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 0000000000000000000000000000000000000000..910143569c16113e4386eb33b808d667d2f1b589
--- /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 0000000000000000000000000000000000000000..eece192334f1f9af2a53221b157efa89c06c9066
--- /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 d0e42196c532445debbf1025a2ed88f142734336..6f868b8c34dbfbf52c266cf3cf1d71c16d8a99a7 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 6a539376f7ddfc882d63266d5abd28906e4d28c4..fb4982cc5f86a66a015a1db2f91ecfde0c31abf9 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 308d40490cf7fcb8024309202ee3119299f02845..d62132a146d86897fd2c79b6abd8a8d979c6e66d 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 7fd08600788a249945934c749738aa302d1a0565..1f9e768edfee676f6df3d2e8ccd3592736b027a0 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"