chiark / gitweb /
systemctl: allow 'systemctl reboot -ff' to succeed even without D-Bus
[elogind.git] / src / systemctl / systemctl.c
index e2550ad..681ad8c 100644 (file)
@@ -1783,11 +1783,15 @@ static int start_special(DBusConnection *bus, char **args) {
         enum action a;
         int r;
 
         enum action a;
         int r;
 
-        assert(bus);
         assert(args);
 
         a = verb_to_action(args[0]);
 
         assert(args);
 
         a = verb_to_action(args[0]);
 
+        if (arg_force >= 2 && geteuid() != 0) {
+                log_error("Must be root.");
+                return -EPERM;
+        }
+
         if (arg_force >= 2 &&
             (a == ACTION_HALT ||
              a == ACTION_POWEROFF ||
         if (arg_force >= 2 &&
             (a == ACTION_HALT ||
              a == ACTION_POWEROFF ||
@@ -5199,7 +5203,9 @@ static int systemctl_main(DBusConnection *bus, int argc, char *argv[], DBusError
                         return 0;
                 }
 
                         return 0;
                 }
 
-                if (!bus) {
+                if (((!streq(verbs[i].verb, "reboot") &&
+                     !streq(verbs[i].verb, "halt") &&
+                     !streq(verbs[i].verb, "reboot")) || arg_force <= 0) && !bus) {
                         log_error("Failed to get D-Bus connection: %s",
                                   dbus_error_is_set(error) ? error->message : "No connection to service manager.");
                         return -EIO;
                         log_error("Failed to get D-Bus connection: %s",
                                   dbus_error_is_set(error) ? error->message : "No connection to service manager.");
                         return -EIO;