Skip to content
Snippets Groups Projects
Commit 8cdfaebb authored by John Hodge's avatar John Hodge
Browse files

AcessNative - Getting there... (Bedtime commit)

parent 02cbaac1
Branches
No related merge requests found
...@@ -12,7 +12,7 @@ KERNEL_OBJ += vfs/main.o vfs/open.o vfs/acls.o vfs/io.o vfs/dir.o vfs/nodecache. ...@@ -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 += vfs/fs/root.o vfs/fs/devfs.o
KERNEL_OBJ += drv/vterm.o drv/fifo.o drv/proc.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 += video.o keyboard.o mouse.o nativefs.o vfs_handle.o ui_sdl.o
OBJ += $(addprefix $(KERNEL_SRC),$(KERNEL_OBJ)) OBJ += $(addprefix $(KERNEL_SRC),$(KERNEL_OBJ))
......
...@@ -13,6 +13,7 @@ extern int VFS_Init(void); ...@@ -13,6 +13,7 @@ extern int VFS_Init(void);
extern int Video_Install(char **Arguments); extern int Video_Install(char **Arguments);
extern int NativeKeyboard_Install(char **Arguments); extern int NativeKeyboard_Install(char **Arguments);
extern int VT_Install(char **Arguments); extern int VT_Install(char **Arguments);
extern int SyscallServer(void);
// === CODE === // === CODE ===
int main(int argc, char *argv[]) int main(int argc, char *argv[])
...@@ -38,10 +39,8 @@ int main(int argc, char *argv[]) ...@@ -38,10 +39,8 @@ int main(int argc, char *argv[])
} }
// Start syscall server // Start syscall server
for( ;; ) // - Blocks
{ SyscallServer();
UI_Redraw();
}
return 0; return 0;
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* Acess2 Native Kernel * Acess2 Native Kernel
* - Acess kernel emulation on another OS using SDL and UDP * - Acess kernel emulation on another OS using SDL and UDP
* *
* Syscall Server * Syscall Distribution
*/ */
#include <acess.h> #include <acess.h>
#include "../syscalls.h" #include "../syscalls.h"
......
...@@ -14,7 +14,11 @@ ...@@ -14,7 +14,11 @@
#include "request.h" #include "request.h"
#include "../syscalls.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 === // === GLOBALS ===
#ifdef __WIN32__ #ifdef __WIN32__
...@@ -26,13 +30,12 @@ SOCKET gSocket = INVALID_SOCKET; ...@@ -26,13 +30,12 @@ SOCKET gSocket = INVALID_SOCKET;
#endif #endif
// Client ID to pass to server // Client ID to pass to server
// TODO: Implement such that each thread gets a different one // 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 === // === CODE ===
int _InitSyscalls() int _InitSyscalls()
{ {
struct sockaddr_in server;
struct sockaddr_in client;
#ifdef __WIN32__ #ifdef __WIN32__
/* Open windows connection */ /* Open windows connection */
...@@ -43,10 +46,13 @@ int _InitSyscalls() ...@@ -43,10 +46,13 @@ int _InitSyscalls()
} }
#endif #endif
#if USE_TCP
// Open TCP Connection // Open TCP Connection
gSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); gSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
#else
// Open UDP Connection // Open UDP Connection
//gSocket = socket(AF_INET, SOCK_DGRAM, 0); gSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
#endif
if (gSocket == INVALID_SOCKET) if (gSocket == INVALID_SOCKET)
{ {
fprintf(stderr, "Could not create socket.\n"); fprintf(stderr, "Could not create socket.\n");
...@@ -57,18 +63,21 @@ int _InitSyscalls() ...@@ -57,18 +63,21 @@ int _InitSyscalls()
} }
// Set server address // Set server address
memset((void *)&server, '\0', sizeof(struct sockaddr_in)); memset((void *)&gSyscall_ServerAddr, '\0', sizeof(struct sockaddr_in));
server.sin_family = AF_INET; gSyscall_ServerAddr.sin_family = AF_INET;
server.sin_port = htons(SERVER_PORT); gSyscall_ServerAddr.sin_port = htons(SERVER_PORT);
server.sin_addr.s_addr = htonl(0x7F00001); gSyscall_ServerAddr.sin_addr.s_addr = htonl(0x7F000001);
#if 0
// Set client address // Set client address
memset((void *)&client, '\0', sizeof(struct sockaddr_in)); memset((void *)&client, '\0', sizeof(struct sockaddr_in));
client.sin_family = AF_INET; client.sin_family = AF_INET;
client.sin_port = htons(0); 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); fprintf(stderr, "Cannot connect to server (localhost:%i)\n", SERVER_PORT);
perror("_InitSyscalls"); perror("_InitSyscalls");
...@@ -80,6 +89,7 @@ int _InitSyscalls() ...@@ -80,6 +89,7 @@ int _InitSyscalls()
#endif #endif
exit(0); exit(0);
} }
#endif
#if 0 #if 0
// Bind // Bind
...@@ -96,6 +106,24 @@ int _InitSyscalls() ...@@ -96,6 +106,24 @@ int _InitSyscalls()
} }
#endif #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; return 0;
} }
...@@ -125,7 +153,7 @@ int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput, ...@@ -125,7 +153,7 @@ int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput,
data = (char*)&request->Params[ NumOutput + NumInput ]; data = (char*)&request->Params[ NumOutput + NumInput ];
// Set header // Set header
request->ClientID = siSyscall_ClientID; request->ClientID = giSyscall_ClientID;
request->CallID = RequestID; // Syscall request->CallID = RequestID; // Syscall
request->NParams = NumOutput; request->NParams = NumOutput;
request->NReturn = NumInput; request->NReturn = NumInput;
...@@ -181,21 +209,10 @@ int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput, ...@@ -181,21 +209,10 @@ int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput,
#endif #endif
// Send it off // Send it off
if( send(gSocket, request, requestLen, 0) != requestLen ) { SendData(request, requestLen);
fprintf(stderr, "SendRequest: send() failed\n");
perror("SendRequest - send");
free( request );
return -1;
}
// Wait for a response // Wait for a response (no timeout)
requestLen = recv(gSocket, request, requestLen, 0); requestLen = ReadData(request, requestLen, -1);
if( requestLen < 0 ) {
fprintf(stderr, "SendRequest: revc() failed\n");
perror("SendRequest - recv");
free( request );
return -1;
}
// Parse response out // Parse response out
if( request->NParams != NumInput ) { if( request->NParams != NumInput ) {
...@@ -211,3 +228,57 @@ int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput, ...@@ -211,3 +228,57 @@ int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput,
return 0; 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;
}
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
#ifndef _NATIVE_SYSCALLS_H_ #ifndef _NATIVE_SYSCALLS_H_
#define _NATIVE_SYSCALLS_H_ #define _NATIVE_SYSCALLS_H_
#define SERVER_PORT 0xACE
/* /*
* Request format * Request format
* *
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment