From 59fccdc587bc179c1638916ee16a24099f94f81f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 6 Nov 2014 13:43:45 +0100 Subject: core: introduce the concept of AssertXYZ= similar to ConditionXYZ=, but fatal for a start job if not met --- src/shared/condition-util.c | 32 ++++++++++++++++++++++++++++---- src/shared/condition-util.h | 22 +++++++++++++++------- 2 files changed, 43 insertions(+), 11 deletions(-) (limited to 'src/shared') diff --git a/src/shared/condition-util.c b/src/shared/condition-util.c index 640a931ff5..ee9d11ee87 100644 --- a/src/shared/condition-util.c +++ b/src/shared/condition-util.c @@ -447,7 +447,7 @@ int condition_test(Condition *c) { return b; } -void condition_dump(Condition *c, FILE *f, const char *prefix) { +void condition_dump(Condition *c, FILE *f, const char *prefix, const char *(*to_string)(ConditionType t)) { assert(c); assert(f); @@ -457,18 +457,18 @@ void condition_dump(Condition *c, FILE *f, const char *prefix) { fprintf(f, "%s\t%s: %s%s%s %s\n", prefix, - condition_type_to_string(c->type), + to_string(c->type), c->trigger ? "|" : "", c->negate ? "!" : "", c->parameter, condition_result_to_string(c->result)); } -void condition_dump_list(Condition *first, FILE *f, const char *prefix) { +void condition_dump_list(Condition *first, FILE *f, const char *prefix, const char *(*to_string)(ConditionType t)) { Condition *c; LIST_FOREACH(conditions, c, first) - condition_dump(c, f, prefix); + condition_dump(c, f, prefix, to_string); } static const char* const condition_type_table[_CONDITION_TYPE_MAX] = { @@ -495,6 +495,30 @@ static const char* const condition_type_table[_CONDITION_TYPE_MAX] = { DEFINE_STRING_TABLE_LOOKUP(condition_type, ConditionType); +static const char* const assert_type_table[_CONDITION_TYPE_MAX] = { + [CONDITION_PATH_EXISTS] = "AssertPathExists", + [CONDITION_PATH_EXISTS_GLOB] = "AssertPathExistsGlob", + [CONDITION_PATH_IS_DIRECTORY] = "AssertPathIsDirectory", + [CONDITION_PATH_IS_SYMBOLIC_LINK] = "AssertPathIsSymbolicLink", + [CONDITION_PATH_IS_MOUNT_POINT] = "AssertPathIsMountPoint", + [CONDITION_PATH_IS_READ_WRITE] = "AssertPathIsReadWrite", + [CONDITION_DIRECTORY_NOT_EMPTY] = "AssertDirectoryNotEmpty", + [CONDITION_FILE_NOT_EMPTY] = "AssertFileNotEmpty", + [CONDITION_FILE_IS_EXECUTABLE] = "AssertFileIsExecutable", + [CONDITION_KERNEL_COMMAND_LINE] = "AssertKernelCommandLine", + [CONDITION_VIRTUALIZATION] = "AssertVirtualization", + [CONDITION_SECURITY] = "AssertSecurity", + [CONDITION_CAPABILITY] = "AssertCapability", + [CONDITION_HOST] = "AssertHost", + [CONDITION_AC_POWER] = "AssertACPower", + [CONDITION_ARCHITECTURE] = "AssertArchitecture", + [CONDITION_NEEDS_UPDATE] = "AssertNeedsUpdate", + [CONDITION_FIRST_BOOT] = "AssertFirstBoot", + [CONDITION_NULL] = "AssertNull" +}; + +DEFINE_STRING_TABLE_LOOKUP(assert_type, ConditionType); + static const char* const condition_result_table[_CONDITION_RESULT_MAX] = { [CONDITION_UNTESTED] = "untested", [CONDITION_SUCCEEDED] = "succeeded", diff --git a/src/shared/condition-util.h b/src/shared/condition-util.h index 08aee94a89..9aaaee9091 100644 --- a/src/shared/condition-util.h +++ b/src/shared/condition-util.h @@ -28,6 +28,8 @@ #include "macro.h" typedef enum ConditionType { + CONDITION_NULL, + CONDITION_PATH_EXISTS, CONDITION_PATH_EXISTS_GLOB, CONDITION_PATH_IS_DIRECTORY, @@ -37,16 +39,18 @@ typedef enum ConditionType { CONDITION_DIRECTORY_NOT_EMPTY, CONDITION_FILE_NOT_EMPTY, CONDITION_FILE_IS_EXECUTABLE, + CONDITION_KERNEL_COMMAND_LINE, CONDITION_VIRTUALIZATION, + CONDITION_ARCHITECTURE, CONDITION_SECURITY, CONDITION_CAPABILITY, CONDITION_HOST, CONDITION_AC_POWER, - CONDITION_ARCHITECTURE, + CONDITION_NEEDS_UPDATE, CONDITION_FIRST_BOOT, - CONDITION_NULL, + _CONDITION_TYPE_MAX, _CONDITION_TYPE_INVALID = -1 } ConditionType; @@ -61,13 +65,14 @@ typedef enum ConditionResult { } ConditionResult; typedef struct Condition { - ConditionType type; + ConditionType type:8; bool trigger:1; bool negate:1; + ConditionResult result:6; + char *parameter; - ConditionResult result; LIST_FIELDS(struct Condition, conditions); } Condition; @@ -78,11 +83,14 @@ void condition_free_list(Condition *c); int condition_test(Condition *c); -void condition_dump(Condition *c, FILE *f, const char *prefix); -void condition_dump_list(Condition *c, FILE *f, const char *prefix); +void condition_dump(Condition *c, FILE *f, const char *prefix, const char *(*to_string)(ConditionType t)); +void condition_dump_list(Condition *c, FILE *f, const char *prefix, const char *(*to_string)(ConditionType t)); const char* condition_type_to_string(ConditionType t) _const_; -int condition_type_from_string(const char *s) _pure_; +ConditionType condition_type_from_string(const char *s) _pure_; + +const char* assert_type_to_string(ConditionType t) _const_; +ConditionType assert_type_from_string(const char *s) _pure_; const char* condition_result_to_string(ConditionResult r) _const_; ConditionResult condition_result_from_string(const char *s) _pure_; -- cgit v1.2.3-54-g00ecf