1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-23 17:34:00 +03:00

unit: add three new specifiers to use in unit files

This commit is contained in:
Lennart Poettering 2011-07-01 00:41:18 +02:00
parent 30b2c336d8
commit 0aef434548
2 changed files with 63 additions and 5 deletions

View File

@ -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>

View File

@ -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);