From 26a11c8671153271ac1a036752714768f64b0bc4 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Wed, 3 Apr 2024 02:14:54 +0200
Subject: [PATCH] lib-sieve: storage: file: Use container_of()

---
 .../storage/file/sieve-file-script-sequence.c |  8 +--
 .../storage/file/sieve-file-script.c          | 54 ++++++++++++-------
 .../storage/file/sieve-file-storage-active.c  |  8 +--
 .../storage/file/sieve-file-storage-list.c    | 10 ++--
 .../storage/file/sieve-file-storage-quota.c   |  2 +-
 .../storage/file/sieve-file-storage-save.c    | 22 ++++----
 .../storage/file/sieve-file-storage.c         | 14 ++---
 7 files changed, 67 insertions(+), 51 deletions(-)

diff --git a/src/lib-sieve/storage/file/sieve-file-script-sequence.c b/src/lib-sieve/storage/file/sieve-file-script-sequence.c
index 277b521a8..ed777872b 100644
--- a/src/lib-sieve/storage/file/sieve-file-script-sequence.c
+++ b/src/lib-sieve/storage/file/sieve-file-script-sequence.c
@@ -128,7 +128,7 @@ sieve_file_storage_get_script_sequence(struct sieve_storage *storage,
 				       enum sieve_error *error_code_r)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	struct sieve_file_script_sequence *fseq = NULL;
 	const char *name = storage->script_name;
 	const char *file;
@@ -201,9 +201,9 @@ sieve_file_script_sequence_next(struct sieve_script_sequence *sseq,
 				enum sieve_error *error_code_r)
 {
 	struct sieve_file_script_sequence *fseq =
-		(struct sieve_file_script_sequence *)sseq;
+		container_of(sseq, struct sieve_file_script_sequence, seq);
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)sseq->storage;
+		container_of(sseq->storage, struct sieve_file_storage, storage);
 	struct sieve_file_script *fscript;
 	const char *const *files;
 	unsigned int count;
