diff options
-rw-r--r-- | man/systemd.unit.xml | 10 | ||||
-rw-r--r-- | man/tmpfiles.d.xml | 10 | ||||
-rw-r--r-- | src/core/unit-printf.c | 5 | ||||
-rw-r--r-- | src/shared/specifier.c | 35 | ||||
-rw-r--r-- | src/shared/specifier.h | 3 | ||||
-rw-r--r-- | src/sysusers/sysusers.c | 8 | ||||
-rw-r--r-- | src/tmpfiles/tmpfiles.c | 3 | ||||
-rw-r--r-- | test/test-execute/exec-specifier.service | 2 |
8 files changed, 73 insertions, 3 deletions
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml index 3d0f0ff87c..b6f4728b00 100644 --- a/man/systemd.unit.xml +++ b/man/systemd.unit.xml @@ -1627,6 +1627,11 @@ <entry>This is either <filename>/run</filename> (for the system manager) or the path <literal>$XDG_RUNTIME_DIR</literal> resolves to (for user managers).</entry> </row> <row> + <entry><literal>%T</literal></entry> + <entry>Directory for temporary files</entry> + <entry>This is either <filename>/tmp</filename> or the path <literal>$TMPDIR</literal>, <literal>$TEMP</literal> or <literal>$TMP</literal> are set to.</entry> + </row> + <row> <entry><literal>%u</literal></entry> <entry>User name</entry> <entry>This is the name of the user running the service manager instance. In case of the system manager this resolves to <literal>root</literal>.</entry> @@ -1642,6 +1647,11 @@ <entry>Identical to <command>uname -r</command> output</entry> </row> <row> + <entry><literal>%V</literal></entry> + <entry>Directory for larger and persistent temporary files</entry> + <entry>This is either <filename>/var/tmp</filename> or the path <literal>$TMPDIR</literal>, <literal>$TEMP</literal> or <literal>$TMP</literal> are set to.</entry> + </row> + <row> <entry><literal>%%</literal></entry> <entry>Single percent sign</entry> <entry>Use <literal>%%</literal> in place of <literal>%</literal> to specify a single percent sign.</entry> diff --git a/man/tmpfiles.d.xml b/man/tmpfiles.d.xml index 30809f25f0..46bec912c5 100644 --- a/man/tmpfiles.d.xml +++ b/man/tmpfiles.d.xml @@ -652,6 +652,11 @@ r! /tmp/.X[0-9]*-lock</programlisting> <entry>In --user mode, this is the same <varname>$XDG_RUNTIME_DIR</varname>, and <filename>/run</filename> otherwise.</entry> </row> <row> + <entry><literal>%T</literal></entry> + <entry>Directory for temporary files</entry> + <entry>This is either <filename>/tmp</filename> or the path <literal>$TMPDIR</literal>, <literal>$TEMP</literal> or <literal>$TMP</literal> are set to.</entry> + </row> + <row> <entry><literal>%u</literal></entry> <entry>User name</entry> <entry>This is the name of the user running the service manager instance. In case of the system manager this resolves to <literal>root</literal>.</entry> @@ -667,6 +672,11 @@ r! /tmp/.X[0-9]*-lock</programlisting> <entry>Identical to <command>uname -r</command> output.</entry> </row> <row> + <entry><literal>%V</literal></entry> + <entry>Directory for larger and persistent temporary files</entry> + <entry>This is either <filename>/var/tmp</filename> or the path <literal>$TMPDIR</literal>, <literal>$TEMP</literal> or <literal>$TMP</literal> are set to.</entry> + </row> + <row> <entry><literal>%%</literal></entry> <entry>Escaped <literal>%</literal></entry> <entry>Single percent sign.</entry> diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c index d2948ab6aa..20891200ba 100644 --- a/src/core/unit-printf.c +++ b/src/core/unit-printf.c @@ -232,6 +232,8 @@ int unit_full_printf(Unit *u, const char *format, char **ret) { * %S: the state directory root (e.g. /var/lib or $XDG_CONFIG_HOME) * %C: the cache directory root (e.g. /var/cache or $XDG_CACHE_HOME) * %L: the log directory root (e.g. /var/log or $XDG_CONFIG_HOME/log) + * %T: the temporary directory (e.g. /tmp, or $TMPDIR, $TEMP, $TMP) + * %V: the temporary directory for large, persistent stuff (e.g. /var/tmp, or $TMPDIR, $TEMP, $TMP) * * %h: the homedir of the running user * %s: the shell of the running user @@ -257,10 +259,13 @@ int unit_full_printf(Unit *u, const char *format, char **ret) { { 'c', specifier_cgroup, NULL }, { 'r', specifier_cgroup_slice, NULL }, { 'R', specifier_cgroup_root, NULL }, + { 't', specifier_special_directory, UINT_TO_PTR(EXEC_DIRECTORY_RUNTIME) }, { 'S', specifier_special_directory, UINT_TO_PTR(EXEC_DIRECTORY_STATE) }, { 'C', specifier_special_directory, UINT_TO_PTR(EXEC_DIRECTORY_CACHE) }, { 'L', specifier_special_directory, UINT_TO_PTR(EXEC_DIRECTORY_LOGS) }, + { 'T', specifier_tmp_dir, NULL }, + { 'V', specifier_var_tmp_dir, NULL }, { 'U', specifier_user_id, NULL }, { 'u', specifier_user_name, NULL }, diff --git a/src/shared/specifier.c b/src/shared/specifier.c index 27782b8d5b..c4b2bdc12d 100644 --- a/src/shared/specifier.c +++ b/src/shared/specifier.c @@ -15,6 +15,7 @@ #include "sd-id128.h" #include "alloc-util.h" +#include "fs-util.h" #include "hostname-util.h" #include "macro.h" #include "specifier.h" @@ -222,6 +223,40 @@ int specifier_user_shell(char specifier, void *data, void *userdata, char **ret) return get_shell(ret); } +int specifier_tmp_dir(char specifier, void *data, void *userdata, char **ret) { + const char *p; + char *copy; + int r; + + r = tmp_dir(&p); + if (r < 0) + return r; + + copy = strdup(p); + if (!copy) + return -ENOMEM; + + *ret = copy; + return 0; +} + +int specifier_var_tmp_dir(char specifier, void *data, void *userdata, char **ret) { + const char *p; + char *copy; + int r; + + r = var_tmp_dir(&p); + if (r < 0) + return r; + + copy = strdup(p); + if (!copy) + return -ENOMEM; + + *ret = copy; + return 0; +} + int specifier_escape_strv(char **l, char ***ret) { char **z, **p, **q; diff --git a/src/shared/specifier.h b/src/shared/specifier.h index b998c2a759..33c0e2727e 100644 --- a/src/shared/specifier.h +++ b/src/shared/specifier.h @@ -31,6 +31,9 @@ int specifier_user_id(char specifier, void *data, void *userdata, char **ret); int specifier_user_home(char specifier, void *data, void *userdata, char **ret); int specifier_user_shell(char specifier, void *data, void *userdata, char **ret); +int specifier_tmp_dir(char specifier, void *data, void *userdata, char **ret); +int specifier_var_tmp_dir(char specifier, void *data, void *userdata, char **ret); + static inline char* specifier_escape(const char *string) { return strreplace(string, "%", "%%"); } diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c index af041d2f74..b521200346 100644 --- a/src/sysusers/sysusers.c +++ b/src/sysusers/sysusers.c @@ -1359,10 +1359,12 @@ static bool item_equal(Item *a, Item *b) { static int parse_line(const char *fname, unsigned line, const char *buffer) { static const Specifier specifier_table[] = { - { 'm', specifier_machine_id, NULL }, - { 'b', specifier_boot_id, NULL }, - { 'H', specifier_host_name, NULL }, + { 'm', specifier_machine_id, NULL }, + { 'b', specifier_boot_id, NULL }, + { 'H', specifier_host_name, NULL }, { 'v', specifier_kernel_release, NULL }, + { 'T', specifier_tmp_dir, NULL }, + { 'V', specifier_var_tmp_dir, NULL }, {} }; diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 9a9cfdd8a2..049e24b8bd 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -179,10 +179,13 @@ static const Specifier specifier_table[] = { { 'U', specifier_user_id, NULL }, { 'u', specifier_user_name, NULL }, { 'h', specifier_user_home, NULL }, + { 't', specifier_directory, UINT_TO_PTR(DIRECTORY_RUNTIME) }, { 'S', specifier_directory, UINT_TO_PTR(DIRECTORY_STATE) }, { 'C', specifier_directory, UINT_TO_PTR(DIRECTORY_CACHE) }, { 'L', specifier_directory, UINT_TO_PTR(DIRECTORY_LOGS) }, + { 'T', specifier_tmp_dir, NULL }, + { 'V', specifier_var_tmp_dir, NULL }, {} }; diff --git a/test/test-execute/exec-specifier.service b/test/test-execute/exec-specifier.service index 926d45182b..e46373ddfe 100644 --- a/test/test-execute/exec-specifier.service +++ b/test/test-execute/exec-specifier.service @@ -16,6 +16,8 @@ ExecStart=test %t = /run ExecStart=test %S = /var/lib ExecStart=test %C = /var/cache ExecStart=test %L = /var/log +ExecStart=test %T = /tmp +ExecStart=test %V = /var/tmp ExecStart=sh -c 'test %u = $$(id -un 0)' ExecStart=test %U = 0 ExecStart=sh -c 'test %h = $$(getent passwd 0 | cut -d: -f 6)' |