⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wincompat.c

📁 goahead webserver源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *	wincompat.c -- UNIX compatibility module for windows CE. * *	Copyright (c) GoAhead Software Inc., 1995-2000. All Rights Reserved. * *	See the file "license.txt" for usage and redistribution license requirements * * $Id: wincompat.c,v 1.3 2003/04/11 17:52:05 bporter Exp $ *//******************************** Description *********************************//* *	This module provides a basic functions which provide compatibility between *	CE and other operating systems. *//********************************* Includes ***********************************/#define		IN_GETOPT#include	<windows.h>#ifdef UEMF	#include "../uemf.h"#else /* not UEMF */	#include	"basic/basicInternal.h"	#include	<direct.h>	#include	<fcntl.h>	#include	<getopt.h>	#include	<io.h>	#include	<pwd.h>	#include	<stat.h>	#include	<stdio.h>	#include	<string.h>	#include	<time.h>	#include	<timeb.h>	#include	<types.h>	#include	<unistd.h>	#include	<ulimit.h>#endif /* UEMF *//************************************* Defines ********************************/typedef struct {	HANDLE	hand;} fh_t;/********************************** Global Data *******************************/int								errno;__declspec(dllexport) int		opterr = 1;__declspec(dllexport) int		optind = 1;__declspec(dllexport) int		optopt;__declspec(dllexport) char_t*	optarg;/************************************* Locals *********************************/static char	optswi = '-';static fh_t			**f;			/* Array of all open files */static int			fMax;			/* Maximum size of f array *//* *	tm structure to be returned by localtime(). This is not thread safe. */static struct tm localtm;/* *	String returned by _wctime(). This is not thread safe. */static char_t localctime[32];static char_t *months[] = {	T("Jan"), T("Feb"), T("Mar"), T("Apr"), T("May"), T("Jun"), T("Jul"),	T("Aug"), T("Sep"), T("Oct"), T("Nov"), T("Dec")};static char_t *days[] = {	T("Sun"), T("Mon"), T("Tue"), T("Wed"), T("Thu"), T("Fri"), T("Sat")};static char_t ceCwd[LF_PATHSIZE];char_t *_wgetcwd(char_t *dir, int len);int _wchdir(unsigned short *path);/************************************ Code ************************************/uid_t geteuid(void){	return 0;}/******************************************************************************/int	getopt(int argc, char_t* const * argv, const char_t* opts){	char_t		*cp;	char_t		noswitch[3];	static int	sp = 1;	int			c;	gstrnset(noswitch, optswi, 2);	noswitch[2]=0;	if (sp == 1) {		if (optind >= argc ||			argv[optind][0] != optswi || argv[optind][1] == '\0') {			return(EOF);		}		else if (gstrcmp(argv[optind], noswitch) == 0) {			optind++;			return(EOF);		}	}	optopt = c = argv[optind][sp];	if (c == ':' || (cp = gstrchr(opts, (char_t) c)) == NULL) {		if (argv[optind][++sp] == '\0') {			optind++;			sp = 1;		}		return('?');	}	if (*++cp == ':') {		if (argv[optind][sp+1] != '\0') {			optarg = &argv[optind++][sp+1];		} else if (++optind >= argc) {			sp = 1;			return('?');		} else {			optarg = argv[optind++];		}		sp = 1;	} else {		if (argv[optind][++sp] == '\0') {			sp = 1;			optind++;		}		optarg = NULL;	}	return(c);}/******************************************************************************//* * sleep -- Sleep for N seconds */unsigned sleep(unsigned s){	Sleep(s * 1000);	return 0;}/******************************************************************************//* * nap -- Sleep for N milli-seconds */long nap(long ms){	Sleep(ms);	return 0;}/******************************************************************************//* *	Return the elapsed time in milli-seconds */time_t timeMsec(){	struct timeb	tbnow;	time_t			sec;	int				msec;	static time_t	start = 0;	static time_t	start_msec;	ftime(&tbnow);	if (start == 0) {		start = tbnow.time;		start_msec = tbnow.millitm;	}	sec = tbnow.time - start;	msec = tbnow.millitm - start_msec;	if (msec < 0) {		msec += 1000;		sec -= 1;	}	return sec * 1000 + msec;}/******************************************************************************//* *	We want the time in seconds since the start of the UNIX epoch (1970). We *	can get the number of 100-nanoseconds since 1601 (FILETIME). We simply *	convert this to seconds and subtract the number of seconds between 1601 *	and 1970! */#define	SECS_BETWEEN_1601_AND_1970	3054510208static time_t fileTimeToUnixEpochTime(FILETIME f){	ULARGE_INTEGER	uli;	uli.LowPart = f.dwLowDateTime;	uli.HighPart = f.dwHighDateTime;	uli.QuadPart /= 10000000;	return((time_t) uli.QuadPart - SECS_BETWEEN_1601_AND_1970);}/******************************************************************************//* *	Mock the UNIX time() call! */time_t time(time_t *timer){	SYSTEMTIME		stime;	FILETIME		ftime;	time_t			tmp;	GetLocalTime(&stime);	SystemTimeToFileTime(&stime, &ftime);	tmp = fileTimeToUnixEpochTime(ftime);	if (timer != NULL) {		*timer = tmp;	}	return tmp;}/******************************************************************************//* *	Mock the UNIX localtime() call. */struct tm* localtime(const time_t *timer){	SYSTEMTIME		stime;	GetLocalTime(&stime);		localtm.tm_sec = stime.wSecond;	localtm.tm_min = stime.wMinute;	localtm.tm_hour = stime.wHour;	localtm.tm_mday = stime.wDay;	localtm.tm_wday = stime.wDayOfWeek;	localtm.tm_mon = stime.wMonth - 1;	localtm.tm_year = stime.wYear - 1900;/* *	The following values are not supported yet, but the hardcoded assignments *	should suffice. */	localtm.tm_yday = -1;	localtm.tm_isdst = -1;	localtm.tm_tzadj = -1;	localtm.tm_name[0] = 0;	return &localtm;}#ifndef LITTLEFOOT/******************************************************************************//* *	Mock the UNIX ctime() call. */char_t* _wctime(const time_t *timer){	SYSTEMTIME		stime;	FILETIME		ftime;	ULARGE_INTEGER	uli;	uli.QuadPart = *timer * 10000000;	ftime.dwLowDateTime = uli.LowPart;	ftime.dwHighDateTime = uli.HighPart;	if (FileTimeToSystemTime(&ftime, &stime) == 0) {		return NULL;	}	wsprintf(localctime, T("%s %s %02d %02d:%02d:%02d %04d\n"),		days[stime.wDayOfWeek], months[stime.wMonth - 1], stime.wDay,		stime.wHour, stime.wMinute, stime.wSecond, stime.wYear);	return localctime;}/******************************************************************************//* *	Our implementation of _wasctime. */char_t *_wasctime(const struct tm *timeptr){	static char_t	strTime[52];	wsprintf(strTime, T("%s %s %02d %02d:%02d:%02d %04d\n"),		days[timeptr->tm_wday], months[timeptr->tm_mon], timeptr->tm_mday,		timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec, 		(timeptr->tm_year + 1900));	return &strTime[0];}#endif	/* !LITTLEFOOT *//******************************************************************************//* *	Mock the UNIX ftime() call. */void ftime(struct timeb *tp){	tp->time = time(NULL);	tp->millitm = 0;	return;#ifdef UNSUPPORTED	short timezone;			/* timezone, minutes west of GMT */	short dstflag;			/* daylight savings */#endif /* UNSUPPORTED */}/******************************************************************************//* *	Open a file. */int _wopen(const char_t *path, int oflag, ...){	HANDLE	hFile;	DWORD	dwDesiredAccess, dwShareMode, dwCreationDisposition;	fh_t	*fp;	int		fid;	char_t	*cwd, *filepath;	filepath = balloc(B_L, LF_PATHSIZE * sizeof(char_t));	cwd = balloc(B_L, LF_PATHSIZE * sizeof(char_t));	if ((*path != '/') && (*path != '\\')) {		cwd = _wgetcwd(cwd, LF_PATHSIZE);		if (cwd == NULL) {			return -1;		}		fmtAlloc(&filepath, LF_PATHSIZE, T("%s/%s"), cwd, path);	} else {		wcscpy(filepath, path);	}		dwDesiredAccess = 0;	if (((oflag & 0xF) == O_RDONLY) || (oflag & O_RDWR)) {		dwDesiredAccess |= GENERIC_READ;	}	if (oflag & O_WRONLY || oflag & O_RDWR) {		dwDesiredAccess |= GENERIC_WRITE;	}	dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;	if (oflag & O_CREAT) {		dwCreationDisposition = OPEN_ALWAYS;	} else {		dwCreationDisposition = OPEN_EXISTING;	}	if ((hFile = CreateFile(filepath, dwDesiredAccess, dwShareMode, NULL,			dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, 			NULL)) == INVALID_HANDLE_VALUE) {		bfree(B_L, filepath);		bfree(B_L, cwd);		return -1;	}/* *	Get a file number to associate with the handle. */	if ((fid = hAllocEntry((void***) &f, &fMax, sizeof(fh_t))) < 0) {		bfree(B_L, filepath);		bfree(B_L, cwd);		return -1;	}	fp = f[fid];	fp->hand = hFile;	bfree(B_L, filepath);	bfree(B_L, cwd);	return fid;}/******************************************************************************//* *	Close a file. */int close(int fid){	fh_t	*fp;	a_assert(0 <= fid && fid < fMax);	fp = f[fid];	if (fp == NULL) {		return -1;	}	CloseHandle(fp->hand);	fMax = hFree((void***) &f, fid);	bfreeSafe(B_L, fp);	return 0;}/******************************************************************************//* *	Read bytes from a file. */int read(int fid, void *buf, unsigned int len){	fh_t	*fp;	long	bytesRead;	a_assert(0 <= fid && fid < fMax);	fp = f[fid];	if (fp == NULL) {		return -1;	}	if (ReadFile(fp->hand, buf, len, &bytesRead, NULL) == 0) {		return -1;	}	return bytesRead;}/******************************************************************************//* *	Read from a file into a buffer, converting from Ascii to Unicode. */int readAscToUni(int fid, void **buf, unsigned int len){	fh_t	*fp;	long	bytesRead;	char_t	*uniBuf;	a_assert(0 <= fid && fid < fMax);	fp = f[fid];	if (fp == NULL) {		return -1;	}	if (ReadFile(fp->hand, *buf, len, &bytesRead, NULL) == 0) {		return -1;	}	uniBuf =  ballocAscToUni(*buf, len);	bfree(B_L, *buf);	*buf = uniBuf;	return bytesRead;}/******************************************************************************//* *	Write to a file. */int write(int fid, void *buf, unsigned int len){	fh_t	*fp;	long	bytesWritten;	a_assert(0 <= fid && fid < fMax);	fp = f[fid];	if (fp == NULL) {		return -1;	}	if (WriteFile(fp->hand, buf, len, &bytesWritten, NULL) == 0) {		return -1;	}	return bytesWritten;}/******************************************************************************//* *	Write to a file, first converting from Unicode to Ascii. */int writeUniToAsc(int fid, void *buf, unsigned int len){	fh_t	*fp;	long	bytesWritten;	char	*asciiBuf;	a_assert(0 <= fid && fid < fMax);	fp = f[fid];	if (fp == NULL) {		return -1;	}	asciiBuf =  ballocUniToAsc(buf, len);	if (WriteFile(fp->hand, asciiBuf, len, &bytesWritten, NULL) == 0) {		bfree(B_L, asciiBuf);		return -1;	}	bfree(B_L, asciiBuf);	return bytesWritten;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -