From 8cdfaebb825cb8d0f78dbf1b4f29fd0bff796045 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 22 Jan 2011 23:32:39 +0800 Subject: [PATCH] AcessNative - Getting there... (Bedtime commit) --- AcessNative/acesskernel_src/Makefile | 2 +- AcessNative/acesskernel_src/main.c | 7 +- AcessNative/acesskernel_src/syscalls.c | 2 +- AcessNative/ld-acess_src/request.c | 123 +++++++++++++++++++------ AcessNative/syscalls.h | 2 + 5 files changed, 104 insertions(+), 32 deletions(-) diff --git a/AcessNative/acesskernel_src/Makefile b/AcessNative/acesskernel_src/Makefile index 71782a9a..c69cf066 100644 --- a/AcessNative/acesskernel_src/Makefile +++ b/AcessNative/acesskernel_src/Makefile @@ -12,7 +12,7 @@ KERNEL_OBJ += vfs/main.o vfs/open.o vfs/acls.o vfs/io.o vfs/dir.o vfs/nodecache. KERNEL_OBJ += vfs/fs/root.o vfs/fs/devfs.o KERNEL_OBJ += drv/vterm.o drv/fifo.o drv/proc.o -OBJ := main.o helpers.o threads.o syscalls.o +OBJ := main.o helpers.o threads.o server.o syscalls.o OBJ += video.o keyboard.o mouse.o nativefs.o vfs_handle.o ui_sdl.o OBJ += $(addprefix $(KERNEL_SRC),$(KERNEL_OBJ)) diff --git a/AcessNative/acesskernel_src/main.c b/AcessNative/acesskernel_src/main.c index 7de6bf95..3f152efa 100644 --- a/AcessNative/acesskernel_src/main.c +++ b/AcessNative/acesskernel_src/main.c @@ -13,6 +13,7 @@ extern int VFS_Init(void); extern int Video_Install(char **Arguments); extern int NativeKeyboard_Install(char **Arguments); extern int VT_Install(char **Arguments); +extern int SyscallServer(void); // === CODE === int main(int argc, char *argv[]) @@ -38,10 +39,8 @@ int main(int argc, char *argv[]) } // Start syscall server - for( ;; ) - { - UI_Redraw(); - } + // - Blocks + SyscallServer(); return 0; } diff --git a/AcessNative/acesskernel_src/syscalls.c b/AcessNative/acesskernel_src/syscalls.c index db790770..7e8d1ecd 100644 --- a/AcessNative/acesskernel_src/syscalls.c +++ b/AcessNative/acesskernel_src/syscalls.c @@ -2,7 +2,7 @@ * Acess2 Native Kernel * - Acess kernel emulation on another OS using SDL and UDP * - * Syscall Server + * Syscall Distribution */ #include #include "../syscalls.h" diff --git a/AcessNative/ld-acess_src/request.c b/AcessNative/ld-acess_src/request.c index df6e5c55..1fff68e8 100644 --- a/AcessNative/ld-acess_src/request.c +++ b/AcessNative/ld-acess_src/request.c @@ -14,7 +14,11 @@ #include "request.h" #include "../syscalls.h" -#define SERVER_PORT 0xACE +#define USE_TCP 0 + +// === PROTOTYPES === +void SendData(void *Data, int Length); + int ReadData(void *Dest, int MaxLen, int Timeout); // === GLOBALS === #ifdef __WIN32__ @@ -26,13 +30,12 @@ SOCKET gSocket = INVALID_SOCKET; #endif // Client ID to pass to server // TODO: Implement such that each thread gets a different one -static int siSyscall_ClientID = 0; + int giSyscall_ClientID = 0; +struct sockaddr_in gSyscall_ServerAddr; // === CODE === int _InitSyscalls() { - struct sockaddr_in server; - struct sockaddr_in client; #ifdef __WIN32__ /* Open windows connection */ @@ -43,10 +46,13 @@ int _InitSyscalls() } #endif + #if USE_TCP // Open TCP Connection gSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + #else // Open UDP Connection - //gSocket = socket(AF_INET, SOCK_DGRAM, 0); + gSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + #endif if (gSocket == INVALID_SOCKET) { fprintf(stderr, "Could not create socket.\n"); @@ -57,18 +63,21 @@ int _InitSyscalls() } // Set server address - memset((void *)&server, '\0', sizeof(struct sockaddr_in)); - server.sin_family = AF_INET; - server.sin_port = htons(SERVER_PORT); - server.sin_addr.s_addr = htonl(0x7F00001); + memset((void *)&gSyscall_ServerAddr, '\0', sizeof(struct sockaddr_in)); + gSyscall_ServerAddr.sin_family = AF_INET; + gSyscall_ServerAddr.sin_port = htons(SERVER_PORT); + gSyscall_ServerAddr.sin_addr.s_addr = htonl(0x7F000001); + #if 0 // Set client address memset((void *)&client, '\0', sizeof(struct sockaddr_in)); client.sin_family = AF_INET; client.sin_port = htons(0); - client.sin_addr.s_addr = htonl(0x7F00001); + client.sin_addr.s_addr = htonl(0x7F000001); + #endif - if( connect(gSocket, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) < 0 ) + #if USE_TCP + if( connect(gSocket, (struct sockaddr *)&gSyscall_ServerAddr, sizeof(struct sockaddr_in)) < 0 ) { fprintf(stderr, "Cannot connect to server (localhost:%i)\n", SERVER_PORT); perror("_InitSyscalls"); @@ -80,6 +89,7 @@ int _InitSyscalls() #endif exit(0); } + #endif #if 0 // Bind @@ -96,6 +106,24 @@ int _InitSyscalls() } #endif + #if !USE_TCP + // Ask server for a client ID + { + tRequestHeader req; + int len; + req.ClientID = 0; + req.CallID = 0; + req.NParams = 0; + req.NReturn = 0; + + SendData(&req, sizeof(req)); + + len = ReadData(&req, sizeof(req), 5); + + giSyscall_ClientID = req.ClientID; + } + #endif + return 0; } @@ -125,7 +153,7 @@ int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput, data = (char*)&request->Params[ NumOutput + NumInput ]; // Set header - request->ClientID = siSyscall_ClientID; + request->ClientID = giSyscall_ClientID; request->CallID = RequestID; // Syscall request->NParams = NumOutput; request->NReturn = NumInput; @@ -181,21 +209,10 @@ int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput, #endif // Send it off - if( send(gSocket, request, requestLen, 0) != requestLen ) { - fprintf(stderr, "SendRequest: send() failed\n"); - perror("SendRequest - send"); - free( request ); - return -1; - } + SendData(request, requestLen); - // Wait for a response - requestLen = recv(gSocket, request, requestLen, 0); - if( requestLen < 0 ) { - fprintf(stderr, "SendRequest: revc() failed\n"); - perror("SendRequest - recv"); - free( request ); - return -1; - } + // Wait for a response (no timeout) + requestLen = ReadData(request, requestLen, -1); // Parse response out if( request->NParams != NumInput ) { @@ -211,3 +228,57 @@ int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput, return 0; } + +void SendData(void *Data, int Length) +{ + int len; + + #if USE_TCP + len = send(Data, Length, 0); + #else + len = sendto(gSocket, Data, Length, 0, + (struct sockaddr*)&gSyscall_ServerAddr, sizeof(gSyscall_ServerAddr)); + #endif + + if( len != Length ) { + perror("SendData"); + exit(-1); + } +} + +int ReadData(void *Dest, int MaxLength, int Timeout) +{ + int ret; + fd_set fds; + struct timeval tv; + + FD_ZERO(&fds); + FD_SET(gSocket, &fds); + + tv.tv_sec = Timeout; + tv.tv_usec = 0; + + ret = select(1, &fds, NULL, NULL, &tv); + if( ret == -1 ) { + perror("ReadData - select"); + exit(-1); + } + + if( !ret ) { + printf("Timeout reading from socket\n"); + return 0; // Timeout + } + + #if USE_TCP + ret = recv(gSocket, Dest, MaxLength, 0); + #else + ret = recvfrom(gSocket, Dest, MaxLength, 0, NULL, 0); + #endif + + if( ret < 0 ) { + perror("ReadData"); + exit(-1); + } + + return ret; +} diff --git a/AcessNative/syscalls.h b/AcessNative/syscalls.h index 5081a53d..903cbfae 100644 --- a/AcessNative/syscalls.h +++ b/AcessNative/syscalls.h @@ -3,6 +3,8 @@ #ifndef _NATIVE_SYSCALLS_H_ #define _NATIVE_SYSCALLS_H_ +#define SERVER_PORT 0xACE + /* * Request format * -- 2.20.1