chiark / gitweb /
service: add minimal access control logic for notifcation socket
[elogind.git] / src / main.c
index ec2733e1855a74bfb764f558b86c930283a9a01b..8a7f18ea9c38c2688b9f5ebe3f765fe9643d82df 100644 (file)
@@ -40,6 +40,7 @@
 #include "kmod-setup.h"
 #include "load-fragment.h"
 #include "fdset.h"
+#include "special.h"
 
 static enum {
         ACTION_RUN,
@@ -222,11 +223,11 @@ static int set_default_unit(const char *u) {
 static int parse_proc_cmdline_word(const char *word) {
 
         static const char * const rlmap[] = {
-                "single", SPECIAL_RUNLEVEL1_TARGET,
-                "-s",     SPECIAL_RUNLEVEL1_TARGET,
-                "s",      SPECIAL_RUNLEVEL1_TARGET,
-                "S",      SPECIAL_RUNLEVEL1_TARGET,
-                "1",      SPECIAL_RUNLEVEL1_TARGET,
+                "single", SPECIAL_RESCUE_TARGET,
+                "-s",     SPECIAL_RESCUE_TARGET,
+                "s",      SPECIAL_RESCUE_TARGET,
+                "S",      SPECIAL_RESCUE_TARGET,
+                "1",      SPECIAL_RESCUE_TARGET,
                 "2",      SPECIAL_RUNLEVEL2_TARGET,
                 "3",      SPECIAL_RUNLEVEL3_TARGET,
                 "4",      SPECIAL_RUNLEVEL4_TARGET,
@@ -609,6 +610,16 @@ int main(int argc, char *argv[]) {
         FDSet *fds = NULL;
         bool reexecute = false;
 
+        if (getpid() != 1 && strstr(program_invocation_short_name, "init")) {
+                /* This is compatbility support for SysV, where
+                 * calling init as a user is identical to telinit. */
+
+                errno = -ENOENT;
+                execv(SYSTEMCTL_BINARY_PATH, argv);
+                log_error("Failed to exec " SYSTEMCTL_BINARY_PATH ": %m");
+                return 1;
+        }
+
         log_show_color(true);
         log_show_location(false);
         log_set_max_level(LOG_DEBUG);