X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fcondition.c;h=4aa5530c3645b8ba7ddc9f01789d7e73182da366;hp=5d44039e5d24cd07c3e94ad2e49f1a3629b88578;hb=80f53eb59516f87e26e3afa405c61b4eed9ffe30;hpb=3d9a412243035beeaaf3465a62065444a5adf21c diff --git a/src/core/condition.c b/src/core/condition.c index 5d44039e5..4aa5530c3 100644 --- a/src/core/condition.c +++ b/src/core/condition.c @@ -25,14 +25,18 @@ #include #include #include +#include #ifdef HAVE_SELINUX #include #endif +#include #include "util.h" #include "condition.h" #include "virt.h" +#include "path-util.h" +#include "fileio.h" Condition* condition_new(ConditionType type, const char *parameter, bool trigger, bool negate) { Condition *c; @@ -158,6 +162,8 @@ static bool test_security(const char *parameter) { if (streq(parameter, "selinux")) return is_selinux_enabled() > 0; #endif + if (streq(parameter, "apparmor")) + return access("/sys/kernel/security/apparmor/", F_OK) == 0; return false; } @@ -193,6 +199,41 @@ static bool test_capability(const char *parameter) { return !!(capabilities & (1ULL << value)); } +static bool test_host(const char *parameter) { + sd_id128_t x, y; + char *h; + int r; + bool b; + + if (sd_id128_from_string(parameter, &x) >= 0) { + + r = sd_id128_get_machine(&y); + if (r < 0) + return false; + + return sd_id128_equal(x, y); + } + + h = gethostname_malloc(); + if (!h) + return false; + + b = fnmatch(parameter, h, FNM_CASEFOLD) == 0; + free(h); + + return b; +} + +static bool test_ac_power(const char *parameter) { + int r; + + r = parse_boolean(parameter); + if (r < 0) + return true; + + return (on_ac_power() != 0) == !!r; +} + bool condition_test(Condition *c) { assert(c); @@ -233,6 +274,15 @@ bool condition_test(Condition *c) { return !(k == -ENOENT || k > 0) == !c->negate; } + case CONDITION_FILE_NOT_EMPTY: { + struct stat st; + + if (stat(c->parameter, &st) < 0) + return c->negate; + + return (S_ISREG(st.st_mode) && st.st_size > 0) == !c->negate; + } + case CONDITION_FILE_IS_EXECUTABLE: { struct stat st; @@ -254,6 +304,12 @@ bool condition_test(Condition *c) { case CONDITION_CAPABILITY: return test_capability(c->parameter) == !c->negate; + case CONDITION_HOST: + return test_host(c->parameter) == !c->negate; + + case CONDITION_AC_POWER: + return test_ac_power(c->parameter) == !c->negate; + case CONDITION_NULL: return !c->negate; @@ -319,9 +375,12 @@ static const char* const condition_type_table[_CONDITION_TYPE_MAX] = { [CONDITION_PATH_IS_MOUNT_POINT] = "ConditionPathIsMountPoint", [CONDITION_PATH_IS_READ_WRITE] = "ConditionPathIsReadWrite", [CONDITION_DIRECTORY_NOT_EMPTY] = "ConditionDirectoryNotEmpty", + [CONDITION_FILE_NOT_EMPTY] = "ConditionFileNotEmpty", [CONDITION_KERNEL_COMMAND_LINE] = "ConditionKernelCommandLine", [CONDITION_VIRTUALIZATION] = "ConditionVirtualization", [CONDITION_SECURITY] = "ConditionSecurity", + [CONDITION_HOST] = "ConditionHost", + [CONDITION_AC_POWER] = "ConditionACPower", [CONDITION_NULL] = "ConditionNull" };