systemd: add upstream patch to expand the list of rules.d directories

Unlike eudev, which is used on images without systemd, the list of paths
systemd-udev uses to look for rules is very limited. Include an upstream patch
(commit 116b91e8ccfee1d44fc2b140d831d688e3747902 in the systemd repo) that
expands said list.

This fixes an issue with crda's regulatory domain rule file, which was being
excluded due to it being in a path systemd-udev was ignoring (/usr/lib/udev).
Because of this, the regulatory domain was never set properly and hostapd was
failing when configured to use 5GHz channels (which is the default config).

https://jira.digi.com/browse/DEL-6504

Signed-off-by: Gabriel Valcazar <gabriel.valcazar@digi.com>
This commit is contained in:
Gabriel Valcazar 2019-03-14 11:46:35 +01:00
parent ae2abd926a
commit 1ddd7e57ee
2 changed files with 110 additions and 1 deletions

View File

@ -0,0 +1,109 @@
From: Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Date: Thu, 3 Jan 2019 12:31:06 +0100
Subject: [PATCH] udev: use the usual set of load paths for udev rules
This adds /usr/local/lib/udev/rules.d to the search path on non-split-usr systems.
On split-usr systems, the paths with /usr/-prefixes are added too.
In the past, on split-usr systems, it made sense to only load rules from
/lib/udev/rules.d, because /usr could be mounted late. But we don't support running
without /usr since 80758717a63, so in practice it doesn't matter whether the
rules files are in /lib/udev/rules.d or /usr/lib/udev/rules.d. Distributions
that maintain the illusion of functional split-usr are welcome to simply not put any
files in /usr/lib/udev/rules.d/.
In practice this doesn't change much, but it makes udev more consistent with the
rest of the systemd suite.
---
man/udev.xml | 26 ++++++++++++--------------
src/udev/udev-rules.c | 13 ++++---------
2 files changed, 16 insertions(+), 23 deletions(-)
diff --git a/man/udev.xml b/man/udev.xml
index 15e6d8e..955aff8 100644
--- a/man/udev.xml
+++ b/man/udev.xml
@@ -45,20 +45,18 @@
</refsect1>
<refsect1><title>Rules Files</title>
- <para>The udev rules are read from the files located in the
- system rules directory <filename>/usr/lib/udev/rules.d</filename>,
- the volatile runtime directory <filename>/run/udev/rules.d</filename>
- and the local administration directory <filename>/etc/udev/rules.d</filename>.
- All rules 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 rules file with a local file if needed;
- a symlink in <filename>/etc</filename> with the same name as a rules file in
- <filename>/usr/lib</filename>, pointing to <filename>/dev/null</filename>,
- disables the rules file entirely. Rule files must have the extension
- <filename>.rules</filename>; other extensions are ignored.</para>
+ <para>The udev rules are read from the files located in the system rules directories
+ <filename>/usr/lib/udev/rules.d</filename> and <filename>/usr/local/lib/udev/rules.d</filename>, the
+ volatile runtime directory <filename>/run/udev/rules.d</filename> and the local administration
+ directory <filename>/etc/udev/rules.d</filename>. All rules 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 under
+ <filename>/usr</filename>. This can be used to override a system-supplied rules file with a local
+ file if needed; a symlink in <filename>/etc</filename> with the same name as a rules file in
+ <filename>/usr/lib</filename>, pointing to <filename>/dev/null</filename>, disables the rules file
+ entirely. Rule files must have the extension <filename>.rules</filename>; other extensions are
+ ignored.</para>
<para>Every line in the rules file contains at least one key-value pair.
Except for empty lines or lines beginning with <literal>#</literal>, which are ignored.
diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c
index f029395..cd8f4ef 100644
--- a/src/udev/udev-rules.c
+++ b/src/udev/udev-rules.c
@@ -18,6 +18,7 @@
#include "alloc-util.h"
#include "conf-files.h"
+#include "def.h"
#include "dirent-util.h"
#include "escape.h"
#include "fd-util.h"
@@ -36,6 +37,7 @@
#include "util.h"
#define PREALLOC_TOKEN 2048
+#define RULES_DIRS (const char* const*) CONF_PATHS_STRV("udev/rules.d")
struct uid_gid {
unsigned int name_off;
@@ -45,13 +47,6 @@ struct uid_gid {
};
};
-static const char* const rules_dirs[] = {
- "/etc/udev/rules.d",
- "/run/udev/rules.d",
- UDEVLIBEXECDIR "/rules.d",
- NULL
-};
-
struct udev_rules {
struct udev *udev;
usec_t dirs_ts_usec;
@@ -1542,7 +1537,7 @@ struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names) {
udev_rules_check_timestamp(rules);
- r = conf_files_list_strv(&files, ".rules", NULL, 0, rules_dirs);
+ r = conf_files_list_strv(&files, ".rules", NULL, 0, RULES_DIRS);
if (r < 0) {
log_error_errno(r, "failed to enumerate rules files: %m");
return udev_rules_unref(rules);
@@ -1598,7 +1593,7 @@ bool udev_rules_check_timestamp(struct udev_rules *rules) {
if (!rules)
return false;
- return paths_check_timestamp(rules_dirs, &rules->dirs_ts_usec, true);
+ return paths_check_timestamp(RULES_DIRS, &rules->dirs_ts_usec, true);
}
static int match_key(struct udev_rules *rules, struct token *token, const char *val) {

View File

@ -1,6 +1,6 @@
FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
SRC_URI += "file://0001-udev-use-the-usual-set-of-load-paths-for-udev-rules.patch"
#FIX-it: Workaround as missing ending slash in FIRMWARE_PATH [YOCIMX-2831]
EXTRA_OEMESON_remove = "-Dfirmware-path=${nonarch_base_libdir}/firmware "