xref: /lighttpd1.4/src/sys-mmap.h (revision e05ce805)
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 *
mmap(void * addr,size_t length,int prot,int flags,int fd,off_t offset)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