#if HAVE_PAM
-static void pam_response_free_array(struct pam_response *responses, size_t n_responses) {
- assert(responses || n_responses == 0);
-
- FOREACH_ARRAY(resp, responses, n_responses)
- erase_and_free(resp->resp);
-
- free(responses);
+static void pam_response_done(struct pam_response *response) {
+ erase_and_free(ASSERT_PTR(response)->resp);
}
+static DEFINE_ARRAY_FREE_FUNC(pam_response_free_array, struct pam_response, pam_response_done);
+
typedef struct AskPasswordConvData {
const ExecContext *context;
const ExecParameters *params;
return strcmp(a->filename, b->filename);
}
-static void vacuum_info_array_free(VacuumInfo *list, size_t n) {
- if (!list)
- return;
-
- FOREACH_ARRAY(i, list, n)
- free(i->filename);
-
- free(list);
+static void vacuum_info_done(VacuumInfo *info) {
+ assert(info);
+ info->filename = mfree(info->filename);
}
+static DEFINE_ARRAY_FREE_FUNC(vacuum_info_array_free, VacuumInfo, vacuum_info_done);
+
static void patch_realtime(
int fd,
const char *fn,
return portable_changes_add(changes, n_changes, type_or_errno, path, source);
}
-void portable_changes_free(PortableChange *changes, size_t n_changes) {
- size_t i;
-
- assert(changes || n_changes == 0);
-
- for (i = 0; i < n_changes; i++) {
- free(changes[i].path);
- free(changes[i].source);
- }
-
- free(changes);
+static void portable_change_done(PortableChange *change) {
+ assert(change);
+ change->path = mfree(change->path);
+ change->source = mfree(change->source);
}
+DEFINE_ARRAY_FREE_FUNC(portable_changes_free, PortableChange, portable_change_done);
+
static const char *root_setting_from_image(ImageType type) {
switch (type) {
case IMAGE_DIRECTORY:
int portable_get_profiles(RuntimeScope scope, char ***ret);
-void portable_changes_free(PortableChange *changes, size_t n_changes);
+void portable_changes_free(PortableChange *array, size_t n);
DECLARE_STRING_TABLE_LOOKUP(portable_change_type, int);
return type;
}
-void install_changes_free(InstallChange *changes, size_t n_changes) {
- assert(changes || n_changes == 0);
-
- FOREACH_ARRAY(i, changes, n_changes) {
- free(i->path);
- free(i->source);
- }
+static void install_change_done(InstallChange *change) {
+ assert(change);
- free(changes);
+ change->path = mfree(change->path);
+ change->source = mfree(change->source);
}
+DEFINE_ARRAY_FREE_FUNC(install_changes_free, InstallChange, install_change_done);
+
static void install_change_dump_success(const InstallChange *change) {
assert(change);
assert(change->path);
int unit_file_get_list(RuntimeScope scope, const char *root_dir, char * const *states, char * const *patterns, Hashmap **ret);
InstallChangeType install_changes_add(InstallChange **changes, size_t *n_changes, InstallChangeType type, const char *path, const char *source);
-void install_changes_free(InstallChange *changes, size_t n_changes);
+void install_changes_free(InstallChange *array, size_t n);
int install_change_dump_error(const InstallChange *change, char **ret_errmsg, const char **ret_bus_error);
int install_changes_dump(
s->mount_fd = safe_close(s->mount_fd);
}
-void sub_mount_array_free(SubMount *s, size_t n) {
- assert(s || n == 0);
-
- for (size_t i = 0; i < n; i++)
- sub_mount_clear(s + i);
-
- free(s);
-}
+DEFINE_ARRAY_FREE_FUNC(sub_mount_array_free, SubMount, sub_mount_clear);
#if HAVE_LIBMOUNT
static int sub_mount_compare(const SubMount *a, const SubMount *b) {
int mount_fd;
} SubMount;
-void sub_mount_array_free(SubMount *s, size_t n);
+void sub_mount_array_free(SubMount *array, size_t n);
int get_sub_mounts(const char *prefix, SubMount **ret_mounts, size_t *ret_n_mounts);
int bind_mount_submounts(