|
2 | 2 |
|
3 | 3 | void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
|
4 | 4 | {
|
5 |
| - HANDLE hmap; |
| 5 | + HANDLE osfhandle, hmap; |
6 | 6 | void *temp;
|
7 |
| - off_t len; |
8 |
| - struct stat st; |
| 7 | + LARGE_INTEGER len; |
9 | 8 | uint64_t o = offset;
|
10 | 9 | uint32_t l = o & 0xFFFFFFFF;
|
11 | 10 | uint32_t h = (o >> 32) & 0xFFFFFFFF;
|
12 | 11 |
|
13 |
| - if (!fstat(fd, &st)) |
14 |
| - len = st.st_size; |
15 |
| - else |
| 12 | + osfhandle = (HANDLE)_get_osfhandle(fd); |
| 13 | + if (!GetFileSizeEx(osfhandle, &len)) |
16 | 14 | die("mmap: could not determine filesize");
|
17 | 15 |
|
18 |
| - if ((length + offset) > len) |
19 |
| - length = xsize_t(len - offset); |
| 16 | + if ((length + offset) > len.QuadPart) |
| 17 | + length = xsize_t(len.QuadPart - offset); |
20 | 18 |
|
21 | 19 | if (!(flags & MAP_PRIVATE))
|
22 | 20 | die("Invalid usage of mmap when built with USE_WIN32_MMAP");
|
23 | 21 |
|
24 |
| - hmap = CreateFileMapping((HANDLE)_get_osfhandle(fd), NULL, |
25 |
| - PAGE_WRITECOPY, 0, 0, NULL); |
| 22 | + hmap = CreateFileMapping(osfhandle, NULL, |
| 23 | + prot == PROT_READ ? PAGE_READONLY : PAGE_WRITECOPY, 0, 0, NULL); |
26 | 24 |
|
27 |
| - if (!hmap) |
| 25 | + if (!hmap) { |
| 26 | + errno = EINVAL; |
28 | 27 | return MAP_FAILED;
|
| 28 | + } |
29 | 29 |
|
30 |
| - temp = MapViewOfFileEx(hmap, FILE_MAP_COPY, h, l, length, start); |
| 30 | + temp = MapViewOfFileEx(hmap, prot == PROT_READ ? |
| 31 | + FILE_MAP_READ : FILE_MAP_COPY, h, l, length, start); |
31 | 32 |
|
32 | 33 | if (!CloseHandle(hmap))
|
33 | 34 | warning("unable to close file mapping handle");
|
34 | 35 |
|
35 |
| - return temp ? temp : MAP_FAILED; |
| 36 | + if (temp) |
| 37 | + return temp; |
| 38 | + |
| 39 | + errno = GetLastError() == ERROR_COMMITMENT_LIMIT ? EFBIG : EINVAL; |
| 40 | + return MAP_FAILED; |
36 | 41 | }
|
37 | 42 |
|
38 | 43 | int git_munmap(void *start, size_t length)
|
|
0 commit comments