1 #ifndef LI_SYS_MMAP_H 2 #define LI_SYS_MMAP_H 3 #include "first.h" 4 5 #if defined(HAVE_SYS_MMAN_H) 6 7 #include <sys/mman.h> 8 9 #elif defined(_WIN32) 10 11 #include <Windows.h> 12 #include <HandleAPI.h> 13 #include <io.h> 14 #include <MemoryAPI.h> 15 16 #ifndef MAP_FAILED 17 #define MAP_FAILED ((void *)-1) 18 #endif 19 #ifndef MAP_PRIVATE 20 #define MAP_PRIVATE 0 21 #endif 22 #ifndef MAP_SHARED 23 #define MAP_SHARED 0 24 #endif 25 #ifndef PROT_READ 26 #define PROT_READ PAGE_READONLY 27 #endif 28 29 #define HAVE_MMAP 1 30 31 #define munmap(addr, length) UnmapViewOfFile((LPCVOID)(addr)) 32 33 static inline void * 34 mmap (void *addr, size_t length, int prot, int flags, int fd, off_t offset) 35 { 36 /* XXX: this limited implementation maps args only to read-only mmap */ 37 if (prot != PAGE_READONLY) /*(for PAGE_READONLY and FILE_MAP_READ)*/ 38 return MAP_FAILED; 39 UNUSED(flags); 40 41 HANDLE mh = CreateFileMapping((HANDLE) _get_osfhandle(fd), 42 NULL, PAGE_READONLY, 43 (sizeof(size_t) > 4) ? length >> 32 : 0, 44 length & 0xffffffff, NULL); 45 if (NULL == mh) 46 return MAP_FAILED; 47 48 LPVOID p = MapViewOfFileEx(mh, FILE_MAP_READ, 49 (sizeof(off_t) > 4) ? offset >> 32 : 0, 50 offset & 0xffffffff, length, addr); 51 CloseHandle(mh); 52 return (NULL != p) ? (void *)p : MAP_FAILED; 53 } 54 55 #else 56 57 # define MAP_SHARED 0 58 # define MAP_PRIVATE 0 59 # define PROT_READ 0 60 61 # define mmap(a, b, c, d, e, f) (-1) 62 # define munmap(a, b) (-1) 63 64 #endif /* HAVE_SYS_MMAN_H */ 65 66 /* NetBSD 1.3.x needs it; also make it available if mmap() is not present */ 67 #if !defined(MAP_FAILED) 68 # define MAP_FAILED ((char*)-1) 69 #endif 70 71 #endif 72