@@ -8,7 +8,7 @@ use crate::Result;
8
8
#[ cfg( feature = "fs" ) ]
9
9
use crate :: { fcntl:: OFlag , sys:: stat:: Mode } ;
10
10
use 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 } } ;
12
12
13
13
libc_bitflags ! {
14
14
/// Desired memory protection of a memory mapping.
@@ -416,17 +416,18 @@ pub fn munlockall() -> Result<()> {
416
416
/// See the [`mmap(2)`] man page for detailed requirements.
417
417
///
418
418
/// [`mmap(2)`]: https://man7.org/linux/man-pages/man2/mmap.2.html
419
- pub unsafe fn mmap (
419
+ pub unsafe fn mmap < F : AsFd > (
420
420
addr : Option < NonZeroUsize > ,
421
421
length : NonZeroUsize ,
422
422
prot : ProtFlags ,
423
423
flags : MapFlags ,
424
- fd : RawFd ,
424
+ f : Option < & F > ,
425
425
offset : off_t ,
426
426
) -> Result < * mut c_void > {
427
427
let ptr =
428
428
addr. map_or ( std:: ptr:: null_mut ( ) , |a| usize:: from ( a) as * mut c_void ) ;
429
429
430
+ let fd = f. map ( |f| f. as_fd ( ) . as_raw_fd ( ) ) . unwrap_or ( -1 ) ;
430
431
let ret =
431
432
libc:: mmap ( ptr, length. into ( ) , prot. bits ( ) , flags. bits ( ) , fd, offset) ;
432
433
@@ -518,11 +519,12 @@ pub unsafe fn madvise(
518
519
/// # use nix::libc::size_t;
519
520
/// # use nix::sys::mman::{mmap, mprotect, MapFlags, ProtFlags};
520
521
/// # use std::ptr;
522
+ /// # use std::os::unix::io::BorrowedFd;
521
523
/// const ONE_K: size_t = 1024;
522
524
/// let one_k_non_zero = std::num::NonZeroUsize::new(ONE_K).unwrap();
523
525
/// 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();
526
528
/// mprotect(mem, ONE_K, ProtFlags::PROT_READ | ProtFlags::PROT_WRITE).unwrap();
527
529
/// std::slice::from_raw_parts_mut(mem as *mut u8, ONE_K)
528
530
/// };
@@ -566,9 +568,11 @@ pub fn shm_open<P>(
566
568
name: & P ,
567
569
flag: OFlag ,
568
570
mode: Mode
569
- ) -> Result <RawFd >
571
+ ) -> Result <std :: os :: unix :: io :: OwnedFd >
570
572
where P : ?Sized + NixPath
571
573
{
574
+ use std:: os:: unix:: io:: { FromRawFd , OwnedFd } ;
575
+
572
576
let ret = name. with_nix_path( |cstr| {
573
577
#[ cfg( any( target_os = "macos" , target_os = "ios" ) ) ]
574
578
unsafe {
@@ -580,7 +584,10 @@ pub fn shm_open<P>(
580
584
}
581
585
} ) ?;
582
586
583
- Errno :: result( ret)
587
+ match ret {
588
+ -1 => Err ( Errno :: last( ) ) ,
589
+ fd => Ok ( unsafe { OwnedFd :: from_raw_fd( fd) } )
590
+ }
584
591
}
585
592
}
586
593
0 commit comments