1
0
mirror of https://github.com/systemd/systemd synced 2025-10-03 18:54:45 +02:00

Compare commits

..

7 Commits

Author SHA1 Message Date
Yu Watanabe
275334c562
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()
2021-03-05 11:34:54 +09:00
Yu Watanabe
986c0edfcb dhcp-server: also append specified additional options and vendor specific option on DHCP_OFFER
Fixes #15780.
2021-03-05 11:34:32 +09:00
Yu Watanabe
0efaa4843e install: use null_or_empty_path() 2021-03-05 08:09:05 +09:00
Yu Watanabe
4e54a17dbb network: use null_or_empty_path()
This also drops unnecessary fseek().
2021-03-05 08:09:05 +09:00
Yu Watanabe
e8e2788dab udev/net: use null_or_empty_path() 2021-03-05 08:09:05 +09:00
Yu Watanabe
e406e8a29a udev/net: make .link files support drop-in config 2021-03-05 08:09:01 +09:00
Yu Watanabe
005c7b1d88 journal: make namespace invocation also support drop-in config 2021-03-05 06:57:14 +09:00
8 changed files with 109 additions and 137 deletions

View File

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

View File

@ -32,23 +32,31 @@
<citerefentry><refentrytitle>systemd.syntax</refentrytitle><manvolnum>7</manvolnum></citerefentry> for a <citerefentry><refentrytitle>systemd.syntax</refentrytitle><manvolnum>7</manvolnum></citerefentry> for a
general description of the syntax.</para> general description of the syntax.</para>
<para>The link files are read from the files located in the system <para>The link files are read from the files located in the system network directory
network directory <filename>/usr/lib/systemd/network</filename>, <filename>/usr/lib/systemd/network</filename>, the volatile runtime network directory
the volatile runtime network directory <filename>/run/systemd/network</filename>, and the local administration network directory
<filename>/run/systemd/network</filename>, and the local <filename>/etc/systemd/network</filename>. Link files must have the extension
administration network directory <filename>.link</filename>; other extensions are ignored. All link files are collectively sorted
<filename>/etc/systemd/network</filename>. Link files must have and processed in lexical order, regardless of the directories in which they live. However, files
the extension <filename>.link</filename>; other extensions are with identical filenames replace each other. Files in <filename>/etc/</filename> have the highest
ignored. All link files are collectively sorted and processed in priority, files in <filename>/run/</filename> take precedence over files with the same name in
lexical order, regardless of the directories in which they live. <filename>/usr/lib/</filename>. This can be used to override a system-supplied link file with a
However, files with identical filenames replace each other. Files local file if needed. As a special case, an empty file (file size 0) or symlink with the same name
in <filename>/etc/</filename> have the highest priority, files in pointing to <filename>/dev/null</filename> disables the configuration file entirely (it is
<filename>/run/</filename> take precedence over files with the same "masked").</para>
name in <filename>/usr/lib/</filename>. This can be used to
override a system-supplied link file with a local file if needed. <para>Along with the link file <filename>foo.link</filename>, a "drop-in" directory
As a special case, an empty file (file size 0) or symlink with the <filename>foo.link.d/</filename> may exist. All files with the suffix <literal>.conf</literal>
same name pointing to <filename>/dev/null</filename> disables the from this directory will be parsed after the file itself is parsed. This is useful to alter or add
configuration file entirely (it is "masked").</para> 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 <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 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); assert(s);
if (s->namespace) { 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 */ /* If we are running in namespace mode, load the namespace specific configuration file, and nothing else */
namespaced = strjoina(PKGSYSCONFDIR "/journald@", s->namespace, ".conf"); namespaced = strjoina(PKGSYSCONFDIR "/journald@", s->namespace, ".conf");
dropin_dirname = strjoina("journald@", s->namespace, ".conf.d");
r = config_parse(NULL, r = config_parse_many(
namespaced, NULL, STRV_MAKE_CONST(namespaced),
(const char* const*) CONF_PATHS_STRV("systemd"),
dropin_dirname,
"Journal\0", "Journal\0",
config_item_perf_lookup, journald_gperf_lookup, config_item_perf_lookup, journald_gperf_lookup,
CONFIG_PARSE_WARN, s, CONFIG_PARSE_WARN, s, NULL);
NULL);
if (r < 0) if (r < 0)
return r; return r;

View File

@ -425,14 +425,23 @@ static int server_message_init(sd_dhcp_server *server, DHCPPacket **ret,
return 0; return 0;
} }
static int server_send_offer(sd_dhcp_server *server, DHCPRequest *req, static int server_send_offer_or_ack(
be32_t address) { sd_dhcp_server *server,
DHCPRequest *req,
be32_t address,
uint8_t type) {
_cleanup_free_ DHCPPacket *packet = NULL; _cleanup_free_ DHCPPacket *packet = NULL;
size_t offset; sd_dhcp_option *j;
be32_t lease_time; be32_t lease_time;
size_t offset;
int r; int r;
r = server_message_init(server, &packet, DHCP_OFFER, &offset, req); assert(server);
assert(req);
assert(IN_SET(type, DHCP_OFFER, DHCP_ACK));
r = server_message_init(server, &packet, type, &offset, req);
if (r < 0) if (r < 0)
return r; return r;
@ -457,18 +466,7 @@ static int server_send_offer(sd_dhcp_server *server, DHCPRequest *req,
return r; return r;
} }
r = dhcp_server_send_packet(server, req, packet, DHCP_OFFER, offset); if (type == DHCP_ACK) {
if (r < 0)
return r;
return 0;
}
static int server_send_ack(
sd_dhcp_server *server,
DHCPRequest *req,
be32_t address) {
static const uint8_t option_map[_SD_DHCP_LEASE_SERVER_TYPE_MAX] = { static const uint8_t option_map[_SD_DHCP_LEASE_SERVER_TYPE_MAX] = {
[SD_DHCP_LEASE_DNS] = SD_DHCP_OPTION_DOMAIN_NAME_SERVER, [SD_DHCP_LEASE_DNS] = SD_DHCP_OPTION_DOMAIN_NAME_SERVER,
[SD_DHCP_LEASE_NTP] = SD_DHCP_OPTION_NTP_SERVER, [SD_DHCP_LEASE_NTP] = SD_DHCP_OPTION_NTP_SERVER,
@ -478,46 +476,15 @@ static int server_send_ack(
[SD_DHCP_LEASE_LPR] = SD_DHCP_OPTION_LPR_SERVER, [SD_DHCP_LEASE_LPR] = SD_DHCP_OPTION_LPR_SERVER,
}; };
_cleanup_free_ DHCPPacket *packet = NULL;
be32_t lease_time;
sd_dhcp_option *j;
size_t offset;
int r;
r = server_message_init(server, &packet, DHCP_ACK, &offset, req);
if (r < 0)
return r;
packet->dhcp.yiaddr = address;
lease_time = htobe32(req->lifetime);
r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
SD_DHCP_OPTION_IP_ADDRESS_LEASE_TIME, 4,
&lease_time);
if (r < 0)
return r;
r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
SD_DHCP_OPTION_SUBNET_MASK, 4, &server->netmask);
if (r < 0)
return r;
if (server->emit_router) {
r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
SD_DHCP_OPTION_ROUTER, 4, &server->address);
if (r < 0)
return r;
}
for (sd_dhcp_lease_server_type_t k = 0; k < _SD_DHCP_LEASE_SERVER_TYPE_MAX; k++) { for (sd_dhcp_lease_server_type_t k = 0; k < _SD_DHCP_LEASE_SERVER_TYPE_MAX; k++) {
if (server->servers[k].size <= 0) if (server->servers[k].size <= 0)
continue; continue;
r = dhcp_option_append( r = dhcp_option_append(
&packet->dhcp, req->max_optlen, &offset, 0, &packet->dhcp, req->max_optlen, &offset, 0,
option_map[k], option_map[k],
sizeof(struct in_addr) * server->servers[k].size, server->servers[k].addr); sizeof(struct in_addr) * server->servers[k].size,
server->servers[k].addr);
if (r < 0) if (r < 0)
return r; return r;
} }
@ -531,6 +498,7 @@ static int server_send_ack(
if (r < 0) if (r < 0)
return r; return r;
} }
}
ORDERED_SET_FOREACH(j, server->extra_options) { ORDERED_SET_FOREACH(j, server->extra_options) {
r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0, r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
@ -548,7 +516,7 @@ static int server_send_ack(
return r; return r;
} }
r = dhcp_server_send_packet(server, req, packet, DHCP_ACK, offset); r = dhcp_server_send_packet(server, req, packet, type, offset);
if (r < 0) if (r < 0)
return r; return r;
@ -783,7 +751,7 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message,
/* no free addresses left */ /* no free addresses left */
return 0; return 0;
r = server_send_offer(server, req, address); r = server_send_offer_or_ack(server, req, address, DHCP_OFFER);
if (r < 0) if (r < 0)
/* this only fails on critical errors */ /* this only fails on critical errors */
return log_dhcp_server_errno(server, r, "Could not send offer: %m"); return log_dhcp_server_errno(server, r, "Could not send offer: %m");
@ -886,7 +854,7 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message,
lease->expiration = req->lifetime * USEC_PER_SEC + time_now; lease->expiration = req->lifetime * USEC_PER_SEC + time_now;
r = server_send_ack(server, req, address); r = server_send_offer_or_ack(server, req, address, DHCP_ACK);
if (r < 0) { if (r < 0) {
/* this only fails on critical errors */ /* this only fails on critical errors */
log_dhcp_server_errno(server, r, "Could not send ack: %m"); log_dhcp_server_errno(server, r, "Could not send ack: %m");

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) { int netdev_load_one(Manager *manager, const char *filename) {
_cleanup_(netdev_unrefp) NetDev *netdev_raw = NULL, *netdev = NULL; _cleanup_(netdev_unrefp) NetDev *netdev_raw = NULL, *netdev = NULL;
_cleanup_fclose_ FILE *file = NULL;
const char *dropin_dirname; const char *dropin_dirname;
bool independent = false; bool independent = false;
int r; int r;
@ -664,15 +663,12 @@ int netdev_load_one(Manager *manager, const char *filename) {
assert(manager); assert(manager);
assert(filename); assert(filename);
file = fopen(filename, "re"); r = null_or_empty_path(filename);
if (!file) { if (r == -ENOENT)
if (errno == ENOENT)
return 0; return 0;
if (r < 0)
return -errno; return r;
} if (r > 0) {
if (null_or_empty_fd(fileno(file))) {
log_debug("Skipping empty file: %s", filename); log_debug("Skipping empty file: %s", filename);
return 0; return 0;
} }
@ -714,10 +710,6 @@ int netdev_load_one(Manager *manager, const char *filename) {
return 0; return 0;
} }
r = fseek(file, 0, SEEK_SET);
if (r < 0)
return -errno;
netdev = malloc0(NETDEV_VTABLE(netdev_raw)->object_size); netdev = malloc0(NETDEV_VTABLE(netdev_raw)->object_size);
if (!netdev) if (!netdev)
return log_oom(); 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) { int network_load_one(Manager *manager, OrderedHashmap **networks, const char *filename) {
_cleanup_free_ char *fname = NULL, *name = NULL; _cleanup_free_ char *fname = NULL, *name = NULL;
_cleanup_(network_unrefp) Network *network = NULL; _cleanup_(network_unrefp) Network *network = NULL;
_cleanup_fclose_ FILE *file = NULL;
const char *dropin_dirname; const char *dropin_dirname;
char *d; char *d;
int r; int r;
@ -296,15 +295,12 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
assert(manager); assert(manager);
assert(filename); assert(filename);
file = fopen(filename, "re"); r = null_or_empty_path(filename);
if (!file) { if (r == -ENOENT)
if (errno == ENOENT)
return 0; return 0;
if (r < 0)
return -errno; return r;
} if (r > 0) {
if (null_or_empty_fd(fileno(file))) {
log_debug("Skipping empty file: %s", filename); log_debug("Skipping empty file: %s", filename);
return 0; return 0;
} }

View File

@ -1335,8 +1335,8 @@ static int unit_file_load_or_readlink(
const char *path, const char *path,
const char *root_dir, const char *root_dir,
SearchFlags flags) { SearchFlags flags) {
_cleanup_free_ char *resolved = NULL; _cleanup_free_ char *resolved = NULL;
struct stat st;
int r; int r;
r = unit_file_load(c, info, path, root_dir, flags); 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. */ * so let's see if the path is a (possibly dangling) symlink to /dev/null. */
info->type = UNIT_FILE_TYPE_MASKED; info->type = UNIT_FILE_TYPE_MASKED;
else if (r > 0 && else if (r > 0 && null_or_empty_path(resolved) > 0)
stat(resolved, &st) >= 0 &&
null_or_empty(&st))
info->type = UNIT_FILE_TYPE_MASKED; 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) { int link_load_one(link_config_ctx *ctx, const char *filename) {
_cleanup_(link_config_freep) link_config *link = NULL; _cleanup_(link_config_freep) link_config *link = NULL;
_cleanup_fclose_ FILE *file = NULL;
_cleanup_free_ char *name = NULL; _cleanup_free_ char *name = NULL;
const char *dropin_dirname;
size_t i; size_t i;
int r; int r;
assert(ctx); assert(ctx);
assert(filename); assert(filename);
file = fopen(filename, "re"); r = null_or_empty_path(filename);
if (!file) if (r == -ENOENT)
return errno == ENOENT ? 0 : -errno; return 0;
if (r < 0)
if (null_or_empty_fd(fileno(file))) { return r;
if (r > 0) {
log_debug("Skipping empty file: %s", filename); log_debug("Skipping empty file: %s", filename);
return 0; 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++) for (i = 0; i < ELEMENTSOF(link->features); i++)
link->features[i] = -1; link->features[i] = -1;
r = config_parse(NULL, filename, file, 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", "Match\0Link\0",
config_item_perf_lookup, link_config_gperf_lookup, config_item_perf_lookup, link_config_gperf_lookup,
CONFIG_PARSE_WARN, link, CONFIG_PARSE_WARN, link, NULL);
NULL);
if (r < 0) if (r < 0)
return r; return r;