xref: /OK3568_Linux_fs/u-boot/tools/mingw_support.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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