return mfree(c);
}
-void conf_file_free_many(ConfFile **array, size_t n) {
- FOREACH_ARRAY(i, array, n)
- conf_file_free(*i);
-
- free(array);
-}
+DEFINE_POINTER_ARRAY_FREE_FUNC(ConfFile*, conf_file_free);
static int conf_files_log_level(ConfFilesFlags flags) {
return FLAGS_SET(flags, CONF_FILES_WARN) ? LOG_WARNING : LOG_DEBUG;
size_t n_files = 0;
int r;
- CLEANUP_ARRAY(files, n_files, conf_file_free_many);
+ CLEANUP_ARRAY(files, n_files, conf_file_free_array);
assert(ret_files);
assert(ret_n_files);
int log_level = conf_files_log_level(flags);
/* The entries in the array given by hashmap_dump_sorted() are still owned by the hashmap.
- * Hence, do not use conf_file_free_many() for 'entries' */
+ * Hence, do not use conf_file_free_array() for 'entries' */
r = hashmap_dump_sorted(fh, (void***) &files, &n_files);
if (r < 0)
return log_oom_full(log_level);
ConfFile* conf_file_free(ConfFile *c);
DEFINE_TRIVIAL_CLEANUP_FUNC(ConfFile*, conf_file_free);
-void conf_file_free_many(ConfFile **array, size_t n);
+void conf_file_free_array(ConfFile **array, size_t n);
int conf_file_new_at(const char *path, const char *root, int rfd, ConfFilesFlags flags, ConfFile **ret);
int conf_file_new(const char *path, const char *root, ConfFilesFlags flags, ConfFile **ret);
*t = helper(*t); \
}
+/* Clean up an array of pointers to objects by dropping all the items in it.
+ * The size of the array is passed in as a parameter, so NULL items may appear in the middle of the array.
+ * Free the array itself afterwards. */
+#define DEFINE_POINTER_ARRAY_FREE_FUNC(type, helper) \
+ void helper ## _array(type *array, size_t n) { \
+ assert(array || n == 0); \
+ FOREACH_ARRAY(item, array, n) \
+ helper(*item); \
+ free(array); \
+ }
+
typedef void (*free_array_func_t)(void *p, size_t n);
/* An automatic _cleanup_-like logic for destroy arrays (i.e. pointers + size) when leaving scope */
ConfFile **files = NULL;
size_t n_files = 0;
- CLEANUP_ARRAY(files, n_files, conf_file_free_many);
+ CLEANUP_ARRAY(files, n_files, conf_file_free_array);
r = conf_files_list_strv_full(".catalog", root,
CONF_FILES_REGULAR | CONF_FILES_FILTER_MASKED | CONF_FILES_WARN,
ConfFile **files = NULL;
size_t n_files = 0;
- CLEANUP_ARRAY(files, n_files, conf_file_free_many);
+ CLEANUP_ARRAY(files, n_files, conf_file_free_array);
STRV_FOREACH(i, arg_proc_cmdline_modules)
RET_GATHER(ret, modules_list_append_dup(&module_set, *i));
ConfFile **files = NULL;
size_t n_files = 0;
- CLEANUP_ARRAY(files, n_files, conf_file_free_many);
+ CLEANUP_ARRAY(files, n_files, conf_file_free_array);
r = conf_files_list_nulstr_full(
".rr",
ConfFile **files = NULL;
size_t n_files = 0;
- CLEANUP_ARRAY(files, n_files, conf_file_free_many);
+ CLEANUP_ARRAY(files, n_files, conf_file_free_array);
r = conf_files_list_strv_full(".hwdb", root,
CONF_FILES_REGULAR | CONF_FILES_FILTER_MASKED | CONF_FILES_WARN,
/* Then locate the drop-ins, if any */
ConfFile **dropins = NULL;
size_t n_dropins = 0;
- CLEANUP_ARRAY(dropins, n_dropins, conf_file_free_many);
+ CLEANUP_ARRAY(dropins, n_dropins, conf_file_free_array);
r = conf_files_list_strv_full(extension, root, CONF_FILES_REGULAR | CONF_FILES_FILTER_MASKED | CONF_FILES_WARN, (const char* const*) dirs, &dropins, &n_dropins);
if (r < 0)
return log_error_errno(r, "Failed to query file list: %m");
size_t n_files = 0, n_transfers = 0, n_disabled = 0;
int r;
- CLEANUP_ARRAY(files, n_files, conf_file_free_many);
+ CLEANUP_ARRAY(files, n_files, conf_file_free_array);
CLEANUP_ARRAY(transfers, n_transfers, free_transfers);
CLEANUP_ARRAY(disabled, n_disabled, free_transfers);
ConfFile **files = NULL;
size_t n_files = 0;
- CLEANUP_ARRAY(files, n_files, conf_file_free_many);
+ CLEANUP_ARRAY(files, n_files, conf_file_free_array);
r = conf_files_list_strv_full(".feature", arg_root,
CONF_FILES_REGULAR|CONF_FILES_FILTER_MASKED|CONF_FILES_WARN,
ConfFile **directories = NULL;
size_t n_directories = 0;
- CLEANUP_ARRAY(directories, n_directories, conf_file_free_many);
+ CLEANUP_ARRAY(directories, n_directories, conf_file_free_array);
r = conf_files_list_strv_full(".d", arg_root, CONF_FILES_DIRECTORY|CONF_FILES_WARN,
(const char * const *) CONF_PATHS_STRV(""), &directories, &n_directories);
ConfFile **files = NULL;
size_t n_files = 0;
- CLEANUP_ARRAY(files, n_files, conf_file_free_many);
+ CLEANUP_ARRAY(files, n_files, conf_file_free_array);
r = conf_files_list_strv_full(".rules", /* root= */ NULL, CONF_FILES_REGULAR | CONF_FILES_FILTER_MASKED,
(const char* const*) directories, &files, &n_files);
ConfFile **files = NULL;
size_t n_files = 0;
- CLEANUP_ARRAY(files, n_files, conf_file_free_many);
+ CLEANUP_ARRAY(files, n_files, conf_file_free_array);
r = search_rules_files(strv_skip(argv, optind), arg_root, &files, &n_files);
if (r < 0)
ConfFile **f = NULL;
size_t n = 0;
- CLEANUP_ARRAY(f, n, conf_file_free_many);
+ CLEANUP_ARRAY(f, n, conf_file_free_array);
r = conf_files_list_strv_full(".rules", root, CONF_FILES_REGULAR | CONF_FILES_WARN, (const char* const*) STRV_MAKE_CONST(s), &f, &n);
if (r < 0)
if (!GREEDY_REALLOC_APPEND(*files, *n_files, f, n))
return log_oom();
- f = mfree(f); /* The array elements are owned by 'files'. So, conf_file_free_many() must not be called. */
+ f = mfree(f); /* The array elements are owned by 'files'. So, conf_file_free_array() must not be called. */
n = 0;
return 0;
}
size_t n_files = 0;
int r;
- CLEANUP_ARRAY(files, n_files, conf_file_free_many);
+ CLEANUP_ARRAY(files, n_files, conf_file_free_array);
assert(ret_files);
assert(ret_n_files);
ConfFile **files = NULL;
size_t n_files = 0;
- CLEANUP_ARRAY(files, n_files, conf_file_free_many);
+ CLEANUP_ARRAY(files, n_files, conf_file_free_array);
r = search_rules_files(strv_skip(argv, optind), arg_root, &files, &n_files);
if (r < 0)