1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-10-28 03:25:27 +03:00

analyze: allow full paths for cat-config

$ systemd-analyze cat-config systemd/logind.conf
$ systemd-analyze cat-config /etc/systemd/logind.conf
$ systemd-analyze cat-config /usr/lib/systemd/logind.conf
are all equvalent,
$ systemd-analyze cat-config /var/systemd/logind.conf
is an error.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2018-04-27 12:50:07 +02:00
parent 2e1ec10a62
commit 971f6ea551
2 changed files with 24 additions and 6 deletions

View File

@ -82,7 +82,7 @@
<command>systemd-analyze</command>
<arg choice="opt" rep="repeat">OPTIONS</arg>
<arg choice="plain">cat-config</arg>
<arg choice="plain" rep="repeat"><replaceable>NAME</replaceable></arg>
<arg choice="plain" rep="repeat"><replaceable>NAME</replaceable>|<replaceable>PATH</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<command>systemd-analyze</command>
@ -190,7 +190,11 @@
to <command>systemctl cat</command>, but operates on config files.
It will copy the contents of a config file and any drop-ins to standard
output, using the usual systemd set of directories and rules for
precedence.</para>
precedence. Each argument must be either an absolute path including
the prefix (such as <filename>/etc/systemd/logind.conf</filename> or
<filename>/usr/lib/systemd/logind.conf</filename>), or a name
relative to the prefix (such as <filename>systemd/logind.conf</filename>).
</para>
<example>
<title>Showing logind configuration</title>

View File

@ -19,6 +19,7 @@
#include "bus-unit-util.h"
#include "bus-util.h"
#include "calendarspec.h"
#include "def.h"
#include "conf-files.h"
#include "glob-util.h"
#include "hashmap.h"
@ -1322,6 +1323,8 @@ static int cat_config(int argc, char *argv[], void *userdata) {
(void) pager_open(arg_no_pager, false);
STRV_FOREACH(arg, argv + 1) {
const char *t = NULL;
if (arg != argv + 1)
printf("%s%*s%s\n\n",
ansi_underline(),
@ -1329,11 +1332,22 @@ static int cat_config(int argc, char *argv[], void *userdata) {
ansi_normal());
if (path_is_absolute(*arg)) {
log_error("Arguments must be config file names (relative to /etc/");
return -EINVAL;
}
const char *dir;
r = conf_files_cat(arg_root, *arg);
NULSTR_FOREACH(dir, CONF_PATHS_NULSTR("")) {
t = path_startswith(*arg, dir);
if (t)
break;
}
if (!t) {
log_error("Path %s does not start with any known prefix.", *arg);
return -EINVAL;
}
} else
t = *arg;
r = conf_files_cat(arg_root, t);
if (r < 0)
return r;
}