|
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