From 36af55d99711e9accdf42d8a7df60e069f4086c0 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 15 Nov 2010 20:06:49 +0100 Subject: [PATCH] unit: introduce ConditionDirectoryNotEmpty= --- man/systemd.unit.xml | 8 +++++++- src/condition.c | 7 +++++++ src/condition.h | 1 + src/load-fragment.c | 4 +++- src/path.c | 8 ++++++-- 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml index 39862cf7c..b29473afa 100644 --- a/man/systemd.unit.xml +++ b/man/systemd.unit.xml @@ -573,6 +573,7 @@ ConditionPathExists= + ConditionDirectoryNotEmpty= ConditionKernelCommandLine= ConditionNull= @@ -594,7 +595,12 @@ is prefixed with an exclamation mark (!), the test is negated, and the unit only started if the path does not - exist. Similarly + exist. ConditionDirectoryNotEmpty= + is similar to + ConditionPathExists= + but verifies whether a cetrain path is + exists and is a non-empty + directory. Similarly ConditionKernelCommandLine= may be used to check whether a specific kernel command line option is diff --git a/src/condition.c b/src/condition.c index 4bbd4dbaf..21da2eb9e 100644 --- a/src/condition.c +++ b/src/condition.c @@ -106,6 +106,13 @@ bool condition_test(Condition *c) { case CONDITION_PATH_EXISTS: return (access(c->parameter, F_OK) >= 0) == !c->negate; + case CONDITION_DIRECTORY_NOT_EMPTY: { + int k; + + k = dir_is_empty(c->parameter); + return !(k == -ENOENT || k > 0) == !c->negate; + } + case CONDITION_KERNEL_COMMAND_LINE: return !!test_kernel_command_line(c->parameter) == !c->negate; diff --git a/src/condition.h b/src/condition.h index b9d3f34ae..2f2689cc6 100644 --- a/src/condition.h +++ b/src/condition.h @@ -28,6 +28,7 @@ typedef enum ConditionType { CONDITION_PATH_EXISTS, + CONDITION_DIRECTORY_NOT_EMPTY, CONDITION_KERNEL_COMMAND_LINE, CONDITION_NULL, _CONDITION_TYPE_MAX, diff --git a/src/load-fragment.c b/src/load-fragment.c index 9b39d9161..1b23205a2 100644 --- a/src/load-fragment.c +++ b/src/load-fragment.c @@ -1448,7 +1448,8 @@ static int config_parse_condition_path( return 0; } - if (!(c = condition_new(CONDITION_PATH_EXISTS, rvalue, negate))) + if (!(c = condition_new(streq(lvalue, "ConditionPathExists") ? CONDITION_PATH_EXISTS : CONDITION_DIRECTORY_NOT_EMPTY, + rvalue, negate))) return -ENOMEM; LIST_PREPEND(Condition, conditions, u->meta.conditions, c); @@ -1815,6 +1816,7 @@ static int load_from_path(Unit *u, const char *path) { { "DefaultDependencies", config_parse_bool, &u->meta.default_dependencies, "Unit" }, { "JobTimeoutSec", config_parse_usec, &u->meta.job_timeout, "Unit" }, { "ConditionPathExists", config_parse_condition_path, u, "Unit" }, + { "ConditionDirectoryNotEmpty", config_parse_condition_path, u, "Unit" }, { "ConditionKernelCommandLine", config_parse_condition_kernel, u, "Unit" }, { "ConditionNull", config_parse_condition_null, u, "Unit" }, diff --git a/src/path.c b/src/path.c index f4a0a288b..a8b107244 100644 --- a/src/path.c +++ b/src/path.c @@ -355,9 +355,13 @@ static void path_enter_waiting(Path *p, bool initial, bool recheck) { good = access(s->path, F_OK) >= 0; break; - case PATH_DIRECTORY_NOT_EMPTY: - good = dir_is_empty(s->path) == 0; + case PATH_DIRECTORY_NOT_EMPTY: { + int k; + + k = dir_is_empty(s->path); + good = !(k == -ENOENT || k > 0); break; + } case PATH_CHANGED: { bool b; -- 2.30.2