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:
commit
98dcd5e10a
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user