diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-08-25 10:57:08 +0200 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-08-28 16:09:54 +0200 |
commit | 810ef3180ead97e678cbf7b1107c6fdb424c95de (patch) | |
tree | 3d5d9dde7e6fc78de32cbe3b4a02af8c31ce2c2d | |
parent | core: move timeout_clean_usec from Service to ExecContext (diff) | |
download | systemd-810ef3180ead97e678cbf7b1107c6fdb424c95de.tar.xz systemd-810ef3180ead97e678cbf7b1107c6fdb424c95de.zip |
core: introduce unit_fork_and_watch_rm_rf()
-rw-r--r-- | src/core/service.c | 26 | ||||
-rw-r--r-- | src/core/unit.c | 34 | ||||
-rw-r--r-- | src/core/unit.h | 1 |
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); |