From: Yu Watanabe Date: Sat, 23 Jul 2022 06:02:48 +0000 (+0900) Subject: conf-parser: add a boolean flag for config_get_stats_by_path() to control if drop... X-Git-Tag: v252-rc1~589^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3f4dfd9d8791d488835e6bf262254fa1d28866a2;p=thirdparty%2Fsystemd.git conf-parser: add a boolean flag for config_get_stats_by_path() to control if drop-in configs are checked Preparation for later commits. --- diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index 6bd3ab38db8..9a888eec219 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -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; } diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h index 07b6490165a..15616adf3b5 100644 --- a/src/shared/conf-parser.h +++ b/src/shared/conf-parser.h @@ -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); diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 8fdb48f315b..693f5cd3a60 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -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; }