summary refs log tree commit diff
path: root/sys_util/src/lib.rs
diff options
context:
space:
mode:
authorStephen Barber <smbarber@chromium.org>2017-10-23 17:01:16 -0700
committerchrome-bot <chrome-bot@chromium.org>2017-10-26 04:17:52 -0700
commitf70a9d46e7c90dc15fa62f343b6d424ec239a563 (patch)
tree916996b68d1384bf94dfa6625d2a35ab7c722e3e /sys_util/src/lib.rs
parent5bf651c0e41a051322d6a7dae4ac04efc70e6654 (diff)
downloadcrosvm-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.rs14
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