chiark / gitweb /
unit: add three new specifiers to use in unit files
authorLennart Poettering <lennart@poettering.net>
Thu, 30 Jun 2011 22:41:18 +0000 (00:41 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 30 Jun 2011 22:41:18 +0000 (00:41 +0200)
man/systemd.unit.xml
src/unit.c

index 39da614a821cae36c7440e3e52c5c88efb1cb37d..dd32e5505cb67493e0b271d236d8b5d84a4ddf26 100644 (file)
                 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>
index e3687d473f1e16997900ea80229dc93b839daaee..a2072621b00c9756b30c2b8501d484a228628076 100644 (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);