diff options
author | Jörg Thalheim <joerg@thalheim.io> | 2017-03-08 00:12:45 +0100 |
---|---|---|
committer | Jörg Thalheim <joerg@thalheim.io> | 2017-03-21 01:27:21 +0100 |
commit | b6a8a3c64f63a4f540000084a6ec19d635f48e6c (patch) | |
tree | 89c6e13d7113e1a0640c99890ffbc0d6ee53b1f7 | |
parent | 2b0c63f56dcf69fba328e8d5b2139bc6e5cef930 (diff) | |
download | nix-b6a8a3c64f63a4f540000084a6ec19d635f48e6c.zip |
add support for `fstatat`
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | src/sys/stat.rs | 13 | ||||
-rw-r--r-- | test/test_stat.rs | 19 |
4 files changed, 32 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index f58c66fd..bc54b9e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] <!--### Added--> -- Added `openat` in `::nix::unistd` +- Added `openat`, `fstatat` in `::nix::unistd` ([#497](https://github.com/nix-rust/nix/pull/551)) ### Changed @@ -22,7 +22,7 @@ preadv_pwritev = [] signalfd = [] [dependencies] -libc = { git = "https://github.com/rust-lang/libc" } +libc = { git = "https://github.com/Mic92/libc" } bitflags = "0.7" cfg-if = "0.1.0" void = "1.0.2" diff --git a/src/sys/stat.rs b/src/sys/stat.rs index 1ff35923..054aedc1 100644 --- a/src/sys/stat.rs +++ b/src/sys/stat.rs @@ -2,6 +2,7 @@ pub use libc::dev_t; pub use libc::stat as FileStat; use {Errno, Result, NixPath}; +use fcntl::AtFlags; use libc::{self, mode_t}; use std::mem; use std::os::unix::io::RawFd; @@ -121,3 +122,15 @@ pub fn fstat(fd: RawFd) -> Result<FileStat> { Ok(dst) } + +pub fn fstatat<P: ?Sized + NixPath>(dirfd: RawFd, pathname: &P, f: AtFlags) -> Result<FileStat> { + let mut dst = unsafe { mem::uninitialized() }; + let res = try!(pathname.with_nix_path(|cstr| { + unsafe { libc::fstatat(dirfd, cstr.as_ptr(), &mut dst as *mut FileStat, f.bits() as libc::c_int) } + })); + + try!(Errno::result(res)); + + Ok(dst) +} + diff --git a/test/test_stat.rs b/test/test_stat.rs index 4b22c296..765d4fa1 100644 --- a/test/test_stat.rs +++ b/test/test_stat.rs @@ -4,8 +4,8 @@ use std::os::unix::prelude::AsRawFd; use libc::{S_IFMT, S_IFLNK}; -use nix::sys::stat::{stat, fstat, lstat}; - +use nix::fcntl; +use nix::sys::stat::{self, stat, fstat, lstat}; use nix::sys::stat::FileStat; use nix::Result; use tempdir::TempDir; @@ -75,6 +75,21 @@ fn test_stat_and_fstat() { } #[test] +fn test_fstatat() { + let tempdir = TempDir::new("nix-test_stat_and_fstat").unwrap(); + let filename = tempdir.path().join("foo.txt"); + File::create(&filename).unwrap(); + let dirfd = fcntl::open(tempdir.path(), + fcntl::OFlag::empty(), + stat::Mode::empty()); + + let result = stat::fstatat(dirfd.unwrap(), + &filename, + fcntl::AtFlags::empty()); + assert_stat_results(result); +} + +#[test] fn test_stat_fstat_lstat() { let tempdir = TempDir::new("nix-test_stat_fstat_lstat").unwrap(); let filename = tempdir.path().join("bar.txt"); |