1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-12-23 17:34:00 +03:00

Merge pull request #18873 from yuwata/use-config-parse-many-and-null-or-empty-path

tree-wide: use config_parse_many() and null_or_empty_path()
This commit is contained in:
Yu Watanabe 2021-03-05 11:34:54 +09:00 committed by GitHub
commit 275334c562
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 69 additions and 65 deletions

View File

@ -28,6 +28,9 @@
<para><filename>/run/systemd/journald.conf.d/*.conf</filename></para>
<para><filename>/usr/lib/systemd/journald.conf.d/*.conf</filename></para>
<para><filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf</filename></para>
<para><filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf.d/*.conf</filename></para>
<para><filename>/run/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf.d/*.conf</filename></para>
<para><filename>/usr/lib/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
@ -41,8 +44,9 @@
<para>The <command>systemd-journald</command> instance managing the default namespace is configured by
<filename>/etc/systemd/journald.conf</filename> and associated drop-ins. Instances managing other
namespaces read <filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf</filename> with
the namespace identifier filled in. This allows each namespace to carry a distinct configuration. See
namespaces read <filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf</filename>
and associated drop-ins with the namespace identifier filled in. This allows each namespace to carry
a distinct configuration. See
<citerefentry><refentrytitle>systemd-journald.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
for details about journal namespaces.</para>
</refsect1>

View File

@ -32,23 +32,31 @@
<citerefentry><refentrytitle>systemd.syntax</refentrytitle><manvolnum>7</manvolnum></citerefentry> for a
general description of the syntax.</para>
<para>The link files are read from the files located in the system
network directory <filename>/usr/lib/systemd/network</filename>,
the volatile runtime network directory
<filename>/run/systemd/network</filename>, and the local
administration network directory
<filename>/etc/systemd/network</filename>. Link files must have
the extension <filename>.link</filename>; other extensions are
ignored. All link files are collectively sorted and processed in
lexical order, regardless of the directories in which they live.
However, files with identical filenames replace each other. Files
in <filename>/etc/</filename> have the highest priority, files in
<filename>/run/</filename> take precedence over files with the same
name in <filename>/usr/lib/</filename>. This can be used to
override a system-supplied link file with a local file if needed.
As a special case, an empty file (file size 0) or symlink with the
same name pointing to <filename>/dev/null</filename> disables the
configuration file entirely (it is "masked").</para>
<para>The link files are read from the files located in the system network directory
<filename>/usr/lib/systemd/network</filename>, the volatile runtime network directory
<filename>/run/systemd/network</filename>, and the local administration network directory
<filename>/etc/systemd/network</filename>. Link files must have the extension
<filename>.link</filename>; other extensions are ignored. All link files are collectively sorted
and processed in lexical order, regardless of the directories in which they live. However, files
with identical filenames replace each other. Files in <filename>/etc/</filename> have the highest
priority, files in <filename>/run/</filename> take precedence over files with the same name in
<filename>/usr/lib/</filename>. This can be used to override a system-supplied link file with a
local file if needed. As a special case, an empty file (file size 0) or symlink with the same name
pointing to <filename>/dev/null</filename> disables the configuration file entirely (it is
"masked").</para>
<para>Along with the link file <filename>foo.link</filename>, a "drop-in" directory
<filename>foo.link.d/</filename> may exist. All files with the suffix <literal>.conf</literal>
from this directory will be parsed after the file itself is parsed. This is useful to alter or add
configuration settings, without having to modify the main configuration file. Each drop-in file
must have appropriate section headers.</para>
<para>In addition to <filename>/etc/systemd/network</filename>, drop-in <literal>.d</literal>
directories can be placed in <filename>/usr/lib/systemd/network</filename> or
<filename>/run/systemd/network</filename> directories. Drop-in files in <filename>/etc/</filename>
take precedence over those in <filename>/run/</filename> which in turn take precedence over those
in <filename>/usr/lib/</filename>. Drop-in files under any of these directories take precedence
over the main link file wherever located.</para>
<para>The link file contains a [Match] section, which determines if a given link file may be applied to a
given device, as well as a [Link] section specifying how the device should be configured. The first (in

View File

@ -1625,17 +1625,19 @@ static int server_parse_config_file(Server *s) {
assert(s);
if (s->namespace) {
const char *namespaced;
const char *namespaced, *dropin_dirname;
/* If we are running in namespace mode, load the namespace specific configuration file, and nothing else */
namespaced = strjoina(PKGSYSCONFDIR "/journald@", s->namespace, ".conf");
dropin_dirname = strjoina("journald@", s->namespace, ".conf.d");
r = config_parse(NULL,
namespaced, NULL,
"Journal\0",
config_item_perf_lookup, journald_gperf_lookup,
CONFIG_PARSE_WARN, s,
NULL);
r = config_parse_many(
STRV_MAKE_CONST(namespaced),
(const char* const*) CONF_PATHS_STRV("systemd"),
dropin_dirname,
"Journal\0",
config_item_perf_lookup, journald_gperf_lookup,
CONFIG_PARSE_WARN, s, NULL);
if (r < 0)
return r;

