diff options
-rw-r--r-- | man/systemd-escape.xml | 15 | ||||
-rw-r--r-- | src/escape/escape.c | 49 |
2 files changed, 54 insertions, 10 deletions
diff --git a/man/systemd-escape.xml b/man/systemd-escape.xml index 41014abc73..8329e5d7c4 100644 --- a/man/systemd-escape.xml +++ b/man/systemd-escape.xml @@ -76,9 +76,11 @@ <listitem><para>Inserts the escaped strings in a unit name template. Takes a unit name template such as - <filename>foobar@.service</filename>. May not be used in - conjunction with <option>--suffix=</option>, - <option>--unescape</option> or + <filename>foobar@.service</filename>. With + <option>--unescape</option>, expects instantiated unit names + for this template and extracts and unescapes just the instance + part. May not be used in conjunction with + <option>--suffix=</option> or <option>--mangle</option>.</para></listitem> </varlistentry> @@ -100,8 +102,7 @@ <listitem><para>Instead of escaping the specified strings, undo the escaping, reversing the operation. May not be used in - conjunction with <option>--suffix=</option>, - <option>--template=</option> or + conjunction with <option>--suffix=</option> or <option>--mangle</option>.</para></listitem> </varlistentry> @@ -141,6 +142,10 @@ tmp-waldi-foobar.mount</programlisting> <para>To generate instance names of three strings:</para> <programlisting>$ systemd-escape --template=systemd-nspawn@.service 'My Container 1' 'containerb' 'container/III' systemd-nspawn@My\x20Container\x201.service systemd-nspawn@containerb.service systemd-nspawn@container-III.service</programlisting> + + <para>To extract the instance part of an instantiated unit:</para> + <programlisting>$ systemd-escape -u --template=systemd-nspawn@.service 'systemd-nspawn@My\x20Container\x201.service' +My Container 1</programlisting> </refsect1> <refsect1> diff --git a/src/escape/escape.c b/src/escape/escape.c index 371ddbe02b..3cf4a20d1e 100644 --- a/src/escape/escape.c +++ b/src/escape/escape.c @@ -119,8 +119,13 @@ static int parse_argv(int argc, char *argv[]) { return -EINVAL; } - if ((arg_template || arg_suffix) && arg_action != ACTION_ESCAPE) { - log_error("--suffix= and --template= are not compatible with --unescape or --mangle."); + if ((arg_template || arg_suffix) && arg_action == ACTION_MANGLE) { + log_error("--suffix= and --template= are not compatible with --mangle."); + return -EINVAL; + } + + if (arg_suffix && arg_action == ACTION_UNESCAPE) { + log_error("--suffix is not compatible with --unescape."); return -EINVAL; } @@ -189,17 +194,51 @@ int main(int argc, char *argv[]) { break; - case ACTION_UNESCAPE: + case ACTION_UNESCAPE: { + _cleanup_free_ char *name = NULL; + + if (arg_template) { + _cleanup_free_ char *template = NULL; + + r = unit_name_to_instance(*i, &name); + if (r < 0) { + log_error_errno(r, "Failed to extract instance: %m"); + goto finish; + } + if (isempty(name)) { + log_error("Unit %s is missing the instance name.", *i); + r = -EINVAL; + goto finish; + } + r = unit_name_template(*i, &template); + if (r < 0) { + log_error_errno(r, "Failed to extract template: %m"); + goto finish; + } + if (!streq(arg_template, template)) { + log_error("Unit %s template %s does not match specified template %s.", *i, template, arg_template); + r = -EINVAL; + goto finish; + } + } else { + name = strdup(*i); + if (!name) { + r = log_oom(); + goto finish; + } + } + if (arg_path) - r = unit_name_path_unescape(*i, &e); + r = unit_name_path_unescape(name, &e); else - r = unit_name_unescape(*i, &e); + r = unit_name_unescape(name, &e); if (r < 0) { log_error_errno(r, "Failed to unescape string: %m"); goto finish; } break; + } case ACTION_MANGLE: r = unit_name_mangle(*i, 0, &e); |