41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering This file is part of systemd.
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering Copyright 2010 Lennart Poettering
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering systemd is free software; you can redistribute it and/or modify it
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering under the terms of the GNU Lesser General Public License as published by
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering (at your option) any later version.
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering systemd is distributed in the hope that it will be useful, but
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering Lesser General Public License for more details.
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering You should have received a copy of the GNU Lesser General Public License
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poetteringstatic int specifier_prefix_and_instance(char specifier, void *data, void *userdata, char **ret) {
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return unit_name_to_prefix_and_instance(u->id, ret);
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poetteringstatic int specifier_prefix(char specifier, void *data, void *userdata, char **ret) {
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poetteringstatic int specifier_prefix_unescaped(char specifier, void *data, void *userdata, char **ret) {
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poetteringstatic int specifier_instance_unescaped(char specifier, void *data, void *userdata, char **ret) {
115cbf7e209a86cf5317fa12d44566247b4af332Evgeny Vereshchagin return unit_name_unescape(strempty(u->instance), ret);
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poetteringstatic int specifier_filename(char specifier, void *data, void *userdata, char **ret) {
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return unit_name_path_unescape(u->instance, ret);
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poetteringstatic int specifier_cgroup(char specifier, void *data, void *userdata, char **ret) {
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poetteringstatic int specifier_cgroup_root(char specifier, void *data, void *userdata, char **ret) {
696fd1ef4f2f8574e349332a16987c6772641eddLennart Poetteringstatic int specifier_cgroup_slice(char specifier, void *data, void *userdata, char **ret) {
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poetteringstatic int specifier_runtime(char specifier, void *data, void *userdata, char **ret) {
2cfbd749af308bdbe56edcfed7f3eea0fc2b93d2Lennart Poettering const char *e;
b2c23da8cea1987a1a329f5a964d3299b7ca7890Lennart Poettering if (u->manager->running_as == MANAGER_SYSTEM)
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poetteringstatic int specifier_user_name(char specifier, void *data, void *userdata, char **ret) {
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering /* If we are UID 0 (root), this will not result in NSS,
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering * otherwise it might. This is good, as we want to be able to
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering * run this in PID 1, where our user ID is 0, but where NSS
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering * lookups are not allowed. */
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poetteringstatic int specifier_user_id(char specifier, void *data, void *userdata, char **ret) {
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering if (asprintf(ret, UID_FMT, getuid()) < 0)
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poetteringstatic int specifier_user_home(char specifier, void *data, void *userdata, char **ret) {
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering /* On PID 1 (which runs as root) this will not result in NSS,
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering * which is good. See above */
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poetteringstatic int specifier_user_shell(char specifier, void *data, void *userdata, char **ret) {
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering /* On PID 1 (which runs as root) this will not result in NSS,
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering * which is good. See above */
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poetteringint unit_name_printf(Unit *u, const char* format, char **ret) {
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering * This will use the passed string as format string and
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering * replace the following specifiers:
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering * %n: the full id of the unit (foo@bar.waldo)
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering * %N: the id of the unit without the suffix (foo@bar)
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering * %p: the prefix (foo)
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering * %i: the instance (bar)
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering { 'N', specifier_prefix_and_instance, NULL },
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poettering return specifier_printf(format, table, u, ret);
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poetteringint unit_full_printf(Unit *u, const char *format, char **ret) {
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering /* This is similar to unit_name_printf() but also supports
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering * unescaping. Also, adds a couple of additional codes:
dca348bcbb462305864526c587495a14a76bfcdeJan Engelhardt * %f the instance if set, otherwise the id
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering * %c cgroup path of unit
2cfbd749af308bdbe56edcfed7f3eea0fc2b93d2Lennart Poettering * %r where units in this slice are placed in the cgroup tree
9444b1f20e311f073864d81e913bd4f32fe95cfdLennart Poettering * %R the root of this systemd's instance tree
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering * %t the runtime directory to place sockets in (e.g. "/run" or $XDG_RUNTIME_DIR)
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering * %U the UID of the running user
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering * %u the username of the running user
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering * %h the homedir of the running user
79413b673b45adc98dfeaec882bbdda2343cb2f9Lennart Poettering * %s the shell of the running user
6569cae18ed640a4e9f52f73e2a3ec54b07d0406Lennart Poettering * %m the machine ID of the running system
6569cae18ed640a4e9f52f73e2a3ec54b07d0406Lennart Poettering * %H the host name of the running system
7584d236eac91f9b7128b1eb08bddf18be2bce9fZbigniew Jędrzejewski-Szmek * %b the boot ID of the running system
6aaa8c2f783cd1b3ac27c5ce40625d032e7e3d71Zbigniew Jędrzejewski-Szmek * %v `uname -r` of the running system
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering { 'N', specifier_prefix_and_instance, NULL },
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering { 'P', specifier_prefix_unescaped, NULL },
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering { 'I', specifier_instance_unescaped, NULL },
6aaa8c2f783cd1b3ac27c5ce40625d032e7e3d71Zbigniew Jędrzejewski-Szmek { 'v', specifier_kernel_release, NULL },
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poettering return specifier_printf(format, table, u, ret);
19f6d710772305610b928bc2678b9d77fe11e770Lennart Poetteringint unit_full_printf_strv(Unit *u, char **l, char ***ret) {
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering char **r, **i, **j;
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering /* Applies unit_full_printf to every entry in l */
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering for (i = l, j = r; *i; i++, j++) {
41f9172f427bdbb8221c64029f78364b8dd4e527Lennart Poettering for (j--; j >= r; j--)