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

📄 winio.c

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 C
字号:
/* */#define	SOCKDBG(s)#include "config.h"#include "config-std.h"#include "config-io.h"#include "config-mem.h"#include "gtypes.h"#include "gc.h"#define	NOUNIXPROTOTYPES#include <jsyscall.h>static struct {	int				inuse;	union {		HANDLE		hand;		SOCKET		sock;	};	jlong			timeout;	/* threads timeout on read */} fhand[FD_SETSIZE];staticintallocHandle(void){	int i;	/* Skip stdin, stdout, stderr */	for (i = 0; i < FD_SETSIZE; i++) {		if (fhand[i].inuse == 0) {			fhand[i].inuse = 1;			return (i);		}	}	return (-1);}staticvoidfreeHandle(int fd){	fhand[fd].inuse = 0;}staticvoidFinit(void){	WORD ver;	WSADATA data;	fhand[0].inuse = 1;	fhand[0].hand = GetStdHandle(STD_INPUT_HANDLE);	fhand[1].inuse = 1;	fhand[1].hand = GetStdHandle(STD_OUTPUT_HANDLE);	fhand[2].inuse = 1;	fhand[2].hand = GetStdHandle(STD_ERROR_HANDLE);	/* This should be in Ninit but we don't have one */	ver = MAKEWORD(2,0);	WSAStartup(ver, &data);}staticintFmkdir(const char* path){	if (CreateDirectory(path, NULL)) {		return (0);	}	else {		return (-1);	}}staticintFrmdir(const char* path){	if (RemoveDirectory(path)) {		return (0);	}	else {		return (-1);	}}staticintFfileInfo(const char* path, int type, void* extra){	BY_HANDLE_FILE_INFORMATION buf;	HANDLE h;	LARGE_INTEGER li;	DWORD attr;	attr = GetFileAttributes(path);	if (attr == 0xFFFFFFFF) {		return (0);	}		switch (type) {	case JINFO_EXISTS:		return (1);	case JINFO_ISFILE:		if (!(attr & FILE_ATTRIBUTE_DIRECTORY)) {			return (1);		}		return (0);	case JINFO_ISDIR:		if (attr & FILE_ATTRIBUTE_DIRECTORY) {			return (1);		}		return (0);	case JINFO_CANREAD:		return (1);	case JINFO_CANWRITE:		if (!(attr & FILE_ATTRIBUTE_READONLY)) { 			return (1);		}		return (0);	}	h = CreateFile(path, 0, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);	if (h == INVALID_HANDLE_VALUE) {		printf("Invalid %d\n", GetLastError());		return (0);	}	GetFileInformationByHandle(h, &buf);	CloseHandle(h);	switch (type) {	case JINFO_LENGTH:		*((jlong*)extra) = buf.nFileSizeLow;		return (1);	case JINFO_LASTMODIFIED:		li.LowPart = buf.ftLastWriteTime.dwLowDateTime;		li.HighPart = buf.ftLastWriteTime.dwHighDateTime;		*((jlong*)extra) = (jlong)li.QuadPart / (jlong)10;		return (1);	}	return (0);}staticintFfileInfoFD(int fd, int type, void* extra){	DWORD r;	switch (type) {	case JINFO_LENGTH:		r = GetFileSize(fhand[fd].hand, NULL);		if (r != 0xFFFFFFFF) {			*((jlong*)extra) = (jlong)r;			return (1);		}		break;	case JINFO_AVAILABLE:		return (GetFileSize(fhand[fd].hand, NULL) - SetFilePointer(fhand[fd].hand, (LONG)0, NULL, FILE_CURRENT));	default:		break;	}	return (0);}staticintFreaddir(const char* p, jdirEntry** list){	WIN32_FIND_DATA data;	char path[256];	jdirEntry* dirlist;	jdirEntry* mentry;	int count;	HANDLE handle;	strcpy(path, p);	strcat(path, "\\*.*");	handle = FindFirstFile(path, &data);	if (handle == INVALID_HANDLE_VALUE) {		*list = 0;		return (-1);	}	count = 0;	dirlist = 0;	for (;;) {		/* We skip '.' and '..' */		if (strcmp(".", data.cFileName) != 0 && strcmp("..", data.cFileName) != 0) {			mentry = gc_malloc_fixed(sizeof(jdirEntry) + strlen(data.cFileName) + 1);			assert(mentry != 0);			strcpy(mentry->name, data.cFileName);			mentry->next = dirlist;			dirlist = mentry;			count++;		}		if (!FindNextFile(handle, &data)) {			FindClose(handle);			break;		}	}	*list = dirlist;	return (count);}/* * Threaded file open. */staticintFopen(const char* path, int mode){	int fd;	fd = allocHandle();	if (fd == -1) {		return (-1);	}	switch (mode) {	case JOPEN_READ:		fhand[fd].hand = CreateFile(path, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,			NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);		break;	case JOPEN_WRITE:		fhand[fd].hand = CreateFile(path, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,			NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);		break;	case JOPEN_APPEND:		fhand[fd].hand = CreateFile(path, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,			NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);		break;	case JOPEN_READWRITE:		fhand[fd].hand = CreateFile(path, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,			NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);		break;	default:		freeHandle(fd);		return (-1);	}	// printf("Opening %s on %d %x\n", path, fd, fhand[fd].hand);	if (fhand[fd].hand == INVALID_HANDLE_VALUE) {		freeHandle(fd);		return (-1);	}	else {		return (fd);	}}/* * Threaded read */staticssize_tFread(int fd, void* buf, size_t len){	ssize_t r;	BOOL res;	/* It would appear that we should block on a read of length	 * zero if there's still data to be read but none happens	 * to be available (to JDK 1.1.6 spec)	 */#if 0	if (len == 0) {		blockOnFile(fd, TH_READ, fhand[fd].timeout);		return (0);	}#endif	res = ReadFile(fhand[fd].hand, (LPVOID)buf, (DWORD)len, (LPDWORD)&r, NULL);	if (res == 0) {		r = -1;	}	return (r);}/* * Threaded write */staticssize_tFwrite(int fd, const void* buf, size_t len){	ssize_t r;	BOOL res;	res = WriteFile(fhand[fd].hand, (LPVOID)buf, (DWORD)len, (LPDWORD)&r, NULL);	if (res == 0) {		r = -1;	}	return (r);}staticintFlseek(int fd, off_t pos, int whence){	DWORD ret;	switch (whence) {	case JSEEK_SET:		ret = SetFilePointer(fhand[fd].hand, (LONG)pos, NULL, FILE_BEGIN);		break;	case JSEEK_CUR:		ret = SetFilePointer(fhand[fd].hand, (LONG)pos, NULL, FILE_CURRENT);		break;	case JSEEK_END:		ret = SetFilePointer(fhand[fd].hand, (LONG)pos, NULL, FILE_END);		break;	}	// printf("seek %d %d %d -> %d\n", fd, (int)pos, whence, ret);	return ((int)ret);}staticintFclose(int fd){	CloseHandle(fhand[fd].hand);	freeHandle(fd);	return (0);}/* --------------------------------------------------------------------- *//* Networking *//* * Threaded socket create. */staticintNsocket(int stream){	int fd;	fd = allocHandle();	if (fd == -1) {		return (-1);	}	if (stream == 0) {		fhand[fd].sock = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, 0);	}	else {		fhand[fd].sock = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, 0);	}	if (fhand[fd].sock == INVALID_SOCKET) {		freeHandle(fd);		return (-1);	}	else {		return (fd);	}}/* * Threaded socket connect. */staticintNconnect(int fd, struct sockaddr* addr, size_t len){	int r;	r = WSAConnect(fhand[fd].sock, (const struct sockaddr*)addr, len, NULL, NULL, NULL, NULL);	if (r == SOCKET_ERROR) {		return (-1);	}	else {		return (0);	}}/* * Threaded socket accept. */staticintNaccept(int fd, struct sockaddr* addr, size_t* len){	int nfd;	nfd = allocHandle();	if (nfd == -1) {		return (-1);	}	fhand[nfd].sock = WSAAccept(fhand[fd].sock, addr, len, NULL, 0);	if (fhand[nfd].sock == INVALID_SOCKET) {		freeHandle(nfd);		return (-1);	}	return (nfd);}staticintNlisten(int fd, int len){	if (listen(fhand[fd].sock, len) == SOCKET_ERROR) {		return (-1);	}	else {		return (0);	}}staticintNbind(int fd, struct sockaddr* addr, int len){	if (bind(fhand[fd].sock, addr, len) == SOCKET_ERROR) {		return (-1);	}	else {		return (0);	}}staticintNclose(int fd){	closesocket(fhand[fd].sock);	freeHandle(fd);	return (0);}/* * Threaded recvfrom  */staticssize_t Nrecvfrom(int fd, void* buf, size_t len, int flags, 	struct sockaddr* from, int* fromlen){	ssize_t r;	int ret; 	WSABUF wbuf;	wbuf.len = (u_long)len;	wbuf.buf = (char FAR*)buf;	ret = WSARecvFrom(fhand[fd].sock, &wbuf, 1, &r, &flags,		from, fromlen, NULL, NULL);	if (ret == SOCKET_ERROR) {		return (-1);	}	return (r);}/* * Threaded recvfrom  */staticssize_t Nread(int fd, void* buf, size_t len){ 	WSABUF wbuf;	int r;	int flags;	int ret;	wbuf.len = (u_long)len;	wbuf.buf = (char FAR*)buf;	flags = 0;	ret = WSARecv(fhand[fd].sock, &wbuf, 1, &r, &flags, NULL, NULL);	if (ret == SOCKET_ERROR) {		return (-1);	}	return (r);}staticssize_tNsendto(int fd, const void* buf, size_t len, int flags, const struct sockaddr* addr, int alen){	ssize_t r;	int res;	WSABUF wbuf;	wbuf.len = (u_long)len;	wbuf.buf = (char FAR*)buf;	if (addr != NULL)		res = WSASendTo(fhand[fd].sock, &wbuf, 1, &r, flags, 			addr, alen, NULL, NULL);	else		res = WSASend(fhand[fd].sock, &wbuf, 1, &r, flags, NULL, NULL);	if (res == SOCKET_ERROR) {		int err = WSAGetLastError();		return (-1);	}	else {		return (r);	}}staticssize_tNwrite(int fd, const void* buf, size_t len){	ssize_t r;	int res;	WSABUF wbuf;	wbuf.len = (u_long)len;	wbuf.buf = (char FAR*)buf;	res = WSASend(fhand[fd].sock, &wbuf, 1, &r, 0, NULL, NULL);	if (res == SOCKET_ERROR) {		return (-1);	}	else {		return (r);	}}/* * Set the socket timeout. */staticintNsetreadtimeout(int fd, int time){	fhand[fd].timeout = (jlong)time;	return (1);}/* * Get the socket timeout. */staticintNgetreadtimeout(int fd){	return ((int)fhand[fd].timeout);}staticchar*Ngethostname(void){	char* buf;	buf = gc_malloc_fixed(64);	if (gethostname(buf, 64) == 0) {		return (buf);	}	else {		return ("localhost");	}}staticint*Ngethostbyname(char* name){	struct hostent* ent;	int* addrs;	ent = gethostbyname(name);	if (ent == 0) {		return (0);	}	addrs = (int*)gc_malloc_fixed(sizeof(int) * 2);	addrs[0] = *(int*)ent->h_addr;	addrs[1] = 0;	return (addrs);}staticchar*Ngethostbyaddr(int addr){	struct hostent* ent;	ent = gethostbyaddr((char*)&addr, 4, AF_INET);	if (ent == 0) {		return (0);	}	return (ent->h_name);}staticintNgetsockname(int fd, struct sockaddr* addr, int* alen){	if (getsockname(fhand[fd].sock, addr, alen) == SOCKET_ERROR) {		return (-1);	}	else {		return (0);	}}staticintNgetpeername(int fd, struct sockaddr* addr, int* alen){		if (getpeername(fhand[fd].sock, addr, alen) == SOCKET_ERROR) {		return (-1);	}	else {		return (0);	}}staticintNsetsockopt(int fd, int opt, int x1, const void* x2, int x3){	return (-1);}staticintNgetsockopt(int fd, int opt, int x1, void* x2, int* x3){	return (-1);}staticintNioctl(int fd, int opt, int* val){	return (-1);}FileSystemCallInterface Kaffe_FileSystemCallInterface = {	Finit,	Fopen,	Fread,		Fwrite, 	Flseek,	Fclose,	FfileInfo,	FfileInfoFD,	Freaddir,	Fmkdir,	Frmdir,	rename,	remove,};NetworkCallInterface Kaffe_NetworkCallInterface = {	Nsocket,	Nbind,	Nlisten,	Nconnect,	Naccept,	Nread,		Nrecvfrom,	Nwrite,	Nsendto,	Nclose,	Nsetsockopt,   	Ngetsockopt,	Ngetsockname,	Ngetpeername,	Ngethostname,	Ngethostbyname,	Ngethostbyaddr,	Nioctl,	Nsetreadtimeout,	Ngetreadtimeout,};

⌨️ 快捷键说明

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