Prechádzať zdrojové kódy

SystemServer: Allow more arguments for startup processes

Conrad Pankoff 5 rokov pred
rodič
commit
a8bd43588b
1 zmenil súbory, kde vykonal 21 pridanie a 20 odobranie
  1. 21 20
      Servers/SystemServer/main.cpp

+ 21 - 20
Servers/SystemServer/main.cpp

@@ -8,26 +8,26 @@
 #include <sys/types.h>
 #include <unistd.h>
 
-void start_process(const char* prog, const char* arg, int prio, const char* tty = nullptr)
+void start_process(const String& program, const Vector<String>& arguments, int prio, const char* tty = nullptr)
 {
     pid_t pid = 0;
 
     while (true) {
-        dbgprintf("Forking for %s...\n", prog);
+        dbgprintf("Forking for %s...\n", program.characters());
         int pid = fork();
         if (pid < 0) {
-            dbgprintf("Fork %s failed! %s\n", prog, strerror(errno));
+            dbgprintf("Fork %s failed! %s\n", program.characters(), strerror(errno));
             continue;
         } else if (pid > 0) {
             // parent...
-            dbgprintf("Process %s hopefully started with priority %d...\n", prog, prio);
+            dbgprintf("Process %s hopefully started with priority %d...\n", program.characters(), prio);
             return;
         }
         break;
     }
 
     while (true) {
-        dbgprintf("Executing for %s... at prio %d\n", prog, prio);
+        dbgprintf("Executing for %s... at prio %d\n", program.characters(), prio);
         struct sched_param p;
         p.sched_priority = prio;
         int ret = sched_setparam(pid, &p);
@@ -41,12 +41,13 @@ void start_process(const char* prog, const char* arg, int prio, const char* tty
         }
 
         char* progv[256];
-        progv[0] = const_cast<char*>(prog);
-        progv[1] = const_cast<char*>(arg);
-        progv[2] = nullptr;
-        ret = execv(prog, progv);
+        progv[0] = const_cast<char*>(program.characters());
+        for (int i = 0; i < arguments.size() && i < 254; i++)
+            progv[i+1] = const_cast<char*>(arguments[i].characters());
+        progv[arguments.size() + 1] = nullptr;
+        ret = execv(progv[0], progv);
         if (ret < 0) {
-            dbgprintf("Exec %s failed! %s", prog, strerror(errno));
+            dbgprintf("Exec %s failed! %s", progv[0], strerror(errno));
             continue;
         }
         break;
@@ -83,24 +84,24 @@ int main(int, char**)
     int highest_prio = sched_get_priority_max(SCHED_OTHER);
 
     // Mount the filesystems.
-    start_process("/bin/mount", "-a", highest_prio);
+    start_process("/bin/mount", { "-a" }, highest_prio);
     wait(nullptr);
 
     // NOTE: We don't start anything on tty0 since that's the "active" TTY while WindowServer is up.
-    start_process("/bin/TTYServer", "tty1", highest_prio, "/dev/tty1");
-    start_process("/bin/TTYServer", "tty2", highest_prio, "/dev/tty2");
-    start_process("/bin/TTYServer", "tty3", highest_prio, "/dev/tty3");
+    start_process("/bin/TTYServer", { "tty1" }, highest_prio, "/dev/tty1");
+    start_process("/bin/TTYServer", { "tty2" }, highest_prio, "/dev/tty2");
+    start_process("/bin/TTYServer", { "tty3" }, highest_prio, "/dev/tty3");
 
     // Drop privileges.
     setuid(100);
     setgid(100);
 
-    start_process("/bin/LookupServer", nullptr, lowest_prio);
-    start_process("/bin/WindowServer", nullptr, highest_prio);
-    start_process("/bin/AudioServer", nullptr, highest_prio);
-    start_process("/bin/Taskbar", nullptr, highest_prio);
-    start_process("/bin/Terminal", nullptr, highest_prio - 1);
-    start_process("/bin/Launcher", nullptr, highest_prio);
+    start_process("/bin/LookupServer", {}, lowest_prio);
+    start_process("/bin/WindowServer", {}, highest_prio);
+    start_process("/bin/AudioServer", {}, highest_prio);
+    start_process("/bin/Taskbar", {}, highest_prio);
+    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();