From b4f36bce17cc44673b7a649d19b7155fcfca1e8f Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Thu, 22 Nov 2018 19:09:46 -0700
Subject: [PATCH] Add more stdio_ext functions

---
 src/header/stdio/ext.rs | 23 +++++++++++++++++++++++
 src/header/stdio/mod.rs | 21 +++++++--------------
 2 files changed, 30 insertions(+), 14 deletions(-)
 create mode 100644 src/header/stdio/ext.rs

diff --git a/src/header/stdio/ext.rs b/src/header/stdio/ext.rs
new file mode 100644
index 00000000..b33c649d
--- /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 4f5953b7..e3001a2b 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 {
-- 
GitLab