diff options
author | Lennart Poettering <lennart@poettering.net> | 2011-07-01 00:41:18 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2011-07-01 00:41:18 +0200 |
commit | 0aef434548f43ce2635620e7f97073aa3e23cf96 (patch) | |
tree | c50a6b0b2c93f3f0bdf87eb883dfdadfa1c7fe40 | |
parent | 30b2c336d80aa08ffcc6ebba9540b15b07563a73 (diff) |
unit: add three new specifiers to use in unit files
-rw-r--r-- | man/systemd.unit.xml | 14 | ||||
-rw-r--r-- | src/unit.c | 54 |
2 files changed, 63 insertions, 5 deletions
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml index 39da614a82..dd32e5505c 100644 --- a/man/systemd.unit.xml +++ b/man/systemd.unit.xml @@ -186,16 +186,24 @@ configuration options. Other specifiers that may be used are <literal>%n</literal>, <literal>%N</literal>, <literal>%p</literal>, <literal>%P</literal>, - <literal>%I</literal> and <literal>%f</literal>, for + <literal>%I</literal>, <literal>%f</literal>, + <literal>%c</literal>, <literal>%r</literal>, + <literal>%R</literal> and <literal>%t</literal> for the full unit name, the unescaped unit name, the prefix name, the unescaped prefix name, the unescaped - instance name and the unescaped filename, + instance name, the unescaped filename, the control + group path of the unit, the root control group path of + systemd, and the parent directory of the root control + cgroup path of systemd and the runtime socket dir, respectively. The unescaped filename is either the unescaped instance name (if set) with / prepended (if necessary), or the prefix name similarly prepended with /. The prefix name here refers to the string before the @, i.e. "getty" in the example above, where - "tty3" is the instance name.</para> + "tty3" is the instance name. The runtime socket + directory is either <filename>/run</filename> (for the + system manager) or <literal>$XDG_RUNTIME_DIR</literal> + (for user managers).</para> <para>If a unit file is empty (i.e. has the file size 0) or is symlinked to <filename>/dev/null</filename> diff --git a/src/unit.c b/src/unit.c index e3687d473f..a2072621b0 100644 --- a/src/unit.c +++ b/src/unit.c @@ -2003,6 +2003,47 @@ static char *specifier_filename(char specifier, void *data, void *userdata) { return unit_name_to_path(u->meta.instance); } +static char *specifier_cgroup(char specifier, void *data, void *userdata) { + Unit *u = userdata; + assert(u); + + return default_cgroup_path(u); +} + +static char *specifier_cgroup_root(char specifier, void *data, void *userdata) { + Unit *u = userdata; + char *p; + assert(u); + + if (specifier == 'r') + return strdup(u->meta.manager->cgroup_hierarchy); + + if (parent_of_path(u->meta.manager->cgroup_hierarchy, &p) < 0) + return strdup(""); + + if (streq(p, "/")) { + free(p); + return strdup(""); + } + + return p; +} + +static char *specifier_runtime(char specifier, void *data, void *userdata) { + Unit *u = userdata; + assert(u); + + if (u->meta.manager->running_as == MANAGER_USER) { + const char *e; + + e = getenv("XDG_RUNTIME_DIR"); + if (e) + return strdup(e); + } + + return strdup("/run"); +} + char *unit_name_printf(Unit *u, const char* format) { /* @@ -2032,7 +2073,13 @@ char *unit_name_printf(Unit *u, const char* format) { char *unit_full_printf(Unit *u, const char *format) { /* This is similar to unit_name_printf() but also supports - * unescaping */ + * unescaping. Also, adds a couple of additional codes: + * + * %c cgroup path of unit + * %r root cgroup path of this systemd instance (e.g. "/user/lennart/shared/systemd-4711") + * %R parent of root cgroup path (e.g. "/usr/lennart/shared") + * %t the runtime directory to place sockets in (e.g. "/run" or $XDG_RUNTIME_DIR) + */ const Specifier table[] = { { 'n', specifier_string, u->meta.id }, @@ -2042,6 +2089,10 @@ char *unit_full_printf(Unit *u, const char *format) { { 'i', specifier_string, u->meta.instance }, { 'I', specifier_instance_unescaped, NULL }, { 'f', specifier_filename, NULL }, + { 'c', specifier_cgroup, NULL }, + { 'r', specifier_cgroup_root, NULL }, + { 'R', specifier_cgroup_root, NULL }, + { 't', specifier_runtime, NULL }, { 0, NULL, NULL } }; @@ -2420,7 +2471,6 @@ int unit_kill(Unit *u, KillWho w, KillMode m, int signo, DBusError *error) { return UNIT_VTABLE(u)->kill(u, w, m, signo, error); } - int unit_following_set(Unit *u, Set **s) { assert(u); assert(s); |