1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-09 12:58:26 +03:00

condition: record test state internally and beef it up to be a full enum

This commit is contained in:
Lennart Poettering 2014-11-06 02:27:10 +01:00
parent b80ba1da1c
commit cc50ef134b
4 changed files with 38 additions and 18 deletions

View File

@ -53,11 +53,9 @@ bool condition_test_list(const char *unit, Condition *first) {
c->trigger ? "|" : "", c->trigger ? "|" : "",
c->negate ? "!" : "", c->negate ? "!" : "",
c->parameter, c->parameter,
r > 0 ? "succeeded" : "failed", condition_result_to_string(c->result),
unit); unit);
c->state = r > 0 ? CONDITION_STATE_SUCCEEDED : CONDITION_STATE_FAILED;
if (!c->trigger && r <= 0) if (!c->trigger && r <= 0)
return false; return false;

View File

@ -328,10 +328,16 @@ static int property_get_conditions(
return r; return r;
LIST_FOREACH(conditions, c, u->conditions) { LIST_FOREACH(conditions, c, u->conditions) {
int tristate;
tristate =
c->result == CONDITION_UNTESTED ? 0 :
c->result == CONDITION_SUCCEEDED ? 1 : -1;
r = sd_bus_message_append(reply, "(sbbsi)", r = sd_bus_message_append(reply, "(sbbsi)",
condition_type_to_string(c->type), condition_type_to_string(c->type),
c->trigger, c->negate, c->trigger, c->negate,
c->parameter, c->state); c->parameter, tristate);
if (r < 0) if (r < 0)
return r; return r;

View File

@ -429,17 +429,22 @@ int condition_test(Condition *c) {
[CONDITION_FIRST_BOOT] = condition_test_first_boot, [CONDITION_FIRST_BOOT] = condition_test_first_boot,
[CONDITION_NULL] = condition_test_null, [CONDITION_NULL] = condition_test_null,
}; };
int r;
int r, b;
assert(c); assert(c);
assert(c->type >= 0); assert(c->type >= 0);
assert(c->type < _CONDITION_TYPE_MAX); assert(c->type < _CONDITION_TYPE_MAX);
r = condition_tests[c->type](c); r = condition_tests[c->type](c);
if (r < 0) if (r < 0) {
c->result = CONDITION_ERROR;
return r; return r;
}
return (r > 0) == !c->negate; b = (r > 0) == !c->negate;
c->result = b ? CONDITION_SUCCEEDED : CONDITION_FAILED;
return b;
} }
void condition_dump(Condition *c, FILE *f, const char *prefix) { void condition_dump(Condition *c, FILE *f, const char *prefix) {
@ -456,7 +461,7 @@ void condition_dump(Condition *c, FILE *f, const char *prefix) {
c->trigger ? "|" : "", c->trigger ? "|" : "",
c->negate ? "!" : "", c->negate ? "!" : "",
c->parameter, c->parameter,
CONDITION_STATE_IS_FAILED(c->state) ? "failed" : CONDITION_STATE_IS_SUCCEEDED(c->state) ? "succeeded" : "untested"); 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) {
@ -489,3 +494,12 @@ static const char* const condition_type_table[_CONDITION_TYPE_MAX] = {
}; };
DEFINE_STRING_TABLE_LOOKUP(condition_type, ConditionType); DEFINE_STRING_TABLE_LOOKUP(condition_type, ConditionType);
static const char* const condition_result_table[_CONDITION_RESULT_MAX] = {
[CONDITION_UNTESTED] = "untested",
[CONDITION_SUCCEEDED] = "succeeded",
[CONDITION_FAILED] = "failed",
[CONDITION_ERROR] = "error",
};
DEFINE_STRING_TABLE_LOOKUP(condition_result, ConditionResult);

View File

@ -51,15 +51,14 @@ typedef enum ConditionType {
_CONDITION_TYPE_INVALID = -1 _CONDITION_TYPE_INVALID = -1
} ConditionType; } ConditionType;
#define CONDITION_STATE_IS_SUCCEEDED(state) ((state) > 0) typedef enum ConditionResult {
#define CONDITION_STATE_IS_UNKNOWN(state) ((state) == 0) CONDITION_UNTESTED,
#define CONDITION_STATE_IS_FAILED(state) ((state) < 0) CONDITION_SUCCEEDED,
CONDITION_FAILED,
enum { CONDITION_ERROR,
CONDITION_STATE_SUCCEEDED = -1, _CONDITION_RESULT_MAX,
CONDITION_STATE_UNKNOWN = 0, _CONDITION_RESULT_INVALID = -1
CONDITION_STATE_FAILED = 1 } ConditionResult;
};
typedef struct Condition { typedef struct Condition {
ConditionType type; ConditionType type;
@ -68,7 +67,7 @@ typedef struct Condition {
bool negate:1; bool negate:1;
char *parameter; char *parameter;
int state; ConditionResult result;
LIST_FIELDS(struct Condition, conditions); LIST_FIELDS(struct Condition, conditions);
} Condition; } Condition;
@ -84,3 +83,6 @@ void condition_dump_list(Condition *c, FILE *f, const char *prefix);
const char* condition_type_to_string(ConditionType t) _const_; const char* condition_type_to_string(ConditionType t) _const_;
int condition_type_from_string(const char *s) _pure_; int condition_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_;