chiark / gitweb /
unit: introduce ConditionDirectoryNotEmpty=
authorLennart Poettering <lennart@poettering.net>
Mon, 15 Nov 2010 19:06:49 +0000 (20:06 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 15 Nov 2010 21:13:25 +0000 (22:13 +0100)
man/systemd.unit.xml
src/condition.c
src/condition.h
src/load-fragment.c
src/path.c

index 39862cf..b29473a 100644 (file)
 
                         <varlistentry>
                                 <term><varname>ConditionPathExists=</varname></term>
+                                <term><varname>ConditionDirectoryNotEmpty=</varname></term>
                                 <term><varname>ConditionKernelCommandLine=</varname></term>
                                 <term><varname>ConditionNull=</varname></term>
 
                                 is prefixed with an exclamation mark
                                 (!), the test is negated, and the unit
                                 only started if the path does not
-                                exist. Similarly
+                                exist. <varname>ConditionDirectoryNotEmpty=</varname>
+                                is similar to
+                                <varname>ConditionPathExists=</varname>
+                                but verifies whether a cetrain path is
+                                exists and is a non-empty
+                                directory. Similarly
                                 <varname>ConditionKernelCommandLine=</varname>
                                 may be used to check whether a
                                 specific kernel command line option is
index 4bbd4db..21da2eb 100644 (file)
@@ -106,6 +106,13 @@ bool condition_test(Condition *c) {
         case CONDITION_PATH_EXISTS:
                 return (access(c->parameter, F_OK) >= 0) == !c->negate;
 
+        case CONDITION_DIRECTORY_NOT_EMPTY: {
+                int k;
+
+                k = dir_is_empty(c->parameter);
+                return !(k == -ENOENT || k > 0) == !c->negate;
+        }
+
         case CONDITION_KERNEL_COMMAND_LINE:
                 return !!test_kernel_command_line(c->parameter) == !c->negate;
 
index b9d3f34..2f2689c 100644 (file)
@@ -28,6 +28,7 @@
 
 typedef enum ConditionType {
         CONDITION_PATH_EXISTS,
+        CONDITION_DIRECTORY_NOT_EMPTY,
         CONDITION_KERNEL_COMMAND_LINE,
         CONDITION_NULL,
         _CONDITION_TYPE_MAX,
index 9b39d91..1b23205 100644 (file)
@@ -1448,7 +1448,8 @@ static int config_parse_condition_path(
                 return 0;
         }
 
-        if (!(c = condition_new(CONDITION_PATH_EXISTS, rvalue, negate)))
+        if (!(c = condition_new(streq(lvalue, "ConditionPathExists") ? CONDITION_PATH_EXISTS : CONDITION_DIRECTORY_NOT_EMPTY,
+                                rvalue, negate)))
                 return -ENOMEM;
 
         LIST_PREPEND(Condition, conditions, u->meta.conditions, c);
@@ -1815,6 +1816,7 @@ static int load_from_path(Unit *u, const char *path) {
                 { "DefaultDependencies",    config_parse_bool,            &u->meta.default_dependencies,                   "Unit"    },
                 { "JobTimeoutSec",          config_parse_usec,            &u->meta.job_timeout,                            "Unit"    },
                 { "ConditionPathExists",    config_parse_condition_path,  u,                                               "Unit"    },
+                { "ConditionDirectoryNotEmpty", config_parse_condition_path,  u,                                           "Unit"    },
                 { "ConditionKernelCommandLine", config_parse_condition_kernel, u,                                          "Unit"    },
                 { "ConditionNull",          config_parse_condition_null,  u,                                               "Unit"    },
 
index f4a0a28..a8b1072 100644 (file)
@@ -355,9 +355,13 @@ static void path_enter_waiting(Path *p, bool initial, bool recheck) {
                         good = access(s->path, F_OK) >= 0;
                         break;
 
-                case PATH_DIRECTORY_NOT_EMPTY:
-                        good = dir_is_empty(s->path) == 0;
+                case PATH_DIRECTORY_NOT_EMPTY: {
+                        int k;
+
+                        k = dir_is_empty(s->path);
+                        good = !(k == -ENOENT || k > 0);
                         break;
+                }
 
                 case PATH_CHANGED: {
                         bool b;