udevd: allow more parameters to be set through udev.conf

Rebooting to set change the kernel command line to set some udev parameters is
inconvenient. Let's allow setting more stuff in the config file.

Also drop quotes from around "info" in udev.conf. We need to accept them for
compatibility, but there is no reason to use them.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2018-11-13 14:03:47 +01:00
parent 66f737b415
commit 4b3ca79ea9
5 changed files with 104 additions and 24 deletions
+52 -20
View File
@@ -6,36 +6,68 @@
#include "alloc-util.h"
#include "fileio.h"
#include "log.h"
#include "parse-util.h"
#include "string-util.h"
#include "udev-util.h"
#include "udev.h"
int udev_parse_config(void) {
_cleanup_free_ char *val = NULL;
const char *log;
size_t n;
int udev_parse_config_full(
unsigned *ret_children_max,
usec_t *ret_exec_delay_usec,
usec_t *ret_event_timeout_usec) {
_cleanup_free_ char *log_val = NULL, *children_max = NULL, *exec_delay = NULL, *event_timeout = NULL;
int r;
r = parse_env_file(NULL, "/etc/udev/udev.conf", NEWLINE, "udev_log", &val, NULL);
if (r == -ENOENT || !val)
r = parse_env_file(NULL, "/etc/udev/udev.conf", NEWLINE,
"udev_log", &log_val,
"children_max", &children_max,
"exec_delay", &exec_delay,
"event_timeout", &event_timeout,
NULL);
if (r == -ENOENT)
return 0;
if (r < 0)
return r;
/* unquote */
n = strlen(val);
if (n >= 2 &&
((val[0] == '"' && val[n-1] == '"') ||
(val[0] == '\'' && val[n-1] == '\''))) {
val[n - 1] = '\0';
log = val + 1;
} else
log = val;
if (log_val) {
const char *log;
size_t n;
/* we set the udev log level here explicitly, this is supposed
* to regulate the code in libudev/ and udev/. */
r = log_set_max_level_from_string_realm(LOG_REALM_UDEV, log);
if (r < 0)
log_debug_errno(r, "/etc/udev/udev.conf: failed to set udev log level '%s', ignoring: %m", log);
/* unquote */
n = strlen(log_val);
if (n >= 2 &&
((log_val[0] == '"' && log_val[n-1] == '"') ||
(log_val[0] == '\'' && log_val[n-1] == '\''))) {
log_val[n - 1] = '\0';
log = log_val + 1;
} else
log = log_val;
/* we set the udev log level here explicitly, this is supposed
* to regulate the code in libudev/ and udev/. */
r = log_set_max_level_from_string_realm(LOG_REALM_UDEV, log);
if (r < 0)
log_debug_errno(r, "/etc/udev/udev.conf: failed to set udev log level '%s', ignoring: %m", log);
}
if (ret_children_max && children_max) {
r = safe_atou(children_max, ret_children_max);
if (r < 0)
log_notice_errno(r, "/etc/udev/udev.conf: failed to set parse children_max=%s, ignoring: %m", children_max);
}
if (ret_exec_delay_usec && exec_delay) {
r = parse_sec(exec_delay, ret_exec_delay_usec);
if (r < 0)
log_notice_errno(r, "/etc/udev/udev.conf: failed to set parse exec_delay=%s, ignoring: %m", exec_delay);
}
if (ret_event_timeout_usec && event_timeout) {
r = parse_sec(event_timeout, ret_event_timeout_usec);
if (r < 0)
log_notice_errno(r, "/etc/udev/udev.conf: failed to set parse event_timeout=%s, ignoring: %m", event_timeout);
}
return 0;
}
+10 -1
View File
@@ -1,4 +1,13 @@
/* SPDX-License-Identifier: LGPL-2.1+ */
#pragma once
int udev_parse_config(void);
#include "time-util.h"
int udev_parse_config_full(
unsigned *ret_children_max,
usec_t *ret_exec_delay_usec,
usec_t *ret_event_timeout_usec);
static inline int udev_parse_config(void) {
return udev_parse_config_full(NULL, NULL, NULL);
}