Git fork
at reftables-rust 48 lines 1.2 kB view raw
1#define DISABLE_SIGN_COMPARE_WARNINGS 2 3#include "../git-compat-util.h" 4 5void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) 6{ 7 HANDLE osfhandle, hmap; 8 void *temp; 9 LARGE_INTEGER len; 10 uint64_t o = offset; 11 uint32_t l = o & 0xFFFFFFFF; 12 uint32_t h = (o >> 32) & 0xFFFFFFFF; 13 14 osfhandle = (HANDLE)_get_osfhandle(fd); 15 if (!GetFileSizeEx(osfhandle, &len)) 16 die("mmap: could not determine filesize"); 17 18 if ((length + offset) > len.QuadPart) 19 length = xsize_t(len.QuadPart - offset); 20 21 if (!(flags & MAP_PRIVATE)) 22 die("Invalid usage of mmap when built with USE_WIN32_MMAP"); 23 24 hmap = CreateFileMapping(osfhandle, NULL, 25 prot == PROT_READ ? PAGE_READONLY : PAGE_WRITECOPY, 0, 0, NULL); 26 27 if (!hmap) { 28 errno = EINVAL; 29 return MAP_FAILED; 30 } 31 32 temp = MapViewOfFileEx(hmap, prot == PROT_READ ? 33 FILE_MAP_READ : FILE_MAP_COPY, h, l, length, start); 34 35 if (!CloseHandle(hmap)) 36 warning("unable to close file mapping handle"); 37 38 if (temp) 39 return temp; 40 41 errno = GetLastError() == ERROR_COMMITMENT_LIMIT ? EFBIG : EINVAL; 42 return MAP_FAILED; 43} 44 45int git_munmap(void *start, size_t length UNUSED) 46{ 47 return !UnmapViewOfFile(start); 48}