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 munmap(addr, length) UnmapViewOfFile((LPCVOID)(addr)) 30 31 static inline void * 32 mmap (void *addr, size_t length, int prot, int flags, int fd, off_t offset) 33 { 34 /* XXX: this limited implementation maps args only to read-only mmap */ 35 if (prot != PAGE_READONLY) /*(for PAGE_READONLY and FILE_MAP_READ)*/ 36 return MAP_FAILED; 37 UNUSED(flags); 38 39 HANDLE mh = CreateFileMapping((HANDLE) _get_osfhandle(fd), 40 NULL, PAGE_READONLY, 41 (sizeof(size_t) > 4) ? length >> 32 : 0, 42 length & 0xffffffff, NULL); 43 if (NULL == mh) 44 return MAP_FAILED; 45 46 LPVOID p = MapViewOfFileEx(mh, FILE_MAP_READ, 47 (sizeof(off_t) > 4) ? offset >> 32 : 0, 48 offset & 0xffffffff, length, addr); 49 CloseHandle(mh); 50 return (NULL != p) ? (void *)p : MAP_FAILED; 51 } 52 53 #else 54 55 # define MAP_SHARED 0 56 # define MAP_PRIVATE 0 57 # define PROT_READ 0 58 59 # define mmap(a, b, c, d, e, f) (-1) 60 # define munmap(a, b) (-1) 61 62 #endif /* HAVE_SYS_MMAN_H */ 63 64 /* NetBSD 1.3.x needs it; also make it available if mmap() is not present */ 65 #if !defined(MAP_FAILED) 66 # define MAP_FAILED ((char*)-1) 67 #endif 68 69 #endif 70