summaryrefslogtreecommitdiff
path: root/src/sys/memfd.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/memfd.rs')
-rw-r--r--src/sys/memfd.rs19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/sys/memfd.rs b/src/sys/memfd.rs
index 642676b4..9f08dbb2 100644
--- a/src/sys/memfd.rs
+++ b/src/sys/memfd.rs
@@ -1,6 +1,8 @@
//! Interfaces for managing memory-backed files.
use std::os::unix::io::RawFd;
+use cfg_if::cfg_if;
+
use crate::Result;
use crate::errno::Errno;
use std::ffi::CStr;
@@ -40,7 +42,22 @@ libc_bitflags!(
/// [`memfd_create(2)`]: https://man7.org/linux/man-pages/man2/memfd_create.2.html
pub fn memfd_create(name: &CStr, flags: MemFdCreateFlag) -> Result<RawFd> {
let res = unsafe {
- libc::syscall(libc::SYS_memfd_create, name.as_ptr(), flags.bits())
+ cfg_if! {
+ if #[cfg(all(
+ // Android does not have a memfd_create symbol
+ not(target_os = "android"),
+ any(
+ target_os = "freebsd",
+ // If the OS is Linux, gnu and musl expose a memfd_create symbol but not uclibc
+ target_env = "gnu",
+ target_env = "musl",
+ )))]
+ {
+ libc::memfd_create(name.as_ptr(), flags.bits())
+ } else {
+ libc::syscall(libc::SYS_memfd_create, name.as_ptr(), flags.bits())
+ }
+ }
};
Errno::result(res).map(|r| r as RawFd)