1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
22f8d396bSPeter Tyser /*
32f8d396bSPeter Tyser * Copyright 2008 Extreme Engineering Solutions, Inc.
42f8d396bSPeter Tyser *
52f8d396bSPeter Tyser * mmap/munmap implementation derived from:
62f8d396bSPeter Tyser * Clamav Native Windows Port : mmap win32 compatibility layer
72f8d396bSPeter Tyser * Copyright (c) 2005-2006 Gianluigi Tiesi <sherpya@netfarm.it>
82f8d396bSPeter Tyser * Parts by Kees Zeelenberg <kzlg@users.sourceforge.net> (LibGW32C)
92f8d396bSPeter Tyser */
102f8d396bSPeter Tyser
112f8d396bSPeter Tyser #include "mingw_support.h"
122f8d396bSPeter Tyser #include <stdio.h>
132f8d396bSPeter Tyser #include <stdint.h>
14faf36c14SRemy Bohmer #include <string.h>
152f8d396bSPeter Tyser #include <errno.h>
16faf36c14SRemy Bohmer #include <assert.h>
172f8d396bSPeter Tyser #include <io.h>
182f8d396bSPeter Tyser
fsync(int fd)192f8d396bSPeter Tyser int fsync(int fd)
202f8d396bSPeter Tyser {
212f8d396bSPeter Tyser return _commit(fd);
222f8d396bSPeter Tyser }
232f8d396bSPeter Tyser
mmap(void * addr,size_t len,int prot,int flags,int fd,int offset)242f8d396bSPeter Tyser void *mmap(void *addr, size_t len, int prot, int flags, int fd, int offset)
252f8d396bSPeter Tyser {
262f8d396bSPeter Tyser void *map = NULL;
272f8d396bSPeter Tyser HANDLE handle = INVALID_HANDLE_VALUE;
282f8d396bSPeter Tyser DWORD cfm_flags = 0, mvf_flags = 0;
292f8d396bSPeter Tyser
302f8d396bSPeter Tyser switch (prot) {
312f8d396bSPeter Tyser case PROT_READ | PROT_WRITE:
322f8d396bSPeter Tyser cfm_flags = PAGE_READWRITE;
332f8d396bSPeter Tyser mvf_flags = FILE_MAP_ALL_ACCESS;
342f8d396bSPeter Tyser break;
352f8d396bSPeter Tyser case PROT_WRITE:
362f8d396bSPeter Tyser cfm_flags = PAGE_READWRITE;
372f8d396bSPeter Tyser mvf_flags = FILE_MAP_WRITE;
382f8d396bSPeter Tyser break;
392f8d396bSPeter Tyser case PROT_READ:
402f8d396bSPeter Tyser cfm_flags = PAGE_READONLY;
412f8d396bSPeter Tyser mvf_flags = FILE_MAP_READ;
422f8d396bSPeter Tyser break;
432f8d396bSPeter Tyser default:
442f8d396bSPeter Tyser return MAP_FAILED;
452f8d396bSPeter Tyser }
462f8d396bSPeter Tyser
472f8d396bSPeter Tyser handle = CreateFileMappingA((HANDLE) _get_osfhandle(fd), NULL,
482f8d396bSPeter Tyser cfm_flags, HIDWORD(len), LODWORD(len), NULL);
492f8d396bSPeter Tyser if (!handle)
502f8d396bSPeter Tyser return MAP_FAILED;
512f8d396bSPeter Tyser
522f8d396bSPeter Tyser map = MapViewOfFile(handle, mvf_flags, HIDWORD(offset),
532f8d396bSPeter Tyser LODWORD(offset), len);
542f8d396bSPeter Tyser CloseHandle(handle);
552f8d396bSPeter Tyser
562f8d396bSPeter Tyser if (!map)
572f8d396bSPeter Tyser return MAP_FAILED;
582f8d396bSPeter Tyser
592f8d396bSPeter Tyser return map;
602f8d396bSPeter Tyser }
612f8d396bSPeter Tyser
munmap(void * addr,size_t len)622f8d396bSPeter Tyser int munmap(void *addr, size_t len)
632f8d396bSPeter Tyser {
642f8d396bSPeter Tyser if (!UnmapViewOfFile(addr))
652f8d396bSPeter Tyser return -1;
662f8d396bSPeter Tyser
672f8d396bSPeter Tyser return 0;
682f8d396bSPeter Tyser }
69faf36c14SRemy Bohmer
70faf36c14SRemy Bohmer /* Reentrant string tokenizer. Generic version.
71faf36c14SRemy Bohmer Copyright (C) 1991,1996-1999,2001,2004,2007 Free Software Foundation, Inc.
72faf36c14SRemy Bohmer This file is part of the GNU C Library.
731a459660SWolfgang Denk */
74faf36c14SRemy Bohmer
75faf36c14SRemy Bohmer /* Parse S into tokens separated by characters in DELIM.
76faf36c14SRemy Bohmer If S is NULL, the saved pointer in SAVE_PTR is used as
77faf36c14SRemy Bohmer the next starting point. For example:
78faf36c14SRemy Bohmer char s[] = "-abc-=-def";
79faf36c14SRemy Bohmer char *sp;
80faf36c14SRemy Bohmer x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
81faf36c14SRemy Bohmer x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
82faf36c14SRemy Bohmer x = strtok_r(NULL, "=", &sp); // x = NULL
83faf36c14SRemy Bohmer // s = "abc\0-def\0"
84faf36c14SRemy Bohmer */
strtok_r(char * s,const char * delim,char ** save_ptr)85faf36c14SRemy Bohmer char *strtok_r(char *s, const char *delim, char **save_ptr)
86faf36c14SRemy Bohmer {
87faf36c14SRemy Bohmer char *token;
88faf36c14SRemy Bohmer
89faf36c14SRemy Bohmer if (s == NULL)
90faf36c14SRemy Bohmer s = *save_ptr;
91faf36c14SRemy Bohmer
92faf36c14SRemy Bohmer /* Scan leading delimiters. */
93faf36c14SRemy Bohmer s += strspn(s, delim);
94faf36c14SRemy Bohmer if (*s == '\0') {
95faf36c14SRemy Bohmer *save_ptr = s;
96faf36c14SRemy Bohmer return NULL;
97faf36c14SRemy Bohmer }
98faf36c14SRemy Bohmer
99faf36c14SRemy Bohmer /* Find the end of the token. */
100faf36c14SRemy Bohmer token = s;
101faf36c14SRemy Bohmer s = strpbrk (token, delim);
102faf36c14SRemy Bohmer if (s == NULL) {
103faf36c14SRemy Bohmer /* This token finishes the string. */
104faf36c14SRemy Bohmer *save_ptr = memchr(token, '\0', strlen(token));
105faf36c14SRemy Bohmer } else {
106faf36c14SRemy Bohmer /* Terminate the token and make *SAVE_PTR point past it. */
107faf36c14SRemy Bohmer *s = '\0';
108faf36c14SRemy Bohmer *save_ptr = s + 1;
109faf36c14SRemy Bohmer }
110faf36c14SRemy Bohmer return token;
111faf36c14SRemy Bohmer }
112faf36c14SRemy Bohmer
11364b15021SMike Frysinger #include "getline.c"
114