Auto merge of #26941 - fhartwig:osx-file-debug, r=alexcrichton

This makes `Debug` for `File` show the file path and access mode of the file on OS X, just like on Linux.
I'd be happy about any feedback how to make this code better. In particular, I'm not sure how to handle the buffer passed to `fnctl`. This way works, but it feels a bit cumbersome. `fcntl` unfortunately doesn't return the length of the path.
This commit is contained in:
bors 2015-07-11 00:01:51 +00:00
commit 98dcd5e10a
2 changed files with 20 additions and 3 deletions

View file

@ -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;

View file

@ -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<PathBuf> {
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<PathBuf> {
// 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