diff options
author | Stephen Barber <smbarber@chromium.org> | 2017-10-23 17:01:16 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-10-26 04:17:52 -0700 |
commit | f70a9d46e7c90dc15fa62f343b6d424ec239a563 (patch) | |
tree | 916996b68d1384bf94dfa6625d2a35ab7c722e3e /sys_util/src/lib.rs | |
parent | 5bf651c0e41a051322d6a7dae4ac04efc70e6654 (diff) | |
download | crosvm-f70a9d46e7c90dc15fa62f343b6d424ec239a563.tar crosvm-f70a9d46e7c90dc15fa62f343b6d424ec239a563.tar.gz crosvm-f70a9d46e7c90dc15fa62f343b6d424ec239a563.tar.bz2 crosvm-f70a9d46e7c90dc15fa62f343b6d424ec239a563.tar.lz crosvm-f70a9d46e7c90dc15fa62f343b6d424ec239a563.tar.xz crosvm-f70a9d46e7c90dc15fa62f343b6d424ec239a563.tar.zst crosvm-f70a9d46e7c90dc15fa62f343b6d424ec239a563.zip |
sys_util: add chown wrapper
BUG=none TEST=compile Change-Id: I3ae66955b48c8cd7ae2f468da8780c85fce539d2 Reviewed-on: https://chromium-review.googlesource.com/733731 Commit-Ready: Stephen Barber <smbarber@chromium.org> Tested-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Stephen Barber <smbarber@chromium.org>
Diffstat (limited to 'sys_util/src/lib.rs')
-rw-r--r-- | sys_util/src/lib.rs | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/sys_util/src/lib.rs b/sys_util/src/lib.rs index bf477b8..dea290a 100644 --- a/sys_util/src/lib.rs +++ b/sys_util/src/lib.rs @@ -52,6 +52,7 @@ pub use mmap::Error as MmapError; pub use guest_memory::Error as GuestMemoryError; pub use signalfd::Error as SignalFdError; +use std::ffi::CStr; use std::ptr; use libc::{kill, syscall, waitpid, c_long, pid_t, uid_t, gid_t, SIGKILL, WNOHANG}; @@ -80,6 +81,19 @@ pub fn getegid() -> gid_t { unsafe { libc::getegid() } } +/// Safe wrapper for chown(2). +#[inline(always)] +pub fn chown(path: &CStr, uid: uid_t, gid: gid_t) -> Result<()> { + // Safe since we pass in a valid string pointer and check the return value. + let ret = unsafe { libc::chown(path.as_ptr(), uid, gid) }; + + if ret < 0 { + errno_result() + } else { + Ok(()) + } +} + /// Reaps a child process that has terminated. /// /// Returns `Ok(pid)` where `pid` is the process that was reaped or `Ok(0)` if none of the children |