mirror of
https://github.com/systemd/systemd.git
synced 2026-08-03 22:50:29 +00:00
conf-parser: add a boolean flag for config_get_stats_by_path() to control if drop-in configs are checked
Preparation for later commits.
This commit is contained in:
@@ -605,22 +605,19 @@ int config_parse_many(
|
||||
return config_parse_many_files(conf_files, files, sections, lookup, table, flags, userdata, ret_stats_by_path);
|
||||
}
|
||||
|
||||
static int config_get_stats_by_path_one(
|
||||
static int dropins_get_stats_by_path(
|
||||
const char* conf_file,
|
||||
const char* const* conf_file_dirs,
|
||||
Hashmap *stats_by_path) {
|
||||
Hashmap **stats_by_path) {
|
||||
|
||||
_cleanup_strv_free_ char **files = NULL;
|
||||
_cleanup_free_ char *dropin_dirname = NULL;
|
||||
struct stat st;
|
||||
int r;
|
||||
|
||||
assert(conf_file);
|
||||
assert(conf_file_dirs);
|
||||
assert(stats_by_path);
|
||||
|
||||
/* Unlike config_parse(), this does not support stream. */
|
||||
|
||||
r = path_extract_filename(conf_file, &dropin_dirname);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@@ -634,17 +631,9 @@ static int config_get_stats_by_path_one(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
/* First read the main config file. */
|
||||
r = RET_NERRNO(stat(conf_file, &st));
|
||||
if (r >= 0) {
|
||||
r = hashmap_put_stats_by_path(&stats_by_path, conf_file, &st);
|
||||
if (r < 0)
|
||||
return r;
|
||||
} else if (r != -ENOENT)
|
||||
return r;
|
||||
|
||||
/* Then read all the drop-ins. */
|
||||
STRV_FOREACH(fn, files) {
|
||||
struct stat st;
|
||||
|
||||
if (stat(*fn, &st) < 0) {
|
||||
if (errno == ENOENT)
|
||||
continue;
|
||||
@@ -652,7 +641,7 @@ static int config_get_stats_by_path_one(
|
||||
return -errno;
|
||||
}
|
||||
|
||||
r = hashmap_put_stats_by_path(&stats_by_path, *fn, &st);
|
||||
r = hashmap_put_stats_by_path(stats_by_path, *fn, &st);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
@@ -665,6 +654,7 @@ int config_get_stats_by_path(
|
||||
const char *root,
|
||||
unsigned flags,
|
||||
const char* const* dirs,
|
||||
bool check_dropins,
|
||||
Hashmap **ret) {
|
||||
|
||||
_cleanup_hashmap_free_ Hashmap *stats_by_path = NULL;
|
||||
@@ -675,16 +665,32 @@ int config_get_stats_by_path(
|
||||
assert(dirs);
|
||||
assert(ret);
|
||||
|
||||
/* Unlike config_parse(), this does not support stream. */
|
||||
|
||||
r = conf_files_list_strv(&files, suffix, root, flags, dirs);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
stats_by_path = hashmap_new(&path_hash_ops_free_free);
|
||||
if (!stats_by_path)
|
||||
return -ENOMEM;
|
||||
|
||||
STRV_FOREACH(f, files) {
|
||||
r = config_get_stats_by_path_one(*f, dirs, stats_by_path);
|
||||
struct stat st;
|
||||
|
||||
/* First read the main config file. */
|
||||
if (stat(*f, &st) < 0) {
|
||||
if (errno == ENOENT)
|
||||
continue;
|
||||
|
||||
return -errno;
|
||||
}
|
||||
|
||||
r = hashmap_put_stats_by_path(&stats_by_path, *f, &st);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (!check_dropins)
|
||||
continue;
|
||||
|
||||
/* Then read all the drop-ins if requested. */
|
||||
r = dropins_get_stats_by_path(*f, dirs, &stats_by_path);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -119,6 +119,7 @@ int config_get_stats_by_path(
|
||||
const char *root,
|
||||
unsigned flags,
|
||||
const char* const* dirs,
|
||||
bool check_dropins,
|
||||
Hashmap **ret);
|
||||
|
||||
bool stats_by_path_equal(Hashmap *a, Hashmap *b);
|
||||
|
||||
@@ -347,9 +347,9 @@ bool link_config_should_reload(LinkConfigContext *ctx) {
|
||||
|
||||
assert(ctx);
|
||||
|
||||
r = config_get_stats_by_path(".link", NULL, 0, NETWORK_DIRS, &stats_by_path);
|
||||
r = config_get_stats_by_path(".link", NULL, 0, NETWORK_DIRS, /* check_dropins = */ true, &stats_by_path);
|
||||
if (r < 0) {
|
||||
log_warning_errno(r, "Failed to get stats of .link files: %m");
|
||||
log_warning_errno(r, "Failed to get stats of .link files, ignoring: %m");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user