sd-path: add new type SD_PATH_SEARCH_SYSCTL (#38680)

Aim of this patches set, is to add a new type SD_PATH_SEARCH_SYSCTL for
sd_path_lookup() and sd_path_lookup_strv(). This new type is used to get the
directories list used by systemd-sysctl:

-  /etc/sysctl.d/
-  /run/sysctl.d/
-  /usr/local/lib/sysctl.d/
-  /usr/lib/sysctl.d/

This implements the change in libsystemd, systemd-path, and systemd-sysctl.
This commit is contained in:
Yu Watanabe
2025-11-12 08:54:09 +09:00
committed by GitHub
5 changed files with 22 additions and 7 deletions

View File

@@ -76,6 +76,7 @@
<constant>SD_PATH_SEARCH_CONFIGURATION_FACTORY</constant>,
<constant>SD_PATH_SEARCH_STATE_FACTORY</constant>,
<constant>SD_PATH_SEARCH_CONFIGURATION</constant>,
<constant>SD_PATH_SEARCH_SYSCTL</constant>,
<constant>SD_PATH_SYSTEMD_UTIL</constant>,
<constant>SD_PATH_SYSTEMD_SYSTEM_UNIT</constant>,

View File

@@ -683,7 +683,11 @@ static int get_search(uint64_t type, char ***ret) {
*ret = TAKE_PTR(l);
return 0;
}}
}
case SD_PATH_SEARCH_SYSCTL:
return strv_from_nulstr(ret, CONF_PATHS_NULSTR("sysctl.d"));
}
return -EOPNOTSUPP;
}

View File

@@ -66,6 +66,7 @@ static const char* const path_table[_SD_PATH_MAX] = {
[SD_PATH_SEARCH_CONFIGURATION_FACTORY] = "search-configuration-factory",
[SD_PATH_SEARCH_STATE_FACTORY] = "search-state-factory",
[SD_PATH_SEARCH_CONFIGURATION] = "search-configuration",
[SD_PATH_SEARCH_SYSCTL] = "search-sysctl",
[SD_PATH_SYSTEMD_UTIL] = "systemd-util",

View File

@@ -4,6 +4,8 @@
#include <stdio.h>
#include <sys/stat.h>
#include "sd-path.h"
#include "alloc-util.h"
#include "build.h"
#include "conf-files.h"
@@ -279,10 +281,10 @@ static int parse_line(const char *fname, unsigned line, const char *buffer, bool
return 0;
}
static int parse_file(OrderedHashmap **sysctl_options, const char *path, bool ignore_enoent) {
static int parse_file(OrderedHashmap **sysctl_options, const char *path, bool ignore_enoent, const char **search_paths) {
return conf_file_read(
/* root = */ NULL,
(const char**) CONF_PATHS_STRV("sysctl.d"),
search_paths,
path,
parse_line,
sysctl_options,
@@ -305,7 +307,7 @@ static int read_credential_lines(OrderedHashmap **sysctl_options) {
if (!j)
return log_oom();
return parse_file(sysctl_options, j, /* ignore_enoent= */ true);
return parse_file(sysctl_options, j, /* ignore_enoent= */ true, /* search_paths= */ NULL);
}
static int cat_config(char **files) {
@@ -440,8 +442,13 @@ static int parse_argv(int argc, char *argv[]) {
static int run(int argc, char *argv[]) {
_cleanup_ordered_hashmap_free_ OrderedHashmap *sysctl_options = NULL;
_cleanup_strv_free_ char **search_paths = NULL;
int r;
r = sd_path_lookup_strv(SD_PATH_SEARCH_SYSCTL, /* suffix= */ NULL, &search_paths);
if (r < 0)
return log_error_errno(r, "Failed to get sysctl.d/ search paths: %m");
r = parse_argv(argc, argv);
if (r <= 0)
return r;
@@ -458,12 +465,12 @@ static int run(int argc, char *argv[]) {
/* Use (argument):n, where n==1 for the first positional arg */
RET_GATHER(r, parse_line("(argument)", ++pos, *arg, /* invalid_config = */ NULL, &sysctl_options));
else
RET_GATHER(r, parse_file(&sysctl_options, *arg, false));
RET_GATHER(r, parse_file(&sysctl_options, *arg, /* ignore_enoent= */ false, (const char**) search_paths));
}
} else {
_cleanup_strv_free_ char **files = NULL;
r = conf_files_list_strv(&files, ".conf", NULL, 0, (const char**) CONF_PATHS_STRV("sysctl.d"));
r = conf_files_list_strv(&files, ".conf", NULL, 0, (const char**) search_paths);
if (r < 0)
return log_error_errno(r, "Failed to enumerate sysctl.d files: %m");
@@ -471,7 +478,7 @@ static int run(int argc, char *argv[]) {
return cat_config(files);
STRV_FOREACH(f, files)
RET_GATHER(r, parse_file(&sysctl_options, *f, true));
RET_GATHER(r, parse_file(&sysctl_options, *f, /* ignore_enoent= */ true, /* search_paths= */ NULL));
RET_GATHER(r, read_credential_lines(&sysctl_options));
}

View File

@@ -129,6 +129,8 @@ __extension__ enum {
SD_PATH_USER_CREDENTIAL_STORE_ENCRYPTED,
SD_PATH_USER_SEARCH_CREDENTIAL_STORE_ENCRYPTED,
SD_PATH_SEARCH_SYSCTL,
_SD_PATH_MAX,
_SD_PATH_INVALID = UINT64_MAX
};