unit: introduce ConditionVirtualization=
This commit is contained in:
@@ -64,6 +64,8 @@ static bool test_kernel_command_line(const char *parameter) {
|
||||
size_t l, pl;
|
||||
bool found = false;
|
||||
|
||||
assert(parameter);
|
||||
|
||||
if ((r = read_one_line_file("/proc/cmdline", &line)) < 0) {
|
||||
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
|
||||
return false;
|
||||
@@ -98,6 +100,28 @@ static bool test_kernel_command_line(const char *parameter) {
|
||||
return found;
|
||||
}
|
||||
|
||||
static bool test_virtualization(const char *parameter) {
|
||||
int r, b;
|
||||
const char *id;
|
||||
|
||||
assert(parameter);
|
||||
|
||||
if ((r = detect_virtualization(&id)) < 0) {
|
||||
log_warning("Failed to detect virtualization, ignoring: %s", strerror(-r));
|
||||
return false;
|
||||
}
|
||||
|
||||
b = parse_boolean(parameter);
|
||||
|
||||
if (r > 0 && b > 0)
|
||||
return true;
|
||||
|
||||
if (r == 0 && b == 0)
|
||||
return true;
|
||||
|
||||
return streq(parameter, id);
|
||||
}
|
||||
|
||||
bool condition_test(Condition *c) {
|
||||
assert(c);
|
||||
|
||||
@@ -116,6 +140,9 @@ bool condition_test(Condition *c) {
|
||||
case CONDITION_KERNEL_COMMAND_LINE:
|
||||
return !!test_kernel_command_line(c->parameter) == !c->negate;
|
||||
|
||||
case CONDITION_VIRTUALIZATION:
|
||||
return !!test_virtualization(c->parameter) == !c->negate;
|
||||
|
||||
case CONDITION_NULL:
|
||||
return !c->negate;
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ typedef enum ConditionType {
|
||||
CONDITION_PATH_EXISTS,
|
||||
CONDITION_DIRECTORY_NOT_EMPTY,
|
||||
CONDITION_KERNEL_COMMAND_LINE,
|
||||
CONDITION_VIRTUALIZATION,
|
||||
CONDITION_NULL,
|
||||
_CONDITION_TYPE_MAX,
|
||||
_CONDITION_TYPE_INVALID = -1
|
||||
|
||||
@@ -1503,6 +1503,34 @@ static int config_parse_condition_kernel(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int config_parse_condition_virt(
|
||||
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_VIRTUALIZATION, rvalue, negate)))
|
||||
return -ENOMEM;
|
||||
|
||||
LIST_PREPEND(Condition, conditions, u->meta.conditions, c);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int config_parse_condition_null(
|
||||
const char *filename,
|
||||
unsigned line,
|
||||
@@ -1714,6 +1742,7 @@ static void dump_items(FILE *f, const ConfigItem *items) {
|
||||
{ config_parse_condition_path, "CONDITION" },
|
||||
{ config_parse_condition_kernel, "CONDITION" },
|
||||
{ config_parse_condition_null, "CONDITION" },
|
||||
{ config_parse_condition_virt, "CONDITION" },
|
||||
};
|
||||
|
||||
assert(f);
|
||||
@@ -1838,6 +1867,7 @@ static int load_from_path(Unit *u, const char *path) {
|
||||
{ "ConditionPathExists", config_parse_condition_path, u, "Unit" },
|
||||
{ "ConditionDirectoryNotEmpty", config_parse_condition_path, u, "Unit" },
|
||||
{ "ConditionKernelCommandLine", config_parse_condition_kernel, u, "Unit" },
|
||||
{ "ConditionVirtualization",config_parse_condition_virt, u, "Unit" },
|
||||
{ "ConditionNull", config_parse_condition_null, u, "Unit" },
|
||||
|
||||
{ "PIDFile", config_parse_path, &u->service.pid_file, "Service" },
|
||||
|
||||
Reference in New Issue
Block a user