chiark / gitweb /
path: optionally, create watched directories in .path units
[elogind.git] / src / load-fragment.c
index 05d858e86a74e9a57f51b58f5b80f02437e3f754..aac27b56ed7088b4b0fd340dc01e8726be32398d 100644 (file)
@@ -30,6 +30,8 @@
 #include <sys/mount.h>
 #include <linux/fs.h>
 #include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/resource.h>
 
 #include "unit.h"
 #include "strv.h"
@@ -965,7 +967,9 @@ static int config_parse_limit(
         assert(rvalue);
         assert(data);
 
-        if (safe_atollu(rvalue, &u) < 0) {
+        if (streq(rvalue, "infinity"))
+                u = (unsigned long long) RLIM_INFINITY;
+        else if (safe_atollu(rvalue, &u) < 0) {
                 log_error("[%s:%u] Failed to parse resource value, ignoring: %s", filename, line, rvalue);
                 return 0;
         }
@@ -1479,39 +1483,7 @@ static int config_parse_condition_path(
         return 0;
 }
 
-static int config_parse_condition_kernel(
-                const char *filename,
-                unsigned line,
-                const char *section,
-                const char *lvalue,
-                int ltype,
-                const char *rvalue,
-                void *data,
-                void *userdata) {
-
-        Unit *u = data;
-        bool trigger, negate;
-        Condition *c;
-
-        assert(filename);
-        assert(lvalue);
-        assert(rvalue);
-        assert(data);
-
-        if ((trigger = rvalue[0] == '|'))
-                rvalue++;
-
-        if ((negate = rvalue[0] == '!'))
-                rvalue++;
-
-        if (!(c = condition_new(CONDITION_KERNEL_COMMAND_LINE, rvalue, trigger, negate)))
-                return -ENOMEM;
-
-        LIST_PREPEND(Condition, conditions, u->meta.conditions, c);
-        return 0;
-}
-
-static int config_parse_condition_virt(
+static int config_parse_condition_string(
                 const char *filename,
                 unsigned line,
                 const char *section,
@@ -1521,6 +1493,7 @@ static int config_parse_condition_virt(
                 void *data,
                 void *userdata) {
 
+        ConditionType cond = ltype;
         Unit *u = data;
         bool trigger, negate;
         Condition *c;
@@ -1536,7 +1509,7 @@ static int config_parse_condition_virt(
         if ((negate = rvalue[0] == '!'))
                 rvalue++;
 
-        if (!(c = condition_new(CONDITION_VIRTUALIZATION, rvalue, trigger, negate)))
+        if (!(c = condition_new(cond, rvalue, trigger, negate)))
                 return -ENOMEM;
 
         LIST_PREPEND(Condition, conditions, u->meta.conditions, c);
@@ -1756,9 +1729,8 @@ static void dump_items(FILE *f, const ConfigItem *items) {
                 { config_parse_notify_access,    "ACCESS" },
                 { config_parse_ip_tos,           "TOS" },
                 { config_parse_condition_path,   "CONDITION" },
-                { config_parse_condition_kernel, "CONDITION" },
+                { config_parse_condition_string, "CONDITION" },
                 { config_parse_condition_null,   "CONDITION" },
-                { config_parse_condition_virt,   "CONDITION" },
         };
 
         assert(f);
@@ -1879,12 +1851,14 @@ static int load_from_path(Unit *u, const char *path) {
                 { "RefuseManualStop",       config_parse_bool,            0, &u->meta.refuse_manual_stop,                     "Unit"    },
                 { "AllowIsolate",           config_parse_bool,            0, &u->meta.allow_isolate,                          "Unit"    },
                 { "DefaultDependencies",    config_parse_bool,            0, &u->meta.default_dependencies,                   "Unit"    },
+                { "OnFailureIsolate",       config_parse_bool,            0, &u->meta.on_failure_isolate,                     "Unit"    },
                 { "JobTimeoutSec",          config_parse_usec,            0, &u->meta.job_timeout,                            "Unit"    },
                 { "ConditionPathExists",        config_parse_condition_path, CONDITION_PATH_EXISTS, u,                        "Unit"    },
                 { "ConditionPathIsDirectory",   config_parse_condition_path, CONDITION_PATH_IS_DIRECTORY, u,                  "Unit"    },
                 { "ConditionDirectoryNotEmpty", config_parse_condition_path, CONDITION_DIRECTORY_NOT_EMPTY, u,                "Unit"    },
-                { "ConditionKernelCommandLine", config_parse_condition_kernel, 0, u,                                          "Unit"    },
-                { "ConditionVirtualization",config_parse_condition_virt,  0, u,                                               "Unit"    },
+                { "ConditionKernelCommandLine", config_parse_condition_string, CONDITION_KERNEL_COMMAND_LINE, u,              "Unit"    },
+                { "ConditionVirtualization",    config_parse_condition_string, CONDITION_VIRTUALIZATION, u,                   "Unit"    },
+                { "ConditionSecurity",          config_parse_condition_string, CONDITION_SECURITY, u,                         "Unit"    },
                 { "ConditionNull",          config_parse_condition_null,  0, u,                                               "Unit"    },
 
                 { "PIDFile",                config_parse_path,            0, &u->service.pid_file,                            "Service" },
@@ -1970,6 +1944,8 @@ static int load_from_path(Unit *u, const char *path) {
                 { "PathChanged",            config_parse_path_spec,       0, &u->path,                                        "Path"    },
                 { "DirectoryNotEmpty",      config_parse_path_spec,       0, &u->path,                                        "Path"    },
                 { "Unit",                   config_parse_path_unit,       0, &u->path,                                        "Path"    },
+                { "MakeDirectory",          config_parse_bool,            0, &u->path.make_directory,                         "Path"    },
+                { "DirectoryMode",          config_parse_mode,            0, &u->path.directory_mode,                         "Path"    },
 
                 /* The [Install] section is ignored here. */
                 { "Alias",                  NULL,                         0, NULL,                                            "Install" },