diff options
author | Robin Burchell <robin+git@viroteck.net> | 2019-06-16 14:22:11 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-06-16 14:33:59 +0200 |
commit | 862682b1bbaf18e9768308ba38730cd02775e65e (patch) | |
tree | 59862e0fa468de183960168f63299342e79669a0 /Servers/SystemServer | |
parent | 0a3abcc0a845a5d206047c1e3cb3dc81b29fcc10 (diff) | |
download | serenity-862682b1bbaf18e9768308ba38730cd02775e65e.zip |
SystemServer: Shut down after 5 seconds if testmode=1 is set on the kernel command line
Diffstat (limited to 'Servers/SystemServer')
-rw-r--r-- | Servers/SystemServer/main.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/Servers/SystemServer/main.cpp b/Servers/SystemServer/main.cpp index c908f665e9..51b971412f 100644 --- a/Servers/SystemServer/main.cpp +++ b/Servers/SystemServer/main.cpp @@ -5,6 +5,7 @@ #include <string.h> #include <sys/types.h> #include <unistd.h> +#include <LibCore/CFile.h> void start_process(const char* prog, int prio) { @@ -47,6 +48,30 @@ void start_process(const char* prog, int prio) } } +static void check_for_test_mode() +{ + CFile f("/proc/cmdline"); + if (!f.open(CIODevice::ReadOnly)) { + dbgprintf("Failed to read command line: %s\n", f.error_string()); + ASSERT(false); + } + const String cmd = String::copy(f.read_all()); + dbgprintf("Read command line: %s\n", cmd.characters()); + if (cmd.matches("*testmode=1*")) { + // Eventually, we should run a test binary and wait for it to finish + // before shutting down. But this is good enough for now. + dbgprintf("Waiting for testmode shutdown...\n"); + sleep(5); + dbgprintf("Shutting down due to testmode...\n"); + if (fork() == 0) { + execl("/bin/shutdown", "/bin/shutdown", "-n", nullptr); + ASSERT_NOT_REACHED(); + } + } else { + dbgprintf("Continuing normally\n"); + } +} + int main(int, char**) { int lowest_prio = sched_get_priority_min(SCHED_OTHER); @@ -57,6 +82,9 @@ int main(int, char**) start_process("/bin/Terminal", highest_prio - 1); start_process("/bin/Launcher", highest_prio); + // This won't return if we're in test mode. + check_for_test_mode(); + while (1) { sleep(1); } |