@@ -242,7 +242,7 @@ sieve_file_script_sequence_next(struct sieve_script_sequence *sseq,
 void sieve_file_script_sequence_destroy(struct sieve_script_sequence *sseq)
 {
 	struct sieve_file_script_sequence *fseq =
-		(struct sieve_file_script_sequence *)sseq;
+		container_of(sseq, struct sieve_file_script_sequence, seq);
 
 	if (array_is_created(&fseq->script_files))
 		array_free(&fseq->script_files);
diff --git a/src/lib-sieve/storage/file/sieve-file-script.c b/src/lib-sieve/storage/file/sieve-file-script.c
index b437a92be..c76c84844 100644
--- a/src/lib-sieve/storage/file/sieve-file-script.c
+++ b/src/lib-sieve/storage/file/sieve-file-script.c
@@ -299,10 +299,11 @@ static int
 sieve_file_script_open(struct sieve_script *script,
 		       enum sieve_error *error_code_r)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
+	struct sieve_file_script *fscript =
+		container_of(script, struct sieve_file_script, script);
 	struct sieve_storage *storage = script->storage;
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	pool_t pool = script->pool;
 	const char *filename, *name, *path;
 	const char *dirpath, *basename, *binpath, *binprefix;
@@ -436,7 +437,8 @@ sieve_file_script_get_stream(struct sieve_script *script,
 			     struct istream **stream_r,
 			     enum sieve_error *error_code_r)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
+	struct sieve_file_script *fscript =
+		container_of(script, struct sieve_file_script, script);
 	struct stat st;
 	struct istream *result;
 	int fd;
@@ -492,7 +494,8 @@ sieve_file_script_binary_read_metadata(struct sieve_script *script,
 				       struct sieve_binary_block *sblock,
 				       sieve_size_t *offset ATTR_UNUSED)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
+	struct sieve_file_script *fscript =
+		container_of(script, struct sieve_file_script, script);
 	struct sieve_instance *svinst = script->storage->svinst;
 	struct sieve_binary *sbin = sieve_binary_block_get_binary(sblock);
 	const struct stat *sstat, *bstat;
@@ -532,7 +535,8 @@ static struct sieve_binary *
 sieve_file_script_binary_load(struct sieve_script *script,
 			      enum sieve_error *error_code_r)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
+	struct sieve_file_script *fscript =
+		container_of(script, struct sieve_file_script, script);
 	struct sieve_instance *svinst = script->storage->svinst;
 
 	return sieve_binary_open(svinst, fscript->binpath, script,
@@ -545,7 +549,8 @@ sieve_file_script_binary_save(struct sieve_script *script,
 			      enum sieve_error *error_code_r)
 {
 	struct sieve_storage *storage = script->storage;
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
+	struct sieve_file_script *fscript =
+		container_of(script, struct sieve_file_script, script);
 
 	if (storage->bin_dir != NULL &&
 	    sieve_storage_setup_bindir(storage, 0700) < 0)
@@ -560,7 +565,8 @@ sieve_file_script_binary_save(struct sieve_script *script,
 static const char *
 sieve_file_script_binary_get_prefix(struct sieve_script *script)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
+	struct sieve_file_script *fscript =
+		container_of(script, struct sieve_file_script, script);
 
 	return fscript->binprefix;
 }
@@ -571,9 +577,11 @@ sieve_file_script_binary_get_prefix(struct sieve_script *script)
 
 static int sieve_file_storage_script_is_active(struct sieve_script *script)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *) script;
+	struct sieve_file_script *fscript =
+		container_of(script, struct sieve_file_script, script);
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)script->storage;
+		container_of(script->storage, struct sieve_file_storage,
+			     storage);
 	const char *afile;
 	int ret = 0;
 
@@ -592,7 +600,8 @@ static int sieve_file_storage_script_is_active(struct sieve_script *script)
 
 static int sieve_file_storage_script_delete(struct sieve_script *script)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
+	struct sieve_file_script *fscript =
+		container_of(script, struct sieve_file_script, script);
 	int ret = 0;
 
 	if (sieve_file_storage_pre_modify(script->storage) < 0)
@@ -619,7 +628,7 @@ _sieve_file_storage_script_activate(struct sieve_file_script *fscript)
 	struct sieve_script *script = &fscript->script;
 	struct sieve_storage *storage = script->storage;
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	struct stat st;
 	const char *link_path, *afile;
 	int activated = 0;
@@ -679,7 +688,8 @@ _sieve_file_storage_script_activate(struct sieve_file_script *fscript)
 
 static int sieve_file_storage_script_activate(struct sieve_script *script)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
+	struct sieve_file_script *fscript =
+		container_of(script, struct sieve_file_script, script);
 	int ret;
 
 	if (sieve_file_storage_pre_modify(script->storage) < 0)
@@ -696,10 +706,11 @@ static int
 sieve_file_storage_script_rename(struct sieve_script *script,
 				 const char *newname)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
+	struct sieve_file_script *fscript =
+		container_of(script, struct sieve_file_script, script);
 	struct sieve_storage *storage = script->storage;
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	const char *newpath, *newfile, *link_path;
 	int ret = 0;
 
@@ -785,7 +796,8 @@ sieve_file_storage_script_rename(struct sieve_script *script,
 static int
 sieve_file_script_get_size(const struct sieve_script *script, uoff_t *size_r)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
+	const struct sieve_file_script *fscript =
+		container_of(script, const struct sieve_file_script, script);
 
 	*size_r = fscript->st.st_size;
 	return 1;
@@ -793,7 +805,8 @@ sieve_file_script_get_size(const struct sieve_script *script, uoff_t *size_r)
 
 const char *sieve_file_script_get_dirpath(const struct sieve_script *script)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
+	const struct sieve_file_script *fscript =
+		container_of(script, const struct sieve_file_script, script);
 
 	if (script->driver_name != sieve_file_script.driver_name)
 		return NULL;
@@ -803,7 +816,8 @@ const char *sieve_file_script_get_dirpath(const struct sieve_script *script)
 
 const char *sieve_file_script_get_path(const struct sieve_script *script)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
+	const struct sieve_file_script *fscript =
+		container_of(script, const struct sieve_file_script, script);
 
 	if (script->driver_name != sieve_file_script.driver_name)
 		return NULL;
@@ -819,8 +833,10 @@ static bool
 sieve_file_script_equals(const struct sieve_script *script,
 			 const struct sieve_script *other)
 {
-	struct sieve_file_script *fscript = (struct sieve_file_script *)script;
-	struct sieve_file_script *fother = (struct sieve_file_script *)other;
+	const struct sieve_file_script *fscript =
+		container_of(script, const struct sieve_file_script, script);
+	const struct sieve_file_script *fother =
+		container_of(other, const struct sieve_file_script, script);
 
 	if (!script->open || !other->open) {
 		struct sieve_storage *storage = script->storage;
diff --git a/src/lib-sieve/storage/file/sieve-file-storage-active.c b/src/lib-sieve/storage/file/sieve-file-storage-active.c
index 4509e427e..d7b2e9a66 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage-active.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage-active.c
@@ -207,7 +207,7 @@ int sieve_file_storage_active_script_get_name(struct sieve_storage *storage,
 					      const char **name_r)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	const char *link;
 	int ret;
 
@@ -237,7 +237,7 @@ struct sieve_script *
 sieve_file_storage_active_script_open(struct sieve_storage *storage)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	struct sieve_file_script *fscript;
 	const char *scriptfile, *link;
 	int ret;
@@ -298,7 +298,7 @@ int sieve_file_storage_active_script_get_last_change(
 	struct sieve_storage *storage, time_t *last_change_r)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	struct stat st;
 
 	/* Try direct lstat first */
@@ -378,7 +378,7 @@ bool sieve_file_storage_active_rescue_regular(
 int sieve_file_storage_deactivate(struct sieve_storage *storage)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	int ret;
 
 	if (sieve_file_storage_pre_modify(storage) < 0)
diff --git a/src/lib-sieve/storage/file/sieve-file-storage-list.c b/src/lib-sieve/storage/file/sieve-file-storage-list.c
index 7efab9eef..c2bd44a93 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage-list.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage-list.c
@@ -26,7 +26,7 @@ struct sieve_storage_list_context *
 sieve_file_storage_list_init(struct sieve_storage *storage)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	struct sieve_file_list_context *flctx;
 	const char *active = NULL;
 	pool_t pool;
@@ -88,9 +88,9 @@ sieve_file_storage_list_next(struct sieve_storage_list_context *lctx,
 			     bool *active)
 {
 	struct sieve_file_list_context *flctx =
-		(struct sieve_file_list_context *)lctx;
+		container_of(lctx, struct sieve_file_list_context, context);
 	const struct sieve_file_storage *fstorage =
-		(const struct sieve_file_storage *)lctx->storage;
+		container_of(lctx->storage, struct sieve_file_storage, storage);
 	struct dirent *dp;
 	const char *scriptname;
 
@@ -125,9 +125,9 @@ sieve_file_storage_list_next(struct sieve_storage_list_context *lctx,
 int sieve_file_storage_list_deinit(struct sieve_storage_list_context *lctx)
 {
 	struct sieve_file_list_context *flctx =
-		(struct sieve_file_list_context *)lctx;
+		container_of(lctx, struct sieve_file_list_context, context);
 	const struct sieve_file_storage *fstorage =
-		(const struct sieve_file_storage *)lctx->storage;
+		container_of(lctx->storage, struct sieve_file_storage, storage);
 
 	if (closedir(flctx->dirp) < 0) {
 		e_error(lctx->storage->event,
diff --git a/src/lib-sieve/storage/file/sieve-file-storage-quota.c b/src/lib-sieve/storage/file/sieve-file-storage-quota.c
index 966d7a3e6..627e1ba84 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage-quota.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage-quota.c
@@ -20,7 +20,7 @@ int sieve_file_storage_quota_havespace(struct sieve_storage *storage,
 				       uint64_t *limit_r)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	struct dirent *dp;
 	DIR *dirp;
 	uint64_t script_count = 1;
diff --git a/src/lib-sieve/storage/file/sieve-file-storage-save.c b/src/lib-sieve/storage/file/sieve-file-storage-save.c
index 0852fbf9f..d4468b4d8 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage-save.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage-save.c
@@ -210,9 +210,9 @@ int sieve_file_storage_save_init(struct sieve_storage_save_context *sctx,
 {
 	struct sieve_storage *storage = sctx->storage;
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	struct sieve_file_save_context *fsctx =
-		(struct sieve_file_save_context *)sctx;
+		container_of(sctx, struct sieve_file_save_context, context);
 	pool_t pool = sctx->pool;
 	const char *path;
 	int fd, ret = 0;
@@ -264,7 +264,7 @@ int sieve_file_storage_save_init(struct sieve_storage_save_context *sctx,
 int sieve_file_storage_save_continue(struct sieve_storage_save_context *sctx)
 {
 	struct sieve_file_save_context *fsctx =
-		(struct sieve_file_save_context *)sctx;
+		container_of(sctx, struct sieve_file_save_context, context);
 
 	switch (o_stream_send_istream(fsctx->output, sctx->input)) {
 	case OSTREAM_SEND_ISTREAM_RESULT_FINISHED:
@@ -290,7 +290,7 @@ int sieve_file_storage_save_continue(struct sieve_storage_save_context *sctx)
 int sieve_file_storage_save_finish(struct sieve_storage_save_context *sctx)
 {
 	struct sieve_file_save_context *fsctx =
-		(struct sieve_file_save_context *)sctx;
+		container_of(sctx, struct sieve_file_save_context, context);
 	struct sieve_storage *storage = sctx->storage;
 	int output_errno;
 
@@ -346,9 +346,9 @@ struct sieve_script *
 sieve_file_storage_save_get_tempscript(struct sieve_storage_save_context *sctx)
 {
 	struct sieve_file_save_context *fsctx =
-		(struct sieve_file_save_context *)sctx;
+		container_of(sctx, struct sieve_file_save_context, context);
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)sctx->storage;
+		container_of(sctx->storage, struct sieve_file_storage, storage);
 	struct sieve_file_script *tmpscript;
 	enum sieve_error error_code;
 	const char *scriptname;
@@ -407,10 +407,10 @@ sieve_file_storage_update_mtime(struct sieve_storage *storage, const char *path,
 int sieve_file_storage_save_commit(struct sieve_storage_save_context *sctx)
 {
 	struct sieve_file_save_context *fsctx =
-		(struct sieve_file_save_context *)sctx;
+		container_of(sctx, struct sieve_file_save_context, context);
 	struct sieve_storage *storage = sctx->storage;
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)sctx->storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	const char *dest_path;
 	bool failed = FALSE;
 
@@ -434,7 +434,7 @@ int sieve_file_storage_save_commit(struct sieve_storage_save_context *sctx)
 void sieve_file_storage_save_cancel(struct sieve_storage_save_context *sctx)
 {
 	struct sieve_file_save_context *fsctx =
-		(struct sieve_file_save_context *)sctx;
+		container_of(sctx, struct sieve_file_save_context, context);
 	struct sieve_storage *storage = sctx->storage;
 
 	if (fsctx->tmp_path != NULL &&
@@ -521,7 +521,7 @@ int sieve_file_storage_save_as(struct sieve_storage *storage,
 			       struct istream *input, const char *name)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	string_t *temp_path;
 	const char *dest_path;
 
@@ -542,7 +542,7 @@ int sieve_file_storage_save_as_active(struct sieve_storage *storage,
 				      struct istream *input, time_t mtime)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	string_t *temp_path;
 
 	temp_path = t_str_new(256);
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.c b/src/lib-sieve/storage/file/sieve-file-storage.c
index 8781cfeef..98fa2a6d4 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage.c
@@ -509,7 +509,7 @@ sieve_file_storage_init(struct sieve_storage *storage,
 			enum sieve_error *error_code_r)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	const char *storage_path = storage->location;
 	const char *value, *active_path = "";
 	bool exists = FALSE;
@@ -708,7 +708,7 @@ sieve_file_storage_init_default(struct sieve_instance *svinst,
 
 	storage = sieve_storage_alloc(svinst, NULL, &sieve_file_storage,
 				      "", flags, TRUE);
-	fstorage = (struct sieve_file_storage *)storage;
+	fstorage = container_of(storage, struct sieve_file_storage, storage);
 
 	T_BEGIN {
 		if (sieve_file_storage_do_init_default(fstorage, active_path,
@@ -732,7 +732,7 @@ sieve_file_storage_init_from_path(struct sieve_instance *svinst,
 
 	storage = sieve_storage_alloc(svinst, NULL, &sieve_file_storage,
 				      "", flags, FALSE);
-	fstorage = (struct sieve_file_storage *)storage;
+	fstorage = container_of(storage, struct sieve_file_storage, storage);
 
 	T_BEGIN {
 		if (sieve_file_storage_init_common(fstorage, path, NULL, FALSE,
@@ -748,7 +748,7 @@ sieve_file_storage_init_from_path(struct sieve_instance *svinst,
 static int sieve_file_storage_is_singular(struct sieve_storage *storage)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	struct stat st;
 
 	if (fstorage->active_path == NULL)
@@ -785,7 +785,7 @@ sieve_file_storage_get_last_change(struct sieve_storage *storage,
 				   time_t *last_change_r)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	struct stat st;
 
 	if (fstorage->prev_mtime == (time_t)-1) {
@@ -819,7 +819,7 @@ static void
 sieve_file_storage_set_modified(struct sieve_storage *storage, time_t mtime)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	struct utimbuf times;
 	time_t cur_mtime;
 
@@ -858,7 +858,7 @@ static struct sieve_script *
 sieve_file_storage_get_script(struct sieve_storage *storage, const char *name)
 {
 	struct sieve_file_storage *fstorage =
-		(struct sieve_file_storage *)storage;
+		container_of(storage, struct sieve_file_storage, storage);
 	struct sieve_file_script *fscript;
 
 	T_BEGIN {
-- 
GitLab