diff --git a/src/header/stdio/ext.rs b/src/header/stdio/ext.rs
new file mode 100644
index 0000000000000000000000000000000000000000..b33c649d6585563fc0cbee8744d2c8d63183e485
--- /dev/null
+++ b/src/header/stdio/ext.rs
@@ -0,0 +1,23 @@
+use header::stdio::{FILE, F_NORD, F_NOWR};
+use platform::types::*;
+
+#[no_mangle]
+pub extern "C" fn __freadable(stream: *mut FILE) -> c_int {
+    let mut stream = unsafe { &mut *stream }.lock();
+
+    (stream.flags & F_NORD == 0) as c_int
+}
+
+#[no_mangle]
+pub extern "C" fn __fwritable(stream: *mut FILE) -> c_int {
+    let mut stream = unsafe { &mut *stream }.lock();
+
+    (stream.flags & F_NOWR == 0) as c_int
+}
+
+#[no_mangle]
+pub extern "C" fn __fpending(stream: *mut FILE) -> size_t {
+    let mut stream = unsafe { &mut *stream }.lock();
+
+    stream.writer.inner.buf.len() as size_t
+}
diff --git a/src/header/stdio/mod.rs b/src/header/stdio/mod.rs
index 4f5953b78d918b8e2a0757d13ffce77d818916be..e3001a2bc7f11d34fbb0e31d11de1c036f249731 100644
--- a/src/header/stdio/mod.rs
+++ b/src/header/stdio/mod.rs
@@ -22,16 +22,16 @@ use platform::{Pal, Sys};
 use platform::{errno, WriteByte};
 use platform;
 
-mod printf;
-mod scanf;
+pub use self::constants::*;
+mod constants;
 
 pub use self::default::*;
 mod default;
 
-pub use self::constants::*;
-mod constants;
-
+mod ext;
 mod helpers;
+mod printf;
+mod scanf;
 
 enum Buffer<'a> {
     Borrowed(&'a mut [u8]),
@@ -62,12 +62,12 @@ pub struct FILE {
     lock: Mutex<()>,
 
     file: File,
-    flags: c_int,
+    pub(crate) /* stdio_ext */ flags: c_int,
     read_buf: Buffer<'static>,
     read_pos: usize,
     read_size: usize,
     unget: Option<u8>,
-    writer: LineWriter<File>
+    pub(crate) /* stdio_ext */ writer: LineWriter<File>
 }
 
 impl Read for FILE {
@@ -390,13 +390,6 @@ pub extern "C" fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FI
     }
 }
 
-#[no_mangle]
-pub extern "C" fn __fpending(stream: *mut FILE) -> size_t {
-    let mut stream = unsafe { &mut *stream }.lock();
-
-    stream.writer.inner.buf.len() as size_t
-}
-
 /// Insert a character into the stream
 #[no_mangle]
 pub extern "C" fn fputc(c: c_int, stream: *mut FILE) -> c_int {