chiark / gitweb /
unit: introduce ConditionFileIsExecutable= and use it where we check for a binary...
authorLennart Poettering <lennart@poettering.net>
Tue, 12 Jul 2011 02:25:02 +0000 (04:25 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 12 Jul 2011 02:25:02 +0000 (04:25 +0200)
TODO
man/systemd.unit.xml
src/condition.c
src/condition.h
src/load-fragment.c
units/fedora/halt-local.service
units/fedora/rc-local.service
units/suse/halt-local.service
units/suse/rc-local.service

diff --git a/TODO b/TODO
index 36a57f4..0d6ac41 100644 (file)
--- a/TODO
+++ b/TODO
@@ -26,8 +26,6 @@ Features:
 
 * possibly apply systemd-sysctl per network device subtrees on hotplug
 
-* add conditions for file executability
-
 * implement Register= switch in .socket units to enable registration
   in Avahi, RPC and other socket registration services.
 
index f482182..d38a001 100644 (file)
                                 <term><varname>ConditionPathExistsGlob=</varname></term>
                                 <term><varname>ConditionPathIsDirectory=</varname></term>
                                 <term><varname>ConditionDirectoryNotEmpty=</varname></term>
+                                <term><varname>ConditionFileIsExecutable=</varname></term>
                                 <term><varname>ConditionKernelCommandLine=</varname></term>
                                 <term><varname>ConditionVirtualization=</varname></term>
                                 <term><varname>ConditionSecurity=</varname></term>
                                 is similar to
                                 <varname>ConditionPathExists=</varname>
                                 but verifies whether a certain path
-                                exists and is a directory.
+                                exists and is a
+                                directory. <varname>ConditionFileIsExecutable=</varname>
+                                is similar to
+                                <varname>ConditionPathExists=</varname>
+                                but verifies whether a certain path
+                                exists, is a regular file and marked
+                                executable.
                                 <varname>ConditionDirectoryNotEmpty=</varname>
                                 is similar to
                                 <varname>ConditionPathExists=</varname>
index 76ee037..f9202f6 100644 (file)
@@ -168,6 +168,15 @@ bool condition_test(Condition *c) {
                 return !(k == -ENOENT || k > 0) == !c->negate;
         }
 
+        case CONDITION_FILE_IS_EXECUTABLE: {
+                struct stat st;
+
+                if (lstat(c->parameter, &st) < 0)
+                        return !c->negate;
+
+                return (S_ISREG(st.st_mode) && (st.st_mode & 0111)) == !c->negate;
+        }
+
         case CONDITION_KERNEL_COMMAND_LINE:
                 return test_kernel_command_line(c->parameter) == !c->negate;
 
index ff896a7..672996e 100644 (file)
@@ -31,6 +31,7 @@ typedef enum ConditionType {
         CONDITION_PATH_EXISTS_GLOB,
         CONDITION_PATH_IS_DIRECTORY,
         CONDITION_DIRECTORY_NOT_EMPTY,
+        CONDITION_FILE_IS_EXECUTABLE,
         CONDITION_KERNEL_COMMAND_LINE,
         CONDITION_VIRTUALIZATION,
         CONDITION_SECURITY,
index 05e60bf..5c1dff6 100644 (file)
@@ -2003,6 +2003,7 @@ static int load_from_path(Unit *u, const char *path) {
                 { "ConditionPathExistsGlob",    config_parse_condition_path,   CONDITION_PATH_EXISTS_GLOB,    u,              "Unit"    },
                 { "ConditionPathIsDirectory",   config_parse_condition_path,   CONDITION_PATH_IS_DIRECTORY,   u,              "Unit"    },
                 { "ConditionDirectoryNotEmpty", config_parse_condition_path,   CONDITION_DIRECTORY_NOT_EMPTY, u,              "Unit"    },
+                { "ConditionFileIsExecutable",  config_parse_condition_path,   CONDITION_FILE_IS_EXECUTABLE,  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"    },
index 79f8f12..a9f6feb 100644 (file)
@@ -7,7 +7,7 @@
 
 [Unit]
 Description=/sbin/halt.local Compatibility
-ConditionPathExists=/sbin/halt.local
+ConditionFileIsExecutable=/sbin/halt.local
 DefaultDependencies=no
 After=shutdown.target
 Before=final.target
index 8c0b200..f5f940f 100644 (file)
@@ -7,7 +7,7 @@
 
 [Unit]
 Description=/etc/rc.local Compatibility
-ConditionPathExists=/etc/rc.d/rc.local
+ConditionFileIsExecutable=/etc/rc.d/rc.local
 
 [Service]
 Type=forking
index 68cacc6..796012c 100644 (file)
@@ -7,7 +7,7 @@
 
 [Unit]
 Description=/etc/init.d/halt.local Compatibility
-ConditionPathExists=/etc/init.d/halt.local
+ConditionFileIsExecutable=/etc/init.d/halt.local
 DefaultDependencies=no
 After=shutdown.target
 Before=final.target
index 38884c5..fe4c007 100644 (file)
@@ -7,7 +7,7 @@
 
 [Unit]
 Description=/etc/init.d/boot.local Compatibility
-ConditionPathExists=/etc/init.d/boot.local
+ConditionFileIsExecutable=/etc/init.d/boot.local
 
 [Service]
 Type=oneshot