]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
conf-files: split CONF_FILES_FILTER_MASKED flag into two
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 26 Jun 2025 13:52:17 +0000 (22:52 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 27 Jun 2025 18:54:48 +0000 (03:54 +0900)
src/basic/conf-files.c
src/basic/conf-files.h

index 644bd170cac3b74a5540f4e2cdd7f22e92e2e5d1..2d551425819451aad50a56b52ba3116d8c0b36be 100644 (file)
@@ -63,16 +63,25 @@ static int files_add(
                         }
 
                 /* Is this a masking entry? */
-                if ((flags & CONF_FILES_FILTER_MASKED))
-                        if (null_or_empty(&st)) {
-                                /* Mark this one as masked */
-                                r = set_put_strdup(masked, de->d_name);
-                                if (r < 0)
-                                        return r;
-
-                                log_debug("File '%s/%s' is a mask.", dirpath, de->d_name);
-                                continue;
-                        }
+                if (FLAGS_SET(flags, CONF_FILES_FILTER_MASKED_BY_SYMLINK) && stat_may_be_dev_null(&st)) {
+                        /* Mark this one as masked */
+                        r = set_put_strdup(masked, de->d_name);
+                        if (r < 0)
+                                return r;
+
+                        log_debug("File '%s/%s' is a mask (symlink to /dev/null).", dirpath, de->d_name);
+                        continue;
+                }
+
+                if (FLAGS_SET(flags, CONF_FILES_FILTER_MASKED_BY_EMPTY) && stat_is_empty(&st)) {
+                        /* Mark this one as masked */
+                        r = set_put_strdup(masked, de->d_name);
+                        if (r < 0)
+                                return r;
+
+                        log_debug("File '%s/%s' is a mask (an empty file).", dirpath, de->d_name);
+                        continue;
+                }
 
                 /* Does this node have the right type? */
                 if (flags & (CONF_FILES_REGULAR|CONF_FILES_DIRECTORY))
index 2bee1448e49a57be05247c355b9de7632ab36531..a1b9af0ea2c04e5dde4b3a6066766af31ac59cd8 100644 (file)
@@ -4,11 +4,13 @@
 #include "forward.h"
 
 typedef enum ConfFilesFlags {
-        CONF_FILES_EXECUTABLE    = 1 << 0,
-        CONF_FILES_REGULAR       = 1 << 1,
-        CONF_FILES_DIRECTORY     = 1 << 2,
-        CONF_FILES_BASENAME      = 1 << 3,
-        CONF_FILES_FILTER_MASKED = 1 << 4,
+        CONF_FILES_EXECUTABLE               = 1 << 0,
+        CONF_FILES_REGULAR                  = 1 << 1,
+        CONF_FILES_DIRECTORY                = 1 << 2,
+        CONF_FILES_BASENAME                 = 1 << 3,
+        CONF_FILES_FILTER_MASKED_BY_SYMLINK = 1 << 4,
+        CONF_FILES_FILTER_MASKED_BY_EMPTY   = 1 << 5,
+        CONF_FILES_FILTER_MASKED            = CONF_FILES_FILTER_MASKED_BY_SYMLINK | CONF_FILES_FILTER_MASKED_BY_EMPTY,
 } ConfFilesFlags;
 
 int conf_files_list(char ***ret, const char *suffix, const char *root, ConfFilesFlags flags, const char *dir);