View File

@ -656,7 +656,6 @@ int netdev_join(NetDev *netdev, Link *link, link_netlink_message_handler_t callb
int netdev_load_one(Manager *manager, const char *filename) {
_cleanup_(netdev_unrefp) NetDev *netdev_raw = NULL, *netdev = NULL;
_cleanup_fclose_ FILE *file = NULL;
const char *dropin_dirname;
bool independent = false;
int r;
@ -664,15 +663,12 @@ int netdev_load_one(Manager *manager, const char *filename) {
assert(manager);
assert(filename);
file = fopen(filename, "re");
if (!file) {
if (errno == ENOENT)
return 0;
return -errno;
}
if (null_or_empty_fd(fileno(file))) {
r = null_or_empty_path(filename);
if (r == -ENOENT)
return 0;
if (r < 0)
return r;
if (r > 0) {
log_debug("Skipping empty file: %s", filename);
return 0;
}
@ -714,10 +710,6 @@ int netdev_load_one(Manager *manager, const char *filename) {
return 0;
}
r = fseek(file, 0, SEEK_SET);
if (r < 0)
return -errno;
netdev = malloc0(NETDEV_VTABLE(netdev_raw)->object_size);
if (!netdev)
return log_oom();

View File

@ -288,7 +288,6 @@ int network_verify(Network *network) {
int network_load_one(Manager *manager, OrderedHashmap **networks, const char *filename) {
_cleanup_free_ char *fname = NULL, *name = NULL;
_cleanup_(network_unrefp) Network *network = NULL;
_cleanup_fclose_ FILE *file = NULL;
const char *dropin_dirname;
char *d;
int r;
@ -296,15 +295,12 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
assert(manager);
assert(filename);
file = fopen(filename, "re");
if (!file) {
if (errno == ENOENT)
return 0;
return -errno;
}
if (null_or_empty_fd(fileno(file))) {
r = null_or_empty_path(filename);
if (r == -ENOENT)
return 0;
if (r < 0)
return r;
if (r > 0) {
log_debug("Skipping empty file: %s", filename);
return 0;
}

View File

@ -1335,8 +1335,8 @@ static int unit_file_load_or_readlink(
const char *path,
const char *root_dir,
SearchFlags flags) {
_cleanup_free_ char *resolved = NULL;
struct stat st;
int r;
r = unit_file_load(c, info, path, root_dir, flags);
@ -1351,9 +1351,7 @@ static int unit_file_load_or_readlink(
* so let's see if the path is a (possibly dangling) symlink to /dev/null. */
info->type = UNIT_FILE_TYPE_MASKED;
else if (r > 0 &&
stat(resolved, &st) >= 0 &&
null_or_empty(&st))
else if (r > 0 && null_or_empty_path(resolved) > 0)
info->type = UNIT_FILE_TYPE_MASKED;

View File

@ -110,19 +110,20 @@ int link_config_ctx_new(link_config_ctx **ret) {
int link_load_one(link_config_ctx *ctx, const char *filename) {
_cleanup_(link_config_freep) link_config *link = NULL;
_cleanup_fclose_ FILE *file = NULL;
_cleanup_free_ char *name = NULL;
const char *dropin_dirname;
size_t i;
int r;
assert(ctx);
assert(filename);
file = fopen(filename, "re");
if (!file)
return errno == ENOENT ? 0 : -errno;
if (null_or_empty_fd(fileno(file))) {
r = null_or_empty_path(filename);
if (r == -ENOENT)
return 0;
if (r < 0)
return r;
if (r > 0) {
log_debug("Skipping empty file: %s", filename);
return 0;
}
@ -151,11 +152,14 @@ int link_load_one(link_config_ctx *ctx, const char *filename) {
for (i = 0; i < ELEMENTSOF(link->features); i++)
link->features[i] = -1;
r = config_parse(NULL, filename, file,
"Match\0Link\0",
config_item_perf_lookup, link_config_gperf_lookup,
CONFIG_PARSE_WARN, link,
NULL);
dropin_dirname = strjoina(basename(filename), ".d");
r = config_parse_many(
STRV_MAKE_CONST(filename),
(const char* const*) CONF_PATHS_STRV("systemd/network"),
dropin_dirname,
"Match\0Link\0",
config_item_perf_lookup, link_config_gperf_lookup,
CONFIG_PARSE_WARN, link, NULL);
if (r < 0)
return r;