chiark / gitweb /
journal: replace linked list by hashmap when merging files
[elogind.git] / src / condition.c
index f84c81bd811cd48d2b8abbbf5424bd697a6f7db2..e9786567726f6437698e7e554472d3ba3fd81d87 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "util.h"
 #include "condition.h"
+#include "virt.h"
 
 Condition* condition_new(ConditionType type, const char *parameter, bool trigger, bool negate) {
         Condition *c;
@@ -118,25 +119,35 @@ static bool test_kernel_command_line(const char *parameter) {
 }
 
 static bool test_virtualization(const char *parameter) {
-        int r, b;
+        int b;
+        Virtualization v;
         const char *id;
 
         assert(parameter);
 
-        r = detect_virtualization(&id);
-        if (r < 0) {
-                log_warning("Failed to detect virtualization, ignoring: %s", strerror(-r));
+        v = detect_virtualization(&id);
+        if (v < 0) {
+                log_warning("Failed to detect virtualization, ignoring: %s", strerror(-v));
                 return false;
         }
 
+        /* First, compare with yes/no */
         b = parse_boolean(parameter);
 
-        if (r > 0 && b > 0)
+        if (v > 0 && b > 0)
+                return true;
+
+        if (v == 0 && b == 0)
+                return true;
+
+        /* Then, compare categorization */
+        if (v == VIRTUALIZATION_VM && streq(parameter, "vm"))
                 return true;
 
-        if (r == 0 && b == 0)
+        if (v == VIRTUALIZATION_CONTAINER && streq(parameter, "container"))
                 return true;
 
+        /* Finally compare id */
         return streq(parameter, id);
 }
 
@@ -163,7 +174,7 @@ bool condition_test(Condition *c) {
                 struct stat st;
 
                 if (stat(c->parameter, &st) < 0)
-                        return !c->negate;
+                        return c->negate;
                 return S_ISDIR(st.st_mode) == !c->negate;
         }
 
@@ -171,7 +182,7 @@ bool condition_test(Condition *c) {
                 struct stat st;
 
                 if (lstat(c->parameter, &st) < 0)
-                        return !c->negate;
+                        return c->negate;
                 return S_ISLNK(st.st_mode) == !c->negate;
         }
 
@@ -189,7 +200,7 @@ bool condition_test(Condition *c) {
                 struct stat st;
 
                 if (stat(c->parameter, &st) < 0)
-                        return !c->negate;
+                        return c->negate;
 
                 return (S_ISREG(st.st_mode) && (st.st_mode & 0111)) == !c->negate;
         }