2020-11-09 05:23:58 +01:00
|
|
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
2014-02-20 19:26:54 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#include "list.h"
|
|
|
|
#include "macro.h"
|
|
|
|
|
|
|
|
typedef enum ConditionType {
|
2014-11-06 13:56:22 +01:00
|
|
|
CONDITION_ARCHITECTURE,
|
|
|
|
CONDITION_VIRTUALIZATION,
|
|
|
|
CONDITION_HOST,
|
|
|
|
CONDITION_KERNEL_COMMAND_LINE,
|
core,udev,networkd: add ConditionKernelVersion=
This adds a simple condition/assert/match to the service manager, to
udev's .link handling and to networkd, for matching the kernel version
string.
In this version we only do fnmatch() based globbing, but we might want
to extend that to version comparisons later on, if we like, by slightly
extending the syntax with ">=", "<=", ">", "<" and "==" expressions.
2017-12-13 20:34:13 +01:00
|
|
|
CONDITION_KERNEL_VERSION,
|
2014-11-06 13:56:22 +01:00
|
|
|
CONDITION_SECURITY,
|
|
|
|
CONDITION_CAPABILITY,
|
|
|
|
CONDITION_AC_POWER,
|
2019-03-18 17:44:18 +01:00
|
|
|
CONDITION_MEMORY,
|
|
|
|
CONDITION_CPUS,
|
2020-05-14 19:13:03 +02:00
|
|
|
CONDITION_ENVIRONMENT,
|
2014-11-06 13:56:22 +01:00
|
|
|
|
|
|
|
CONDITION_NEEDS_UPDATE,
|
|
|
|
CONDITION_FIRST_BOOT,
|
2014-11-06 13:43:45 +01:00
|
|
|
|
2014-02-20 19:26:54 +01:00
|
|
|
CONDITION_PATH_EXISTS,
|
|
|
|
CONDITION_PATH_EXISTS_GLOB,
|
|
|
|
CONDITION_PATH_IS_DIRECTORY,
|
|
|
|
CONDITION_PATH_IS_SYMBOLIC_LINK,
|
|
|
|
CONDITION_PATH_IS_MOUNT_POINT,
|
|
|
|
CONDITION_PATH_IS_READ_WRITE,
|
2020-05-14 18:30:23 +02:00
|
|
|
CONDITION_PATH_IS_ENCRYPTED,
|
2014-02-20 19:26:54 +01:00
|
|
|
CONDITION_DIRECTORY_NOT_EMPTY,
|
|
|
|
CONDITION_FILE_NOT_EMPTY,
|
|
|
|
CONDITION_FILE_IS_EXECUTABLE,
|
2014-11-06 13:43:45 +01:00
|
|
|
|
2017-04-09 01:32:13 +02:00
|
|
|
CONDITION_USER,
|
|
|
|
CONDITION_GROUP,
|
|
|
|
|
2017-12-18 08:53:29 +01:00
|
|
|
CONDITION_CONTROL_GROUP_CONTROLLER,
|
|
|
|
|
2014-02-20 19:26:54 +01:00
|
|
|
_CONDITION_TYPE_MAX,
|
|
|
|
_CONDITION_TYPE_INVALID = -1
|
|
|
|
} ConditionType;
|
|
|
|
|
2014-11-06 02:27:10 +01:00
|
|
|
typedef enum ConditionResult {
|
|
|
|
CONDITION_UNTESTED,
|
|
|
|
CONDITION_SUCCEEDED,
|
|
|
|
CONDITION_FAILED,
|
|
|
|
CONDITION_ERROR,
|
|
|
|
_CONDITION_RESULT_MAX,
|
|
|
|
_CONDITION_RESULT_INVALID = -1
|
|
|
|
} ConditionResult;
|
2014-11-06 00:49:44 +01:00
|
|
|
|
2014-02-20 19:26:54 +01:00
|
|
|
typedef struct Condition {
|
2014-11-06 13:43:45 +01:00
|
|
|
ConditionType type:8;
|
2014-02-20 19:26:54 +01:00
|
|
|
|
|
|
|
bool trigger:1;
|
|
|
|
bool negate:1;
|
|
|
|
|
2014-11-06 13:43:45 +01:00
|
|
|
ConditionResult result:6;
|
|
|
|
|
2014-02-20 19:26:54 +01:00
|
|
|
char *parameter;
|
|
|
|
|
|
|
|
LIST_FIELDS(struct Condition, conditions);
|
|
|
|
} Condition;
|
|
|
|
|
|
|
|
Condition* condition_new(ConditionType type, const char *parameter, bool trigger, bool negate);
|
2020-05-14 18:43:46 +02:00
|
|
|
Condition* condition_free(Condition *c);
|
2019-03-08 07:20:01 +01:00
|
|
|
Condition* condition_free_list_type(Condition *first, ConditionType type);
|
|
|
|
static inline Condition* condition_free_list(Condition *first) {
|
|
|
|
return condition_free_list_type(first, _CONDITION_TYPE_INVALID);
|
|
|
|
}
|
2014-02-20 19:26:54 +01:00
|
|
|
|
2020-05-14 19:13:03 +02:00
|
|
|
int condition_test(Condition *c, char **env);
|
2020-05-14 18:40:16 +02:00
|
|
|
|
2019-03-08 06:22:31 +01:00
|
|
|
typedef int (*condition_test_logger_t)(void *userdata, int level, int error, const char *file, int line, const char *func, const char *format, ...) _printf_(7, 8);
|
2020-05-14 19:13:03 +02:00
|
|
|
typedef const char* (*condition_to_string_t)(ConditionType t) _const_;
|
|
|
|
bool condition_test_list(Condition *first, char **env, condition_to_string_t to_string, condition_test_logger_t logger, void *userdata);
|
2014-11-06 01:40:37 +01:00
|
|
|
|
2020-05-14 18:40:16 +02:00
|
|
|
void condition_dump(Condition *c, FILE *f, const char *prefix, condition_to_string_t to_string);
|
|
|
|
void condition_dump_list(Condition *c, FILE *f, const char *prefix, condition_to_string_t to_string);
|
2014-02-20 19:26:54 +01:00
|
|
|
|
|
|
|
const char* condition_type_to_string(ConditionType t) _const_;
|
2014-11-06 13:43:45 +01:00
|
|
|
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_;
|
2014-11-06 02:27:10 +01:00
|
|
|
|
|
|
|
const char* condition_result_to_string(ConditionResult r) _const_;
|
|
|
|
ConditionResult condition_result_from_string(const char *s) _pure_;
|
2017-12-29 09:04:23 +01:00
|
|
|
|
|
|
|
static inline bool condition_takes_path(ConditionType t) {
|
|
|
|
return IN_SET(t,
|
|
|
|
CONDITION_PATH_EXISTS,
|
|
|
|
CONDITION_PATH_EXISTS_GLOB,
|
|
|
|
CONDITION_PATH_IS_DIRECTORY,
|
|
|
|
CONDITION_PATH_IS_SYMBOLIC_LINK,
|
|
|
|
CONDITION_PATH_IS_MOUNT_POINT,
|
|
|
|
CONDITION_PATH_IS_READ_WRITE,
|
2020-05-14 18:30:23 +02:00
|
|
|
CONDITION_PATH_IS_ENCRYPTED,
|
2017-12-29 09:04:23 +01:00
|
|
|
CONDITION_DIRECTORY_NOT_EMPTY,
|
|
|
|
CONDITION_FILE_NOT_EMPTY,
|
|
|
|
CONDITION_FILE_IS_EXECUTABLE,
|
|
|
|
CONDITION_NEEDS_UPDATE);
|
|
|
|
}
|