From 29c0ed95b0d0846be85e121043402b1b5ff20727 Mon Sep 17 00:00:00 2001 From: Greg V Date: Sat, 9 Dec 2017 16:03:43 +0300 Subject: [PATCH] Extract create_shmem into the shmemfdrs crate (which adds support for FreeBSD SHM_ANON) --- Cargo.toml | 4 ++-- src/lib.rs | 9 +++++---- src/platform/unix/mod.rs | 33 ++------------------------------- 3 files changed, 9 insertions(+), 37 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index dc688042b..184ad7cea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ repository = "https://github.com/servo/ipc-channel" [features] force-inprocess = [] -memfd = ["sc"] +memfd = ["shmemfdrs/memfd"] unstable = [] async = ["futures"] @@ -24,8 +24,8 @@ tempfile = "3" [target.'cfg(any(target_os = "linux", target_os = "openbsd", target_os = "freebsd"))'.dependencies] mio = "0.6.11" +shmemfdrs = "0.1" -sc = { version = "0.2.2", optional = true } futures = { version = "0.1", optional = true } [dev-dependencies] diff --git a/src/lib.rs b/src/lib.rs index a6fac93a2..c8490d676 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -29,10 +29,11 @@ extern crate mio; target_os = "openbsd", target_os = "freebsd")))] extern crate fnv; -#[cfg(all(feature = "memfd", not(feature = "force-inprocess"), - target_os="linux"))] -#[macro_use] -extern crate sc; +#[cfg(all(not(feature = "force-inprocess"), + any(target_os = "linux", + target_os = "openbsd", + target_os = "freebsd")))] +extern crate shmemfdrs; #[cfg(feature = "async")] extern crate futures; diff --git a/src/platform/unix/mod.rs b/src/platform/unix/mod.rs index 33414976d..b5f171a4b 100644 --- a/src/platform/unix/mod.rs +++ b/src/platform/unix/mod.rs @@ -11,7 +11,7 @@ use bincode; use fnv::FnvHasher; use libc::{self, MAP_FAILED, MAP_SHARED, PROT_READ, PROT_WRITE, SOCK_SEQPACKET, SOL_SOCKET}; use libc::{SO_LINGER, S_IFMT, S_IFSOCK, c_char, c_int, c_void, getsockopt}; -use libc::{iovec, mode_t, msghdr, off_t, recvmsg, sendmsg}; +use libc::{iovec, mode_t, msghdr, recvmsg, sendmsg}; use libc::{setsockopt, size_t, sockaddr, sockaddr_un, socketpair, socklen_t, sa_family_t}; use std::cell::Cell; use std::cmp; @@ -32,6 +32,7 @@ use std::thread; use mio::unix::EventedFd; use mio::{Poll, Token, Events, Ready, PollOpt}; use tempfile::{Builder, TempDir}; +use shmemfdrs::create_shmem; const MAX_FDS_IN_CMSG: u32 = 64; @@ -953,31 +954,6 @@ fn recv(fd: c_int, blocking_mode: BlockingMode) Ok((main_data_buffer, channels, shared_memory_regions)) } -#[cfg(not(all(target_os="linux", feature="memfd")))] -fn create_shmem(name: CString, length: usize) -> c_int { - unsafe { - // NB: the FreeBSD man page for shm_unlink states that it requires - // write permissions, but testing shows that read-write is required. - let fd = libc::shm_open(name.as_ptr(), - libc::O_CREAT | libc::O_RDWR | libc::O_EXCL, - 0o600); - assert!(fd >= 0); - assert!(libc::shm_unlink(name.as_ptr()) == 0); - assert!(libc::ftruncate(fd, length as off_t) == 0); - fd - } -} - -#[cfg(all(feature="memfd", target_os="linux"))] -fn create_shmem(name: CString, length: usize) -> c_int { - unsafe { - let fd = memfd_create(name.as_ptr(), 0); - assert!(fd >= 0); - assert!(libc::ftruncate(fd, length as off_t) == 0); - fd - } -} - struct UnixCmsg { cmsg_buffer: *mut cmsghdr, msghdr: msghdr, @@ -1053,11 +1029,6 @@ fn is_socket(fd: c_int) -> bool { // FFI stuff follows: -#[cfg(all(feature="memfd", target_os="linux"))] -unsafe fn memfd_create(name: *const c_char, flags: usize) -> c_int { - syscall!(MEMFD_CREATE, name, flags) as c_int -} - #[allow(non_snake_case)] fn CMSG_LEN(length: size_t) -> size_t { CMSG_ALIGN(mem::size_of::()) + length