summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJörg Thalheim <joerg@thalheim.io>2017-03-08 00:12:45 +0100
committerJörg Thalheim <joerg@thalheim.io>2017-03-21 01:27:21 +0100
commitb6a8a3c64f63a4f540000084a6ec19d635f48e6c (patch)
tree89c6e13d7113e1a0640c99890ffbc0d6ee53b1f7
parent2b0c63f56dcf69fba328e8d5b2139bc6e5cef930 (diff)
downloadnix-b6a8a3c64f63a4f540000084a6ec19d635f48e6c.zip
add support for `fstatat`
-rw-r--r--CHANGELOG.md2
-rw-r--r--Cargo.toml2
-rw-r--r--src/sys/stat.rs13
-rw-r--r--test/test_stat.rs19
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
diff --git a/Cargo.toml b/Cargo.toml
index 29c631ec..e0cd5485 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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");