summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/systemd.unit.xml18
-rw-r--r--src/unit-name.c23
-rw-r--r--src/unit-name.h2
-rw-r--r--src/unit.c11
-rw-r--r--units/fsck@.service.in4
5 files changed, 49 insertions, 9 deletions
diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
index e54cafaabc..f72b947dca 100644
--- a/man/systemd.unit.xml
+++ b/man/systemd.unit.xml
@@ -182,13 +182,17 @@
<literal>%i</literal> specifier in many of the
configuration options. Other specifiers that may be
used are <literal>%n</literal>, <literal>%N</literal>,
- <literal>%p</literal>, <literal>%P</literal> and
- <literal>%I</literal>, for the full unit name, the
- unescaped unit name, the prefix name, the unescaped
- prefix name and the unescaped instance name,
- respectively. The prefix name here refers to the
- string before the @, i.e. "getty" in the example
- above, where "tty3" is the instance name.</para>
+ <literal>%p</literal>, <literal>%P</literal>,
+ <literal>%I</literal> and <literal>%f</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,
+ 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>
<para>If a unit file is empty (i.e. has the file size
0) or is symlinked to <filename>/dev/null</filename>
diff --git a/src/unit-name.c b/src/unit-name.c
index dbaa4a7b12..d0cfca6254 100644
--- a/src/unit-name.c
+++ b/src/unit-name.c
@@ -427,3 +427,26 @@ char *unit_name_to_path(const char *name) {
return e;
}
+
+char *unit_name_path_unescape(const char *f) {
+ char *e;
+
+ assert(f);
+
+ if (!(e = unit_name_unescape(f)))
+ return NULL;
+
+ if (e[0] != '/') {
+ char *w;
+
+ w = strappend("/", e);
+ free(e);
+
+ if (!w)
+ return NULL;
+
+ e = w;
+ }
+
+ return e;
+}
diff --git a/src/unit-name.h b/src/unit-name.h
index 9842db3552..e369910aea 100644
--- a/src/unit-name.h
+++ b/src/unit-name.h
@@ -42,6 +42,8 @@ char *unit_name_build_escape(const char *prefix, const char *instance, const cha
char *unit_name_escape(const char *f);
char *unit_name_unescape(const char *f);
+char *unit_name_path_unescape(const char *f);
+
bool unit_name_is_template(const char *n);
char *unit_name_replace_instance(const char *f, const char *i);
diff --git a/src/unit.c b/src/unit.c
index 07978134de..ab6eb20227 100644
--- a/src/unit.c
+++ b/src/unit.c
@@ -1880,6 +1880,16 @@ static char *specifier_instance_unescaped(char specifier, void *data, void *user
return strdup("");
}
+static char *specifier_filename(char specifier, void *data, void *userdata) {
+ Unit *u = userdata;
+ assert(u);
+
+ if (u->meta.instance)
+ return unit_name_path_unescape(u->meta.instance);
+
+ return unit_name_to_path(u->meta.instance);
+}
+
char *unit_name_printf(Unit *u, const char* format) {
/*
@@ -1918,6 +1928,7 @@ char *unit_full_printf(Unit *u, const char *format) {
{ 'P', specifier_prefix_unescaped, NULL },
{ 'i', specifier_string, u->meta.instance },
{ 'I', specifier_instance_unescaped, NULL },
+ { 'f', specifier_filename, NULL },
{ 0, NULL, NULL }
};
diff --git a/units/fsck@.service.in b/units/fsck@.service.in
index f0ccc8f075..860c3a646a 100644
--- a/units/fsck@.service.in
+++ b/units/fsck@.service.in
@@ -6,7 +6,7 @@
# (at your option) any later version.
[Unit]
-Description=File System Check on %I
+Description=File System Check on %f
DefaultDependencies=no
Requires=%i.device
After=systemd-readahead-collect.service systemd-readahead-replay.service %i.device
@@ -15,4 +15,4 @@ Before=local-fs.target shutdown.target
[Service]
Type=oneshot
RemainAfterExit=no
-ExecStart=@rootlibexecdir@/systemd-fsck %I
+ExecStart=@rootlibexecdir@/systemd-fsck %f