logind: Support logind.conf.d directories in the usual search paths

This makes it possible to drop in logind configuration snippets from a
package or other configuration management mechanism.

Add documentation to the header of /etc/logind.conf pointing the user at
/etc/logind.conf.d/*.conf.

Introduce a new helper, conf_parse_many, to parse configuration files in
a search path.
This commit is contained in:
Josh Triplett 2014-10-29 05:10:48 -07:00 committed by Zbigniew Jędrzejewski-Szmek
parent 7f0a55d432
commit e846102353
5 changed files with 73 additions and 6 deletions

View File

@ -44,18 +44,41 @@
<refnamediv>
<refname>logind.conf</refname>
<refpurpose>Login manager configuration file</refpurpose>
<refpurpose>Login manager configuration files</refpurpose>
</refnamediv>
<refsynopsisdiv>
<para><filename>/etc/systemd/logind.conf</filename></para>
<para><filename>/etc/systemd/logind.conf.d/*.conf</filename></para>
<para><filename>/run/systemd/logind.conf.d/*.conf</filename></para>
<para><filename>/usr/lib/systemd/logind.conf.d/*.conf</filename></para>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
<para>This file configures various parameters of the systemd login manager, <citerefentry><refentrytitle>systemd-logind.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
<para>These files configure various parameters of the systemd login manager, <citerefentry><refentrytitle>systemd-logind.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>.</para>
<para>Each configuration file shall be named in the style of
<filename><replaceable>filename</replaceable>.conf</filename>.
Files in <filename>/etc/</filename> override files with the
same name in <filename>/usr/lib/</filename> and
<filename>/run/</filename>. Files in
<filename>/run/</filename> override files with the same name in
<filename>/usr/lib/</filename>. Packages should install their
configuration files in <filename>/usr/lib/</filename>. Files in
<filename>/etc/</filename> are reserved for the local
administrator, who may use this logic to override the
configuration files installed by vendor packages. All
configuration files are sorted by their filename in
lexicographic order, regardless of which of the directories
they reside in. If multiple files specify the same option, the
entry in the file with the lexicographically latest name will
be applied; entries in any <filename>logind.conf.d</filename>
file override entries in
<filename>/etc/systemd/logind.conf</filename>. It is
recommended to prefix all filenames with a two-digit number and
a dash, to simplify the ordering of the files.</para>
</refsect1>
<refsect1>

View File

@ -1171,10 +1171,11 @@ int manager_run(Manager *m) {
static int manager_parse_config_file(Manager *m) {
assert(m);
return config_parse(NULL, "/etc/systemd/logind.conf", NULL,
"Login\0",
config_item_perf_lookup, logind_gperf_lookup,
false, false, true, m);
return config_parse_many("/etc/systemd/logind.conf",
CONF_DIRS_NULSTR("systemd/logind.conf"),
"Login\0",
config_item_perf_lookup, logind_gperf_lookup,
false, m);
}
int main(int argc, char *argv[]) {

View File

@ -5,6 +5,9 @@
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# You can override the directives in this file by creating files in
# /etc/systemd/logind.conf.d/*.conf.
#
# See logind.conf(5) for details
[Login]

View File

@ -27,6 +27,7 @@
#include <netinet/ether.h>
#include "conf-parser.h"
#include "conf-files.h"
#include "util.h"
#include "macro.h"
#include "strv.h"
@ -430,6 +431,37 @@ int config_parse(const char *unit,
return 0;
}
/* Parse each config file in the specified directories. */
int config_parse_many(const char *conf_file,
const char *conf_file_dirs,
const char *sections,
ConfigItemLookup lookup,
const void *table,
bool relaxed,
void *userdata) {
_cleanup_strv_free_ char **files = NULL;
char **fn;
int r;
r = conf_files_list_nulstr(&files, ".conf", NULL, conf_file_dirs);
if (r < 0)
return r;
if (conf_file) {
r = config_parse(NULL, conf_file, NULL, sections, lookup, table, relaxed, false, true, userdata);
if (r < 0)
return r;
}
STRV_FOREACH(fn, files) {
r = config_parse(NULL, *fn, NULL, sections, lookup, table, relaxed, false, true, userdata);
if (r < 0)
return r;
}
return 0;
}
#define DEFINE_PARSER(type, vartype, conv_func) \
int config_parse_##type(const char *unit, \
const char *filename, \

View File

@ -92,6 +92,14 @@ int config_parse(const char *unit,
bool warn,
void *userdata);
int config_parse_many(const char *conf_file, /* possibly NULL */
const char *conf_file_dirs, /* nulstr */
const char *sections, /* nulstr */
ConfigItemLookup lookup,
const void *table,
bool relaxed,
void *userdata);
/* Generic parsers */
int config_parse_int(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_unsigned(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);