m->exec_runtime = exec_runtime_destroy(m->exec_runtime);
- unit_destroy_runtime_data(UNIT(m), &m->exec_context);
+ unit_destroy_runtime_data(UNIT(m), &m->exec_context, /* destroy_runtime_dir = */ true);
unit_unref_uid_gid(UNIT(m), true);
}
if (start_only)
- unit_destroy_runtime_data(u, &s->exec_context);
+ unit_destroy_runtime_data(u, &s->exec_context, /* destroy_runtime_dir = */ false);
}
if (old_state != state)
s->exec_runtime = exec_runtime_destroy(s->exec_runtime);
/* Also, remove the runtime directory */
- unit_destroy_runtime_data(UNIT(s), &s->exec_context);
+ unit_destroy_runtime_data(UNIT(s), &s->exec_context, /* destroy_runtime_dir = */ true);
/* Also get rid of the fd store, if that's configured. */
if (s->fd_store_preserve_mode == EXEC_PRESERVE_NO)
s->exec_runtime = exec_runtime_destroy(s->exec_runtime);
- unit_destroy_runtime_data(UNIT(s), &s->exec_context);
+ unit_destroy_runtime_data(UNIT(s), &s->exec_context, /* destroy_runtime_dir = */ true);
unit_unref_uid_gid(UNIT(s), true);
}
s->exec_runtime = exec_runtime_destroy(s->exec_runtime);
- unit_destroy_runtime_data(UNIT(s), &s->exec_context);
+ unit_destroy_runtime_data(UNIT(s), &s->exec_context, /* destroy_runtime_dir = */ true);
unit_unref_uid_gid(UNIT(s), true);
}
return 0;
}
-void unit_destroy_runtime_data(Unit *u, const ExecContext *context) {
+void unit_destroy_runtime_data(Unit *u, const ExecContext *context, bool destroy_runtime_dir) {
assert(u);
assert(u->manager);
assert(context);
/* EXEC_PRESERVE_RESTART is handled via unit_release_resources()! */
- if (context->runtime_directory_preserve_mode == EXEC_PRESERVE_NO)
+ if (destroy_runtime_dir && context->runtime_directory_preserve_mode == EXEC_PRESERVE_NO)
exec_context_destroy_runtime_directory(context, u->manager->prefix[EXEC_DIRECTORY_RUNTIME]);
exec_context_destroy_credentials(context, u->manager->prefix[EXEC_DIRECTORY_RUNTIME], u->id);
int unit_test_trigger_loaded(Unit *u);
-void unit_destroy_runtime_data(Unit *u, const ExecContext *context);
+void unit_destroy_runtime_data(Unit *u, const ExecContext *context, bool destroy_runtime_dir);
int unit_clean(Unit *u, ExecCleanMask mask);
int unit_can_clean(Unit *u, ExecCleanMask *ret_mask);
set -eux
set -o pipefail
-# Test RuntimeDirectoryPreserve=yes
-
at_exit() {
set +e
trap at_exit EXIT
+# RuntimeDirectory= should be preserved for oneshot units if RemainAfterExit=yes
+
+systemd-run --service-type=oneshot --remain-after-exit \
+ -u TEST-23-remain-after-exit.service \
+ -p RuntimeDirectory=TEST-23-remain-after-exit \
+ true
+
+[[ -d /run/TEST-23-remain-after-exit ]]
+
+systemctl stop TEST-23-remain-after-exit.service
+
+[[ ! -e /run/TEST-23-remain-after-exit ]]
+
+# Test RuntimeDirectoryPreserve=yes
+
systemd-mount -p RuntimeDirectory=hoge -p RuntimeDirectoryPreserve=yes -t tmpfs tmpfs /tmp/aaa
touch /run/hoge/foo