}
/* 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))
#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);