summaryrefslogtreecommitdiff
path: root/src/load-fragment.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-10-13 02:15:41 +0200
committerLennart Poettering <lennart@poettering.net>2010-10-13 02:15:41 +0200
commit52661efd21608dc7e0ac26b714a9254ed6180ddb (patch)
tree5f64764566711e6a38a664cfc0ee9f9a997e4857 /src/load-fragment.c
parente04aad61bb5eff117e51631727a3ef2807c75d6b (diff)
unit: add minimal condition checker for unit startup
Diffstat (limited to 'src/load-fragment.c')
-rw-r--r--src/load-fragment.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/load-fragment.c b/src/load-fragment.c
index eb9861802b..2b5c8e70dd 100644
--- a/src/load-fragment.c
+++ b/src/load-fragment.c
@@ -1400,6 +1400,67 @@ static int config_parse_ip_tos(
return 0;
}
+static int config_parse_condition_path(
+ const char *filename,
+ unsigned line,
+ const char *section,
+ const char *lvalue,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
+
+ Unit *u = data;
+ bool negate;
+ Condition *c;
+
+ assert(filename);
+ assert(lvalue);
+ assert(rvalue);
+ assert(data);
+
+ if ((negate = rvalue[0] == '!'))
+ rvalue++;
+
+ if (!path_is_absolute(rvalue)) {
+ log_error("[%s:%u] Path in condition not absolute: %s", filename, line, rvalue);
+ return 0;
+ }
+
+ if (!(c = condition_new(CONDITION_PATH_EXISTS, rvalue, negate)))
+ return -ENOMEM;
+
+ LIST_PREPEND(Condition, conditions, u->meta.conditions, c);
+ return 0;
+}
+
+static int config_parse_condition_kernel(
+ const char *filename,
+ unsigned line,
+ const char *section,
+ const char *lvalue,
+ const char *rvalue,
+ void *data,
+ void *userdata) {
+
+ Unit *u = data;
+ bool negate;
+ Condition *c;
+
+ assert(filename);
+ assert(lvalue);
+ assert(rvalue);
+ assert(data);
+
+ if ((negate = rvalue[0] == '!'))
+ rvalue++;
+
+ if (!(c = condition_new(CONDITION_KERNEL_COMMAND_LINE, rvalue, negate)))
+ return -ENOMEM;
+
+ LIST_PREPEND(Condition, conditions, u->meta.conditions, c);
+ return 0;
+}
+
static DEFINE_CONFIG_PARSE_ENUM(config_parse_notify_access, notify_access, NotifyAccess, "Failed to parse notify access specifier");
#define FOLLOW_MAX 8
@@ -1571,6 +1632,8 @@ static void dump_items(FILE *f, const ConfigItem *items) {
{ config_parse_path_unit, "UNIT" },
{ config_parse_notify_access, "ACCESS" },
{ config_parse_ip_tos, "TOS" },
+ { config_parse_condition_path, "CONDITION" },
+ { config_parse_condition_kernel, "CONDITION" },
};
assert(f);
@@ -1692,6 +1755,8 @@ static int load_from_path(Unit *u, const char *path) {
{ "DefaultDependencies", config_parse_bool, &u->meta.default_dependencies, "Unit" },
{ "IgnoreDependencyFailure",config_parse_bool, &u->meta.ignore_dependency_failure, "Unit" },
{ "JobTimeoutSec", config_parse_usec, &u->meta.job_timeout, "Unit" },
+ { "ConditionPathExists", config_parse_condition_path, u, "Unit" },
+ { "ConditionKernelCommandLine", config_parse_condition_kernel, u, "Unit" },
{ "PIDFile", config_parse_path, &u->service.pid_file, "Service" },
{ "ExecStartPre", config_parse_exec, u->service.exec_command+SERVICE_EXEC_START_PRE, "Service" },