From f200ad85bd8ead749dea217bdd65dfe130c4db18 Mon Sep 17 00:00:00 2001 From: Florian Hartwig Date: Fri, 10 Jul 2015 16:23:14 +0200 Subject: [PATCH] Show file name and access mode in Debug instance for File on OS X --- src/liblibc/lib.rs | 5 +++++ src/libstd/sys/unix/fs.rs | 18 +++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/liblibc/lib.rs b/src/liblibc/lib.rs index 0a32c73a848d0..c41a161c82c76 100644 --- a/src/liblibc/lib.rs +++ b/src/liblibc/lib.rs @@ -4978,6 +4978,8 @@ pub mod consts { pub const F_GETFL : c_int = 3; pub const F_SETFL : c_int = 4; + pub const O_ACCMODE : c_int = 3; + pub const SIGTRAP : c_int = 5; pub const SIG_IGN: size_t = 1; @@ -5130,6 +5132,7 @@ pub mod consts { pub const O_DSYNC : c_int = 4194304; pub const O_SYNC : c_int = 128; pub const O_NONBLOCK : c_int = 4; + pub const F_GETPATH : c_int = 50; pub const F_FULLFSYNC : c_int = 51; pub const MAP_COPY : c_int = 0x0002; @@ -5151,6 +5154,8 @@ pub mod consts { pub const SO_DONTTRUNC: c_int = 0x2000; pub const SO_WANTMORE: c_int = 0x4000; pub const SO_WANTOOBFLAG: c_int = 0x8000; + + pub const PATH_MAX: c_int = 1024; } pub mod sysconf { use types::os::arch::c95::c_int; diff --git a/src/libstd/sys/unix/fs.rs b/src/libstd/sys/unix/fs.rs index 8113d0ea8479c..867cdcbab94cb 100644 --- a/src/libstd/sys/unix/fs.rs +++ b/src/libstd/sys/unix/fs.rs @@ -370,13 +370,25 @@ impl fmt::Debug for File { readlink(&p).ok() } - #[cfg(not(target_os = "linux"))] + #[cfg(target_os = "macos")] + fn get_path(fd: c_int) -> Option { + let mut buf = vec![0;libc::PATH_MAX as usize]; + let n = unsafe { libc::fcntl(fd, libc::F_GETPATH, buf.as_ptr()) }; + if n == -1 { + return None; + } + let l = buf.iter().position(|&c| c == 0).unwrap(); + buf.truncate(l as usize); + Some(PathBuf::from(OsString::from_vec(buf))) + } + + #[cfg(not(any(target_os = "linux", target_os = "macos")))] fn get_path(_fd: c_int) -> Option { // FIXME(#24570): implement this for other Unix platforms None } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "macos"))] fn get_mode(fd: c_int) -> Option<(bool, bool)> { let mode = unsafe { libc::fcntl(fd, libc::F_GETFL) }; if mode == -1 { @@ -390,7 +402,7 @@ impl fmt::Debug for File { } } - #[cfg(not(target_os = "linux"))] + #[cfg(not(any(target_os = "linux", target_os = "macos")))] fn get_mode(_fd: c_int) -> Option<(bool, bool)> { // FIXME(#24570): implement this for other Unix platforms None