1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-24 21:34:08 +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 configuration options. Other specifiers that may be
used are <literal>%n</literal>, <literal>%N</literal>, used are <literal>%n</literal>, <literal>%N</literal>,
<literal>%p</literal>, <literal>%P</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 the full unit name, the unescaped unit name, the
prefix name, the unescaped prefix name, the unescaped 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 respectively. The unescaped filename is either the
unescaped instance name (if set) with / prepended (if unescaped instance name (if set) with / prepended (if
necessary), or the prefix name similarly prepended necessary), or the prefix name similarly prepended
with /. The prefix name here refers to the string with /. The prefix name here refers to the string
before the @, i.e. "getty" in the example above, where 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 <para>If a unit file is empty (i.e. has the file size
0) or is symlinked to <filename>/dev/null</filename> 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); 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) { 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) { char *unit_full_printf(Unit *u, const char *format) {
/* This is similar to unit_name_printf() but also supports /* 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[] = { const Specifier table[] = {
{ 'n', specifier_string, u->meta.id }, { '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_string, u->meta.instance },
{ 'I', specifier_instance_unescaped, NULL }, { 'I', specifier_instance_unescaped, NULL },
{ 'f', specifier_filename, 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 } { 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); return UNIT_VTABLE(u)->kill(u, w, m, signo, error);
} }
int unit_following_set(Unit *u, Set **s) { int unit_following_set(Unit *u, Set **s) {
assert(u); assert(u);
assert(s); assert(s);