[systemd-commits] man/systemd.unit.xml src/condition.c src/condition.h src/load-fragment.c TODO units/fedora units/suse

Lennart Poettering lennart at kemper.freedesktop.org
Mon Jul 11 19:25:12 PDT 2011


 TODO                            |    2 --
 man/systemd.unit.xml            |    9 ++++++++-
 src/condition.c                 |    9 +++++++++
 src/condition.h                 |    1 +
 src/load-fragment.c             |    1 +
 units/fedora/halt-local.service |    2 +-
 units/fedora/rc-local.service   |    2 +-
 units/suse/halt-local.service   |    2 +-
 units/suse/rc-local.service     |    2 +-
 9 files changed, 23 insertions(+), 7 deletions(-)

New commits:
commit 82e487c56d0947796793b6fd2836264328defe9f
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jul 12 04:25:02 2011 +0200

    unit: introduce ConditionFileIsExecutable= and use it where we check for a binary we'll spawn

diff --git a/TODO b/TODO
index 36a57f4..0d6ac41 100644
--- 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.
 
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
index f482182..d38a001 100644
--- a/man/systemd.unit.xml
+++ b/man/systemd.unit.xml
@@ -610,6 +610,7 @@
                                 <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>
@@ -642,7 +643,13 @@
                                 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>
diff --git a/src/condition.c b/src/condition.c
index 76ee037..f9202f6 100644
--- a/src/condition.c
+++ b/src/condition.c
@@ -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;
 
diff --git a/src/condition.h b/src/condition.h
index ff896a7..672996e 100644
--- a/src/condition.h
+++ b/src/condition.h
@@ -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,
diff --git a/src/load-fragment.c b/src/load-fragment.c
index 05e60bf..5c1dff6 100644
--- a/src/load-fragment.c
+++ b/src/load-fragment.c
@@ -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"    },
diff --git a/units/fedora/halt-local.service b/units/fedora/halt-local.service
index 79f8f12..a9f6feb 100644
--- a/units/fedora/halt-local.service
+++ b/units/fedora/halt-local.service
@@ -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
diff --git a/units/fedora/rc-local.service b/units/fedora/rc-local.service
index 8c0b200..f5f940f 100644
--- a/units/fedora/rc-local.service
+++ b/units/fedora/rc-local.service
@@ -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
diff --git a/units/suse/halt-local.service b/units/suse/halt-local.service
index 68cacc6..796012c 100644
--- a/units/suse/halt-local.service
+++ b/units/suse/halt-local.service
@@ -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
diff --git a/units/suse/rc-local.service b/units/suse/rc-local.service
index 38884c5..fe4c007 100644
--- a/units/suse/rc-local.service
+++ b/units/suse/rc-local.service
@@ -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



More information about the systemd-commits mailing list