chiark / gitweb /
networkd: link - add missing curly brackets
[elogind.git] / src / core / service.c
index 67467b2d6d01a66cc14ac1072bf4474c60b24f42..4ebce6aa95ec7b3995c978ec513b7282789dec89 100644 (file)
@@ -24,6 +24,8 @@
 #include <dirent.h>
 #include <unistd.h>
 #include <sys/reboot.h>
+#include <linux/reboot.h>
+#include <sys/syscall.h>
 
 #include "manager.h"
 #include "unit.h"
@@ -300,6 +302,9 @@ static void service_done(Unit *u) {
         free(s->status_text);
         s->status_text = NULL;
 
+        free(s->reboot_arg);
+        s->reboot_arg = NULL;
+
         s->exec_runtime = exec_runtime_unref(s->exec_runtime);
         exec_command_free_array(s->exec_command, _SERVICE_EXEC_COMMAND_MAX);
         s->control_command = NULL;
@@ -664,13 +669,8 @@ static int service_load_sysv_path(Service *s, const char *path) {
 
                                 state = NORMAL;
 
-                                if (sscanf(t+10, "%15s %i %*i",
-                                           runlevels,
-                                           &start_priority) != 2) {
-
-                                        log_warning_unit(u->id,
-                                                         "[%s:%u] Failed to parse chkconfig line. Ignoring.",
-                                                         path, line);
+                                if (sscanf(t+10, "%15s %i %*i", runlevels, &start_priority) != 2) {
+                                        log_warning_unit(u->id, "[%s:%u] Failed to parse chkconfig line. Ignoring.", path, line);
                                         continue;
                                 }
 
@@ -678,19 +678,17 @@ static int service_load_sysv_path(Service *s, const char *path) {
                                  * symlink farms is preferred over the
                                  * data from the LSB header. */
                                 if (start_priority < 0 || start_priority > 99)
-                                        log_warning_unit(u->id,
-                                                         "[%s:%u] Start priority out of range. Ignoring.",
-                                                         path, line);
+                                        log_warning_unit(u->id, "[%s:%u] Start priority out of range. Ignoring.", path, line);
                                 else
-                                        s->sysv_start_priority = start_priority;
+                                        log_debug_unit(u->id, "[%s:%u] Ignoring start priority set in the chkconfig file.", path, line);
 
                                 char_array_0(runlevels);
                                 k = delete_chars(runlevels, WHITESPACE "-");
-
                                 if (k[0]) {
                                         char *d;
 
-                                        if (!(d = strdup(k))) {
+                                        d = strdup(k);
+                                        if (!d) {
                                                 r = -ENOMEM;
                                                 goto finish;
                                         }
@@ -992,9 +990,9 @@ static int service_load_sysv_path(Service *s, const char *path) {
                 u->description = d;
         }
 
-        /* The priority that has been set in /etc/rcN.d/ hierarchies
-         * takes precedence over what is stored as default in the LSB
-         * header */
+        /* Initialize the start priority from what has been set in the
+         * /etc/rcN.d/ hierarchies if we load the unit file as SysV
+         * init script. */
         if (s->sysv_start_priority_from_rcnd >= 0)
                 s->sysv_start_priority = s->sysv_start_priority_from_rcnd;
 
@@ -2379,6 +2377,10 @@ static int service_start_limit_test(Service *s) {
         if (ratelimit_test(&s->start_limit))
                 return 0;
 
+        if (s->start_limit_action == SERVICE_START_LIMIT_REBOOT ||
+            s->start_limit_action == SERVICE_START_LIMIT_REBOOT_FORCE)
+                update_reboot_param_file(s->reboot_arg);
+
         switch (s->start_limit_action) {
 
         case SERVICE_START_LIMIT_NONE:
@@ -2414,6 +2416,13 @@ static int service_start_limit_test(Service *s) {
                 log_warning_unit(UNIT(s)->id,
                                  "%s start request repeated too quickly, rebooting immediately.", UNIT(s)->id);
                 sync();
+                if (s->reboot_arg) {
+                        log_info("Rebooting with argument '%s'.", s->reboot_arg);
+                        syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
+                                LINUX_REBOOT_CMD_RESTART2, s->reboot_arg);
+                }
+
+                log_info("Rebooting.");
                 reboot(RB_AUTOBOOT);
                 break;