From b0e7f44c01b9779093fd8ba65f69cb29a9308841 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Fri, 28 Oct 2011 21:36:57 +0800 Subject: [PATCH] AcessNative - Allowed the kernel executable to also start the user app --- AcessNative/acesskernel_src/main.c | 55 +++++++++++++++++++++++++++++- AcessNative/ld-acess_src/request.c | 4 ++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/AcessNative/acesskernel_src/main.c b/AcessNative/acesskernel_src/main.c index bc4083cf..f3ab1968 100644 --- a/AcessNative/acesskernel_src/main.c +++ b/AcessNative/acesskernel_src/main.c @@ -8,6 +8,11 @@ #include #include #include +#ifdef __LINUX__ +#include +#endif +#include +#include // === IMPORTS === extern int UI_Initialise(int Width, int Height); @@ -19,6 +24,7 @@ extern int NativeFS_Install(char **Arguments); extern void Debug_SetKTerminal(char *Path); extern int VT_Install(char **Arguments); extern int VFS_Mount(const char *Device, const char *MountPoint, const char *Filesystem, const char *Options); +extern int VFS_MkDir(const char *Path); extern int SyscallServer(void); extern const char gsKernelVersion[]; extern const char gsGitHash[]; @@ -30,7 +36,26 @@ const char *gsAcessDir = "../Usermode/Output/x86"; // === CODE === int main(int argc, char *argv[]) { + char **rootapp = NULL; + int rootapp_argc, i; // Parse command line settings + for( i = 1; i < argc; i ++ ) + { + if( strcmp(argv[i], "--distroot") == 0 ) { + gsAcessDir = argv[++i]; + } + else if( strcmp(argv[i], "--rootapp") == 0 ) { + rootapp = &argv[++i]; + rootapp_argc = argc - i; + break; + } + else { + fprintf(stderr, "Unknown command line option '%s'\n", argv[i]); + return -1; + } + } + + // Kernel build information printf("Acess2 Native v%s\n", gsKernelVersion); printf(" Build %i, Git Hash %s\n", giBuildNumber, gsGitHash); @@ -62,9 +87,37 @@ int main(int argc, char *argv[]) Debug_SetKTerminal("/Devices/VTerm/8"); // Start syscall server - // - Blocks SyscallServer(); + // Spawn root application + if( rootapp ) + { + int pid; + char *args[7+rootapp_argc+1]; + + args[0] = "ld-acess"; + args[1] = "--open"; args[2] = "/Devices/VTerm/0"; + args[3] = "--open"; args[4] = "/Devices/VTerm/0"; + args[5] = "--open"; args[6] = "/Devices/VTerm/0"; + for( i = 0; i < rootapp_argc; i ++ ) + args[7+i] = rootapp[i]; + args[7+rootapp_argc] = NULL; + + pid = fork(); + if(pid < 0) { + perror("Starting root application [fork(2)]"); + return 1; + } + if(pid == 0) + { + #ifdef __LINUX__ + prctl(PR_SET_PDEATHSIG, SIGHUP); // LINUX ONLY! + #endif + execv("./ld-acess", args); + } + printf("Root application running as PID %i\n", pid); + } + UI_MainLoop(); return 0; diff --git a/AcessNative/ld-acess_src/request.c b/AcessNative/ld-acess_src/request.c index b8a3239b..7d80a45b 100644 --- a/AcessNative/ld-acess_src/request.c +++ b/AcessNative/ld-acess_src/request.c @@ -195,7 +195,9 @@ int SendRequest(tRequestHeader *Request, int RequestSize, int ResponseSize) // Send it off SendData(Request, RequestSize); - + + if( Request->CallID == SYS_EXIT ) return 0; + // Wait for a response (no timeout) return ReadData(Request, ResponseSize, 0); } -- 2.20.1