summaryrefslogtreecommitdiff
path: root/src/core/service.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/service.c')
-rw-r--r--src/core/service.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/core/service.c b/src/core/service.c
index ae3695aff2..4ebce6aa95 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -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;
@@ -2372,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:
@@ -2407,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;