diff --git a/.travis.yml b/.travis.yml index ed419dc75..0d45058c3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,8 +12,22 @@ before_cache: matrix: fast_finish: true include: - - name: Run Rust tests + - name: Run Rust tests(linux) language: rust + os: linux + rust: stable + cache: cargo + script: + - cargo build --verbose --all + - cargo test --verbose --all + env: + # Prevention of cache corruption. + # See: https://docs.travis-ci.com/user/caching/#caches-and-build-matrices + - JOBCACHE=1 + + - name: Run Rust tests(osx) + language: rust + os: osx rust: stable cache: cargo script: diff --git a/vm/src/stdlib/os.rs b/vm/src/stdlib/os.rs index bf63efbbc..d206270df 100644 --- a/vm/src/stdlib/os.rs +++ b/vm/src/stdlib/os.rs @@ -262,7 +262,7 @@ fn get_right_permission( let others_permissions = get_permissions(others_mode); let user_id = nix::unistd::getuid(); - let groups_ids = nix::unistd::getgroups()?; + let groups_ids = getgroups()?; if file_owner == user_id { Ok(owner_permissions) @@ -273,6 +273,32 @@ fn get_right_permission( } } +#[cfg(target_os = "macos")] +fn getgroups() -> nix::Result> { + use libc::{c_int, gid_t}; + use std::ptr; + let ret = unsafe { libc::getgroups(0, ptr::null_mut()) }; + let mut groups = Vec::::with_capacity(Errno::result(ret)? as usize); + loop { + let ret = unsafe { + libc::getgroups( + groups.capacity() as c_int, + groups.as_mut_ptr() as *mut gid_t, + ) + }; + + return Errno::result(ret).map(|s| { + unsafe { groups.set_len(s as usize) }; + groups + }); + } +} + +#[cfg(target_os = "linux")] +fn getgroups() -> nix::Result> { + nix::unistd::getgroups() +} + #[cfg(unix)] fn os_access(path: PyStringRef, mode: u8, vm: &VirtualMachine) -> PyResult { use std::os::unix::fs::MetadataExt;