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:
parent
b80ba1da1c
commit
cc50ef134b
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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_;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user