mirror of
https://github.com/systemd/systemd.git
synced 2025-03-28 02:50:16 +03:00
unit: introduce %f specifier to decode file names
This commit is contained in:
parent
980d87505c
commit
9fc507041e
@ -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>
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
11
src/unit.c
11
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 }
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user