summaryrefslogtreecommitdiff
path: root/Servers/SystemServer
diff options
context:
space:
mode:
authorRobin Burchell <robin+git@viroteck.net>2019-06-16 14:22:11 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-06-16 14:33:59 +0200
commit862682b1bbaf18e9768308ba38730cd02775e65e (patch)
tree59862e0fa468de183960168f63299342e79669a0 /Servers/SystemServer
parent0a3abcc0a845a5d206047c1e3cb3dc81b29fcc10 (diff)
downloadserenity-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.cpp28
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);
}