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:
parent
30b2c336d8
commit
0aef434548
@ -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>
|
||||||
|
54
src/unit.c
54
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);
|
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user