+ 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);
+
+ // Start UI subsystem
+ UI_Initialise(800, 480);
+
+ // - Ignore SIGUSR1 (used to wake threads)
+ #ifdef SIGUSR1
+ signal(SIGUSR1, SIG_IGN);
+ #endif
+
+ // Initialise VFS
+ VFS_Init();
+ // - Start IO Drivers
+ if( Video_Install(NULL) ) {
+ Log_Error("Init", "Unable to load NativeVideo");
+ }
+ if( NativeKeyboard_Install(NULL) ) {
+ Log_Error("Init", "Unable to load NativeKeyboard");
+ }
+ NativeFS_Install(NULL);
+ Mouse_Install(NULL);
+ // - Start VTerm
+ {
+ char *args[] = {
+ "Video=NativeVideo",
+ "Input=NativeKeyboard",
+ NULL
+ };
+ VT_Install(args);
+ }
+
+ VFS_MkDir("/Acess");
+ VFS_Mount(gsAcessDir, "/Acess", "nativefs", "");
+
+ Debug_SetKTerminal("/Devices/VTerm/8");
+
+ // Start syscall server
+ SyscallServer();
+
+ // Spawn root application
+ if( rootapp )
+ {
+ int pid;
+ int argcount = 0;
+ const char *args[7+rootapp_argc+1+1];
+
+ #if VALGRIND_CLIENT
+ args[argcount++] = "valgrind";
+ #endif
+ args[argcount++] = "./ld-acess";
+ args[argcount++] = "--open"; args[argcount++] = "/Devices/VTerm/0";
+ args[argcount++] = "--open"; args[argcount++] = "/Devices/VTerm/0";
+ args[argcount++] = "--open"; args[argcount++] = "/Devices/VTerm/0";
+ for( i = 0; i < rootapp_argc; i ++ )
+ args[argcount+i] = rootapp[i];
+ args[argcount+rootapp_argc] = NULL;
+ pid = spawnv(P_NOWAIT, "./ld-acess", args);
+ if(pid < 0) {
+ perror("Starting root application [fork(2)]");
+ return 1;
+ }
+ printf("Root application running as PID %i\n", pid);
+ }
+
+ UI_MainLoop();
+
+ return 0;