summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2019-08-25 10:57:08 +0200
committerYu Watanabe <watanabe.yu+github@gmail.com>2019-08-28 16:09:54 +0200
commit810ef3180ead97e678cbf7b1107c6fdb424c95de (patch)
tree3d5d9dde7e6fc78de32cbe3b4a02af8c31ce2c2d
parentcore: move timeout_clean_usec from Service to ExecContext (diff)
downloadsystemd-810ef3180ead97e678cbf7b1107c6fdb424c95de.tar.xz
systemd-810ef3180ead97e678cbf7b1107c6fdb424c95de.zip
core: introduce unit_fork_and_watch_rm_rf()
-rw-r--r--src/core/service.c26
-rw-r--r--src/core/unit.c34
-rw-r--r--src/core/unit.h1
3 files changed, 37 insertions, 24 deletions
diff --git a/src/core/service.c b/src/core/service.c
index 7e923c663d..0fffe11c49 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -30,7 +30,6 @@
#include "parse-util.h"
#include "path-util.h"
#include "process-util.h"
-#include "rm-rf.h"
#include "serialize.h"
#include "service.h"
#include "signal-util.h"
@@ -4252,7 +4251,6 @@ static int service_exit_status(Unit *u) {
static int service_clean(Unit *u, ExecCleanMask mask) {
_cleanup_strv_free_ char **l = NULL;
Service *s = SERVICE(u);
- pid_t pid;
int r;
assert(s);
@@ -4277,36 +4275,16 @@ static int service_clean(Unit *u, ExecCleanMask mask) {
if (r < 0)
goto fail;
- r = unit_fork_helper_process(UNIT(s), "(sd-rmrf)", &pid);
- if (r < 0)
- goto fail;
- if (r == 0) {
- int ret = EXIT_SUCCESS;
- char **i;
-
- STRV_FOREACH(i, l) {
- r = rm_rf(*i, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_MISSING_OK);
- if (r < 0) {
- log_error_errno(r, "Failed to remove '%s': %m", *i);
- ret = EXIT_FAILURE;
- }
- }
-
- _exit(ret);
- }
-
- r = unit_watch_pid(u, pid, true);
+ r = unit_fork_and_watch_rm_rf(u, l, &s->control_pid);
if (r < 0)
goto fail;
- s->control_pid = pid;
-
service_set_state(s, SERVICE_CLEANING);
return 0;
fail:
- log_unit_warning_errno(UNIT(s), r, "Failed to initiate cleaning: %m");
+ log_unit_warning_errno(u, r, "Failed to initiate cleaning: %m");
s->clean_result = SERVICE_FAILURE_RESOURCES;
s->timer_event_source = sd_event_source_unref(s->timer_event_source);
return r;
diff --git a/src/core/unit.c b/src/core/unit.c
index 31ed473f91..5224015c70 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -38,6 +38,7 @@
#include "parse-util.h"
#include "path-util.h"
#include "process-util.h"
+#include "rm-rf.h"
#include "serialize.h"
#include "set.h"
#include "signal-util.h"
@@ -5303,6 +5304,39 @@ int unit_fork_helper_process(Unit *u, const char *name, pid_t *ret) {
return 0;
}
+int unit_fork_and_watch_rm_rf(Unit *u, char **paths, pid_t *ret_pid) {
+ pid_t pid;
+ int r;
+
+ assert(u);
+ assert(ret_pid);
+
+ r = unit_fork_helper_process(u, "(sd-rmrf)", &pid);
+ if (r < 0)
+ return r;
+ if (r == 0) {
+ int ret = EXIT_SUCCESS;
+ char **i;
+
+ STRV_FOREACH(i, paths) {
+ r = rm_rf(*i, REMOVE_ROOT|REMOVE_PHYSICAL|REMOVE_MISSING_OK);
+ if (r < 0) {
+ log_error_errno(r, "Failed to remove '%s': %m", *i);
+ ret = EXIT_FAILURE;
+ }
+ }
+
+ _exit(ret);
+ }
+
+ r = unit_watch_pid(u, pid, true);
+ if (r < 0)
+ return r;
+
+ *ret_pid = pid;
+ return 0;
+}
+
static void unit_update_dependency_mask(Unit *u, UnitDependency d, Unit *other, UnitDependencyInfo di) {
assert(u);
assert(d >= 0);
diff --git a/src/core/unit.h b/src/core/unit.h
index 4732d72202..d5f4413cd8 100644
--- a/src/core/unit.h
+++ b/src/core/unit.h
@@ -824,6 +824,7 @@ bool unit_shall_confirm_spawn(Unit *u);
int unit_set_exec_params(Unit *s, ExecParameters *p);
int unit_fork_helper_process(Unit *u, const char *name, pid_t *ret);
+int unit_fork_and_watch_rm_rf(Unit *u, char **paths, pid_t *ret_pid);
void unit_remove_dependencies(Unit *u, UnitDependencyMask mask);