@@ -8,7 +8,7 @@ use crate::Result;
88#[ cfg( feature = "fs" ) ]
99use crate :: { fcntl:: OFlag , sys:: stat:: Mode } ;
1010use libc:: { self , c_int, c_void, off_t, size_t} ;
11- use std:: { num:: NonZeroUsize , os:: unix:: io:: RawFd } ;
11+ use std:: { num:: NonZeroUsize , os:: unix:: io:: { AsRawFd , AsFd } } ;
1212
1313libc_bitflags ! {
1414 /// Desired memory protection of a memory mapping.
@@ -416,17 +416,18 @@ pub fn munlockall() -> Result<()> {
416416/// See the [`mmap(2)`] man page for detailed requirements.
417417///
418418/// [`mmap(2)`]: https://man7.org/linux/man-pages/man2/mmap.2.html
419- pub unsafe fn mmap (
419+ pub unsafe fn mmap < F : AsFd > (
420420 addr : Option < NonZeroUsize > ,
421421 length : NonZeroUsize ,
422422 prot : ProtFlags ,
423423 flags : MapFlags ,
424- fd : RawFd ,
424+ f : Option < & F > ,
425425 offset : off_t ,
426426) -> Result < * mut c_void > {
427427 let ptr =
428428 addr. map_or ( std:: ptr:: null_mut ( ) , |a| usize:: from ( a) as * mut c_void ) ;
429429
430+ let fd = f. map ( |f| f. as_fd ( ) . as_raw_fd ( ) ) . unwrap_or ( -1 ) ;
430431 let ret =
431432 libc:: mmap ( ptr, length. into ( ) , prot. bits ( ) , flags. bits ( ) , fd, offset) ;
432433
@@ -518,11 +519,12 @@ pub unsafe fn madvise(
518519/// # use nix::libc::size_t;
519520/// # use nix::sys::mman::{mmap, mprotect, MapFlags, ProtFlags};
520521/// # use std::ptr;
522+ /// # use std::os::unix::io::BorrowedFd;
521523/// const ONE_K: size_t = 1024;
522524/// let one_k_non_zero = std::num::NonZeroUsize::new(ONE_K).unwrap();
523525/// let mut slice: &mut [u8] = unsafe {
524- /// let mem = mmap(None, one_k_non_zero, ProtFlags::PROT_NONE,
525- /// MapFlags::MAP_ANON | MapFlags::MAP_PRIVATE, -1 , 0).unwrap();
526+ /// let mem = mmap::<BorrowedFd> (None, one_k_non_zero, ProtFlags::PROT_NONE,
527+ /// MapFlags::MAP_ANON | MapFlags::MAP_PRIVATE, None , 0).unwrap();
526528/// mprotect(mem, ONE_K, ProtFlags::PROT_READ | ProtFlags::PROT_WRITE).unwrap();
527529/// std::slice::from_raw_parts_mut(mem as *mut u8, ONE_K)
528530/// };
@@ -566,9 +568,11 @@ pub fn shm_open<P>(
566568 name: & P ,
567569 flag: OFlag ,
568570 mode: Mode
569- ) -> Result <RawFd >
571+ ) -> Result <std :: os :: unix :: io :: OwnedFd >
570572 where P : ?Sized + NixPath
571573{
574+ use std:: os:: unix:: io:: { FromRawFd , OwnedFd } ;
575+
572576 let ret = name. with_nix_path( |cstr| {
573577 #[ cfg( any( target_os = "macos" , target_os = "ios" ) ) ]
574578 unsafe {
@@ -580,7 +584,10 @@ pub fn shm_open<P>(
580584 }
581585 } ) ?;
582586
583- Errno :: result( ret)
587+ match ret {
588+ -1 => Err ( Errno :: last( ) ) ,
589+ fd => Ok ( unsafe { OwnedFd :: from_raw_fd( fd) } )
590+ }
584591}
585592}
586593
0 commit comments