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