MountImage *mount_images = NULL;
size_t n_mount_images = 0;
- CLEANUP_ARRAY(mount_images, n_mount_images, mount_image_free_many);
+ CLEANUP_ARRAY(mount_images, n_mount_images, mount_image_free_array);
r = sd_bus_message_enter_container(message, 'a', "(ssba(ss))");
if (r < 0)
if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
if (n_mount_images == 0) {
- mount_image_free_many(c->mount_images, c->n_mount_images);
+ mount_image_free_array(c->mount_images, c->n_mount_images);
c->mount_images = NULL;
c->n_mount_images = 0;
MountImage *extension_images = NULL;
size_t n_extension_images = 0;
- CLEANUP_ARRAY(extension_images, n_extension_images, mount_image_free_many);
+ CLEANUP_ARRAY(extension_images, n_extension_images, mount_image_free_array);
r = sd_bus_message_enter_container(message, 'a', "(sba(ss))");
if (r < 0)
if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
if (n_extension_images == 0) {
- mount_image_free_many(c->extension_images, c->n_extension_images);
+ mount_image_free_array(c->extension_images, c->n_extension_images);
c->extension_images = NULL;
c->n_extension_images = 0;
bind_mount_free_many(c->bind_mounts, c->n_bind_mounts);
c->bind_mounts = NULL;
c->n_bind_mounts = 0;
- mount_image_free_many(c->mount_images, c->n_mount_images);
+ mount_image_free_array(c->mount_images, c->n_mount_images);
c->mount_images = NULL;
c->n_mount_images = 0;
- mount_image_free_many(c->extension_images, c->n_extension_images);
+ mount_image_free_array(c->extension_images, c->n_extension_images);
c->extension_images = NULL;
c->n_extension_images = 0;
c->extension_directories = strv_free(c->extension_directories);
if (isempty(rvalue)) {
/* Empty assignment resets the list */
- mount_image_free_many(c->mount_images, c->n_mount_images);
+ mount_image_free_array(c->mount_images, c->n_mount_images);
c->mount_images = NULL;
c->n_mount_images = 0;
return 0;
if (isempty(rvalue)) {
/* Empty assignment resets the list */
- mount_image_free_many(c->extension_images, c->n_extension_images);
+ mount_image_free_array(c->extension_images, c->n_extension_images);
c->extension_images = NULL;
c->n_extension_images = 0;
return 0;
return 0;
}
-void mount_image_free_many(MountImage *m, size_t n) {
- assert(m || n == 0);
-
- FOREACH_ARRAY(i, m, n) {
- free(i->source);
- free(i->destination);
- mount_options_free_all(i->mount_options);
- }
-
- free(m);
+static void mount_image_done(MountImage *m) {
+ assert(m);
+ m->source = mfree(m->source);
+ m->destination = mfree(m->destination);
+ m->mount_options = mount_options_free_all(m->mount_options);
}
+DEFINE_ARRAY_FREE_FUNC(mount_image_free_array, MountImage, mount_image_done);
+
int mount_image_add(MountImage **m, size_t *n, const MountImage *item) {
_cleanup_free_ char *s = NULL, *d = NULL;
_cleanup_(mount_options_free_allp) MountOptions *o = NULL;
void bind_mount_free_many(BindMount *b, size_t n);
int bind_mount_add(BindMount **b, size_t *n, const BindMount *item);
-void mount_image_free_many(MountImage *m, size_t n);
+void mount_image_free_array(MountImage *array, size_t n);
int mount_image_add(MountImage **m, size_t *n, const MountImage *item);
void temporary_filesystem_free_many(TemporaryFileSystem *t, size_t n);
free(array); \
}
+/* Clean up an array of objects of known size by dropping all the items in it.
+ * Then free the array itself. */
+#define DEFINE_ARRAY_FREE_FUNC(name, type, helper) \
+ void name(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 */