chiark / gitweb /
manager: fix conflicting job check
[elogind.git] / src / systemctl.c
index 2ae8c27d087a7237b3de9289ece68aa416f78436..3ca146447aa4c181b9c2e127aaaa2766f206a6e4 100644 (file)
@@ -3933,7 +3933,8 @@ static int halt_parse_argv(int argc, char *argv[]) {
                         break;
 
                 case 'p':
-                        arg_action = ACTION_POWEROFF;
+                        if (arg_action != ACTION_REBOOT)
+                                arg_action = ACTION_POWEROFF;
                         break;
 
                 case ARG_REBOOT:
@@ -4209,8 +4210,22 @@ static int parse_argv(int argc, char *argv[]) {
                         arg_action = ACTION_POWEROFF;
                         return shutdown_parse_argv(argc, argv);
                 } else if (strstr(program_invocation_short_name, "init")) {
-                        arg_action = ACTION_INVALID;
-                        return telinit_parse_argv(argc, argv);
+
+                        if (sd_booted() > 0) {
+                                arg_action = ACTION_INVALID;
+                                return telinit_parse_argv(argc, argv);
+                        } else {
+                                /* Hmm, so some other init system is
+                                 * running, we need to forward this
+                                 * request to it. For now we simply
+                                 * guess that it is Upstart. */
+
+                                execv("/lib/upstart/telinit", argv);
+
+                                log_error("Couldn't find an alternative telinit implementation to spawn.");
+                                return -EIO;
+                        }
+
                 } else if (strstr(program_invocation_short_name, "runlevel")) {
                         arg_action = ACTION_RUNLEVEL;
                         return runlevel_parse_argv(argc, argv);
@@ -4516,18 +4531,17 @@ static int reload_with_fallback(DBusConnection *bus) {
 static int start_with_fallback(DBusConnection *bus) {
         int r;
 
-
         if (bus) {
                 /* First, try systemd via D-Bus. */
                 if ((r = start_unit(bus, NULL, 0)) > 0)
                         goto done;
-
-                /* Hmm, talking to systemd via D-Bus didn't work. Then
-                 * let's try to talk to Upstart via D-Bus. */
-                if ((r = talk_upstart()) > 0)
-                        goto done;
         }
 
+        /* Hmm, talking to systemd via D-Bus didn't work. Then
+         * let's try to talk to Upstart via D-Bus. */
+        if ((r = talk_upstart()) > 0)
+                goto done;
+
         /* Nothing else worked, so let's try
          * /dev/initctl */
         if ((r = talk_initctl()) != 0)