]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
conf-parser: add a boolean flag for config_get_stats_by_path() to control if drop...
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 23 Jul 2022 06:02:48 +0000 (15:02 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 23 Jul 2022 06:03:48 +0000 (15:03 +0900)
Preparation for later commits.

src/shared/conf-parser.c
src/shared/conf-parser.h
src/udev/net/link-config.c

index 6bd3ab38db8f65e9f4358385a6c0898891cd779d..9a888eec219b86d6ffd49c5df248597c3621ebca 100644 (file)
@@ -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;
         }
index 07b6490165a90d282b71a46bbc432478160a515c..15616adf3b5e2f16e6009e105f7bd2c3c7ad4db9 100644 (file)
@@ -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);
index 8fdb48f315b357730e58b3d63469e5563e1111d6..693f5cd3a60279a5699928b3a3807307d67ea431 100644 (file)
@@ -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;
         }