mirror of
https://github.com/systemd/systemd.git
synced 2024-11-02 19:21:53 +03:00
condition: record test state internally and beef it up to be a full enum
This commit is contained in:
parent
b80ba1da1c
commit
cc50ef134b
@ -53,11 +53,9 @@ bool condition_test_list(const char *unit, Condition *first) {
|
||||
c->trigger ? "|" : "",
|
||||
c->negate ? "!" : "",
|
||||
c->parameter,
|
||||
r > 0 ? "succeeded" : "failed",
|
||||
condition_result_to_string(c->result),
|
||||
unit);
|
||||
|
||||
c->state = r > 0 ? CONDITION_STATE_SUCCEEDED : CONDITION_STATE_FAILED;
|
||||
|
||||
if (!c->trigger && r <= 0)
|
||||
return false;
|
||||
|
||||
|
@ -328,10 +328,16 @@ static int property_get_conditions(
|
||||
return r;
|
||||
|
||||
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)",
|
||||
condition_type_to_string(c->type),
|
||||
c->trigger, c->negate,
|
||||
c->parameter, c->state);
|
||||
c->parameter, tristate);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
@ -429,17 +429,22 @@ int condition_test(Condition *c) {
|
||||
[CONDITION_FIRST_BOOT] = condition_test_first_boot,
|
||||
[CONDITION_NULL] = condition_test_null,
|
||||
};
|
||||
int r;
|
||||
|
||||
int r, b;
|
||||
|
||||
assert(c);
|
||||
assert(c->type >= 0);
|
||||
assert(c->type < _CONDITION_TYPE_MAX);
|
||||
|
||||
r = condition_tests[c->type](c);
|
||||
if (r < 0)
|
||||
if (r < 0) {
|
||||
c->result = CONDITION_ERROR;
|
||||
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) {
|
||||
@ -456,7 +461,7 @@ void condition_dump(Condition *c, FILE *f, const char *prefix) {
|
||||
c->trigger ? "|" : "",
|
||||
c->negate ? "!" : "",
|
||||
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) {
|
||||
@ -489,3 +494,12 @@ static const char* const condition_type_table[_CONDITION_TYPE_MAX] = {
|
||||
};
|
||||
|
||||
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);
|
||||
|
@ -51,15 +51,14 @@ typedef enum ConditionType {
|
||||
_CONDITION_TYPE_INVALID = -1
|
||||
} ConditionType;
|
||||
|
||||
#define CONDITION_STATE_IS_SUCCEEDED(state) ((state) > 0)
|
||||
#define CONDITION_STATE_IS_UNKNOWN(state) ((state) == 0)
|
||||
#define CONDITION_STATE_IS_FAILED(state) ((state) < 0)
|
||||
|
||||
enum {
|
||||
CONDITION_STATE_SUCCEEDED = -1,
|
||||
CONDITION_STATE_UNKNOWN = 0,
|
||||
CONDITION_STATE_FAILED = 1
|
||||
};
|
||||
typedef enum ConditionResult {
|
||||
CONDITION_UNTESTED,
|
||||
CONDITION_SUCCEEDED,
|
||||
CONDITION_FAILED,
|
||||
CONDITION_ERROR,
|
||||
_CONDITION_RESULT_MAX,
|
||||
_CONDITION_RESULT_INVALID = -1
|
||||
} ConditionResult;
|
||||
|
||||
typedef struct Condition {
|
||||
ConditionType type;
|
||||
@ -68,7 +67,7 @@ typedef struct Condition {
|
||||
bool negate:1;
|
||||
|
||||
char *parameter;
|
||||
int state;
|
||||
ConditionResult result;
|
||||
|
||||
LIST_FIELDS(struct Condition, conditions);
|
||||
} 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_;
|
||||
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_;
|
||||
|
Loading…
Reference in New Issue
Block a user