1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright 2008 Extreme Engineering Solutions, Inc. 4 * 5 * mmap/munmap implementation derived from: 6 * Clamav Native Windows Port : mmap win32 compatibility layer 7 * Copyright (c) 2005-2006 Gianluigi Tiesi <sherpya@netfarm.it> 8 * Parts by Kees Zeelenberg <kzlg@users.sourceforge.net> (LibGW32C) 9 */ 10 11 #include "mingw_support.h" 12 #include <stdio.h> 13 #include <stdint.h> 14 #include <string.h> 15 #include <errno.h> 16 #include <assert.h> 17 #include <io.h> 18 19 int fsync(int fd) 20 { 21 return _commit(fd); 22 } 23 24 void *mmap(void *addr, size_t len, int prot, int flags, int fd, int offset) 25 { 26 void *map = NULL; 27 HANDLE handle = INVALID_HANDLE_VALUE; 28 DWORD cfm_flags = 0, mvf_flags = 0; 29 30 switch (prot) { 31 case PROT_READ | PROT_WRITE: 32 cfm_flags = PAGE_READWRITE; 33 mvf_flags = FILE_MAP_ALL_ACCESS; 34 break; 35 case PROT_WRITE: 36 cfm_flags = PAGE_READWRITE; 37 mvf_flags = FILE_MAP_WRITE; 38 break; 39 case PROT_READ: 40 cfm_flags = PAGE_READONLY; 41 mvf_flags = FILE_MAP_READ; 42 break; 43 default: 44 return MAP_FAILED; 45 } 46 47 handle = CreateFileMappingA((HANDLE) _get_osfhandle(fd), NULL, 48 cfm_flags, HIDWORD(len), LODWORD(len), NULL); 49 if (!handle) 50 return MAP_FAILED; 51 52 map = MapViewOfFile(handle, mvf_flags, HIDWORD(offset), 53 LODWORD(offset), len); 54 CloseHandle(handle); 55 56 if (!map) 57 return MAP_FAILED; 58 59 return map; 60 } 61 62 int munmap(void *addr, size_t len) 63 { 64 if (!UnmapViewOfFile(addr)) 65 return -1; 66 67 return 0; 68 } 69 70 /* Reentrant string tokenizer. Generic version. 71 Copyright (C) 1991,1996-1999,2001,2004,2007 Free Software Foundation, Inc. 72 This file is part of the GNU C Library. 73 */ 74 75 /* Parse S into tokens separated by characters in DELIM. 76 If S is NULL, the saved pointer in SAVE_PTR is used as 77 the next starting point. For example: 78 char s[] = "-abc-=-def"; 79 char *sp; 80 x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def" 81 x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL 82 x = strtok_r(NULL, "=", &sp); // x = NULL 83 // s = "abc\0-def\0" 84 */ 85 char *strtok_r(char *s, const char *delim, char **save_ptr) 86 { 87 char *token; 88 89 if (s == NULL) 90 s = *save_ptr; 91 92 /* Scan leading delimiters. */ 93 s += strspn(s, delim); 94 if (*s == '\0') { 95 *save_ptr = s; 96 return NULL; 97 } 98 99 /* Find the end of the token. */ 100 token = s; 101 s = strpbrk (token, delim); 102 if (s == NULL) { 103 /* This token finishes the string. */ 104 *save_ptr = memchr(token, '\0', strlen(token)); 105 } else { 106 /* Terminate the token and make *SAVE_PTR point past it. */ 107 *s = '\0'; 108 *save_ptr = s + 1; 109 } 110 return token; 111 } 112 113 #include "getline.c" 114