xref: /openbmc/u-boot/tools/mingw_support.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
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