From: Lennart Poettering Date: Tue, 12 Jul 2011 02:25:02 +0000 (+0200) Subject: unit: introduce ConditionFileIsExecutable= and use it where we check for a binary... X-Git-Tag: v30~16 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=82e487c56d0947796793b6fd2836264328defe9f unit: introduce ConditionFileIsExecutable= and use it where we check for a binary we'll spawn --- diff --git a/TODO b/TODO index 36a57f4b5..0d6ac4130 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 f48218215..d38a00136 100644 --- a/man/systemd.unit.xml +++ b/man/systemd.unit.xml @@ -610,6 +610,7 @@ ConditionPathExistsGlob= ConditionPathIsDirectory= ConditionDirectoryNotEmpty= + ConditionFileIsExecutable= ConditionKernelCommandLine= ConditionVirtualization= ConditionSecurity= @@ -642,7 +643,13 @@ is similar to ConditionPathExists= but verifies whether a certain path - exists and is a directory. + exists and is a + directory. ConditionFileIsExecutable= + is similar to + ConditionPathExists= + but verifies whether a certain path + exists, is a regular file and marked + executable. ConditionDirectoryNotEmpty= is similar to ConditionPathExists= diff --git a/src/condition.c b/src/condition.c index 76ee0370d..f9202f685 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 ff896a793..672996e83 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 05e60bf8f..5c1dff60b 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 79f8f12b7..a9f6feb32 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 8c0b20049..f5f940f7e 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 68cacc665..796012c0c 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 38884c5cd..fe4c00716 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