#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"
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);
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;
#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"
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);
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);