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

Compare commits

..

No commits in common. "275334c562907c174ec34a81a00e734e0b89ba36" and "329998b36585c460781521ee075fba73bb36929a" have entirely different histories.

8 changed files with 141 additions and 113 deletions

View File

@ -28,9 +28,6 @@
<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>
@ -44,9 +41,8 @@
<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> namespaces read <filename>/etc/systemd/journald@<replaceable>NAMESPACE</replaceable>.conf</filename> with
and associated drop-ins with the namespace identifier filled in. This allows each namespace to carry the namespace identifier filled in. This allows each namespace to carry a distinct configuration. See
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,31 +32,23 @@
<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 network directory <para>The link files are read from the files located in the system
<filename>/usr/lib/systemd/network</filename>, the volatile runtime network directory network directory <filename>/usr/lib/systemd/network</filename>,
<filename>/run/systemd/network</filename>, and the local administration network directory the volatile runtime network directory
<filename>/etc/systemd/network</filename>. Link files must have the extension <filename>/run/systemd/network</filename>, and the local
<filename>.link</filename>; other extensions are ignored. All link files are collectively sorted administration network directory
and processed in lexical order, regardless of the directories in which they live. However, files <filename>/etc/systemd/network</filename>. Link files must have
with identical filenames replace each other. Files in <filename>/etc/</filename> have the highest the extension <filename>.link</filename>; other extensions are
priority, files in <filename>/run/</filename> take precedence over files with the same name in ignored. All link files are collectively sorted and processed in
<filename>/usr/lib/</filename>. This can be used to override a system-supplied link file with a lexical order, regardless of the directories in which they live.
local file if needed. As a special case, an empty file (file size 0) or symlink with the same name However, files with identical filenames replace each other. Files
pointing to <filename>/dev/null</filename> disables the configuration file entirely (it is in <filename>/etc/</filename> have the highest priority, files in
"masked").</para> <filename>/run/</filename> take precedence over files with the same
name in <filename>/usr/lib/</filename>. This can be used to
<para>Along with the link file <filename>foo.link</filename>, a "drop-in" directory override a system-supplied link file with a local file if needed.
<filename>foo.link.d/</filename> may exist. All files with the suffix <literal>.conf</literal> As a special case, an empty file (file size 0) or symlink with the
from this directory will be parsed after the file itself is parsed. This is useful to alter or add same name pointing to <filename>/dev/null</filename> disables the
configuration settings, without having to modify the main configuration file. Each drop-in file configuration file entirely (it is "masked").</para>
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,19 +1625,17 @@ static int server_parse_config_file(Server *s) {
assert(s); assert(s);
if (s->namespace) { if (s->namespace) {
const char *namespaced, *dropin_dirname; const char *namespaced;
/* 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_many( r = config_parse(NULL,
STRV_MAKE_CONST(namespaced), namespaced, NULL,
(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, NULL); CONFIG_PARSE_WARN, s,
NULL);
if (r < 0) if (r < 0)
return r; return r;

View File

@ -425,23 +425,14 @@ static int server_message_init(sd_dhcp_server *server, DHCPPacket **ret,
return 0; return 0;
} }
static int server_send_offer_or_ack( static int server_send_offer(sd_dhcp_server *server, DHCPRequest *req,
sd_dhcp_server *server, be32_t address) {
DHCPRequest *req,
be32_t address,
uint8_t type) {
_cleanup_free_ DHCPPacket *packet = NULL; _cleanup_free_ DHCPPacket *packet = NULL;
sd_dhcp_option *j;
be32_t lease_time;
size_t offset; size_t offset;
be32_t lease_time;
int r; int r;
assert(server); r = server_message_init(server, &packet, DHCP_OFFER, &offset, req);
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;
@ -466,7 +457,18 @@ static int server_send_offer_or_ack(
return r; return r;
} }
if (type == DHCP_ACK) { r = dhcp_server_send_packet(server, req, packet, DHCP_OFFER, offset);
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,
@ -476,15 +478,46 @@ static int server_send_offer_or_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, sizeof(struct in_addr) * server->servers[k].size, server->servers[k].addr);
server->servers[k].addr);
if (r < 0) if (r < 0)
return r; return r;
} }
@ -498,7 +531,6 @@ static int server_send_offer_or_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,
@ -516,7 +548,7 @@ static int server_send_offer_or_ack(
return r; return r;
} }
r = dhcp_server_send_packet(server, req, packet, type, offset); r = dhcp_server_send_packet(server, req, packet, DHCP_ACK, offset);
if (r < 0) if (r < 0)
return r; return r;
@ -751,7 +783,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_or_ack(server, req, address, DHCP_OFFER); r = server_send_offer(server, req, address);
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");
@ -854,7 +886,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_offer_or_ack(server, req, address, DHCP_ACK); r = server_send_ack(server, req, address);
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,6 +656,7 @@ 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;
@ -663,12 +664,15 @@ int netdev_load_one(Manager *manager, const char *filename) {
assert(manager); assert(manager);
assert(filename); assert(filename);
r = null_or_empty_path(filename); file = fopen(filename, "re");
if (r == -ENOENT) if (!file) {
if (errno == ENOENT)
return 0; return 0;
if (r < 0)
return r; return -errno;
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;
} }
@ -710,6 +714,10 @@ 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,6 +288,7 @@ 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;
@ -295,12 +296,15 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
assert(manager); assert(manager);
assert(filename); assert(filename);
r = null_or_empty_path(filename); file = fopen(filename, "re");
if (r == -ENOENT) if (!file) {
if (errno == ENOENT)
return 0; return 0;
if (r < 0)
return r; return -errno;
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,7 +1351,9 @@ 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 && null_or_empty_path(resolved) > 0) else if (r > 0 &&
stat(resolved, &st) >= 0 &&
null_or_empty(&st))
info->type = UNIT_FILE_TYPE_MASKED; info->type = UNIT_FILE_TYPE_MASKED;

View File

@ -110,20 +110,19 @@ 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);
r = null_or_empty_path(filename); file = fopen(filename, "re");
if (r == -ENOENT) if (!file)
return 0; return errno == ENOENT ? 0 : -errno;
if (r < 0)
return r; if (null_or_empty_fd(fileno(file))) {
if (r > 0) {
log_debug("Skipping empty file: %s", filename); log_debug("Skipping empty file: %s", filename);
return 0; return 0;
} }
@ -152,14 +151,11 @@ 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;
dropin_dirname = strjoina(basename(filename), ".d"); r = config_parse(NULL, filename, file,
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, NULL); CONFIG_PARSE_WARN, link,
NULL);
if (r < 0) if (r < 0)
return r; return r;