diff --git a/src/uu/stdbuf/src/libstdbuf/Cargo.toml b/src/uu/stdbuf/src/libstdbuf/Cargo.toml index df9e5a81a03..9e8a5a64bb3 100644 --- a/src/uu/stdbuf/src/libstdbuf/Cargo.toml +++ b/src/uu/stdbuf/src/libstdbuf/Cargo.toml @@ -14,7 +14,6 @@ rust-version.workspace = true name = "stdbuf" path = "src/libstdbuf.rs" crate-type = ["cdylib"] -test = false [dependencies] ctor = { workspace = true } diff --git a/src/uu/stdbuf/src/libstdbuf/src/libstdbuf.rs b/src/uu/stdbuf/src/libstdbuf/src/libstdbuf.rs index f1aa4dcb621..3875fa69fd6 100644 --- a/src/uu/stdbuf/src/libstdbuf/src/libstdbuf.rs +++ b/src/uu/stdbuf/src/libstdbuf/src/libstdbuf.rs @@ -24,9 +24,9 @@ pub unsafe extern "C" fn __stdbuf_get_stdin() -> *mut FILE { #[cfg(any(target_vendor = "apple", target_os = "freebsd"))] { unsafe extern "C" { - fn __stdinp() -> *mut FILE; + static mut __stdinp: *mut FILE; } - unsafe { __stdinp() } + unsafe { __stdinp } } #[cfg(target_os = "openbsd")] @@ -87,9 +87,9 @@ pub unsafe extern "C" fn __stdbuf_get_stdout() -> *mut FILE { #[cfg(any(target_vendor = "apple", target_os = "freebsd"))] { unsafe extern "C" { - fn __stdoutp() -> *mut FILE; + static mut __stdoutp: *mut FILE; } - unsafe { __stdoutp() } + unsafe { __stdoutp } } #[cfg(target_os = "openbsd")] @@ -150,9 +150,9 @@ pub unsafe extern "C" fn __stdbuf_get_stderr() -> *mut FILE { #[cfg(any(target_vendor = "apple", target_os = "freebsd"))] { unsafe extern "C" { - fn __stderrp() -> *mut FILE; + static mut __stderrp: *mut FILE; } - unsafe { __stderrp() } + unsafe { __stderrp } } #[cfg(target_os = "openbsd")] @@ -188,7 +188,7 @@ pub unsafe extern "C" fn __stdbuf_get_stderr() -> *mut FILE { fn __getreent() -> *mut _reent; } - unsafe { (*__getreent())._stdin } + unsafe { (*__getreent())._stderr } } #[cfg(not(any( @@ -249,3 +249,18 @@ pub unsafe extern "C" fn __stdbuf() { set_buffer(unsafe { __stdbuf_get_stdout() }, &val); } } + +#[cfg(all(test, unix))] +mod tests { + use super::*; + + // Each getter must return its own stream, not another one. + #[test] + fn test_stream_getters_return_matching_streams() { + unsafe { + assert_eq!(fileno(__stdbuf_get_stdin()), libc::STDIN_FILENO); + assert_eq!(fileno(__stdbuf_get_stdout()), libc::STDOUT_FILENO); + assert_eq!(fileno(__stdbuf_get_stderr()), libc::STDERR_FILENO); + } + } +}