Advertisement
Guest User

Untitled

a guest
Sep 25th, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.10 KB | None | 0 0
  1. #![feature(unique)]
  2. extern crate libc;
  3. use std::os::unix::io::AsRawFd;
  4. use std::ptr::Unique;
  5. use std::io::Write;
  6. const BUF_SIZE: usize = 1024;
  7.  
  8. mod ffi {
  9. use libc::{c_int, size_t, off_t};
  10. extern {
  11. pub fn mmap(addr: *mut u8, len: size_t, prot: c_int, flags: c_int, fd: c_int, offset: off_t) -> *mut u8;
  12. pub fn munmap(addr: *mut u8, len: size_t);
  13. }
  14.  
  15. }
  16. fn mmap<T: AsRawFd>(file: T, len: usize) -> Option<Unique<u8>> {
  17. unsafe {
  18. let fd = file.as_raw_fd();
  19. let mmaped = ffi::mmap(std::ptr::null_mut(), len, libc::PROT_READ | libc::PROT_WRITE, libc::MAP_SHARED, fd, 0);
  20. Some(Unique::new(mmaped))
  21. }
  22. }
  23. fn munmap(buf: Unique<u8>, len: usize) {
  24. unsafe { ffi::munmap(*buf, len); }
  25. }
  26.  
  27. fn main() {
  28. let mut file = std::fs::OpenOptions::new().read(true).write(true).create(true).open("/dev/shm/mmaped_file").unwrap();
  29. file.write(&[0; BUF_SIZE]);
  30. let len = file.metadata().unwrap().len() as usize;
  31. let mmaped = mmap(file, len);
  32. if let Some(buf) = mmaped {
  33. let buf = unsafe { std::slice::from_raw_parts_mut(*buf, len) };
  34. buf[0]='h' as u8;
  35. }
  36. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement