From 429a0ab10beddb1262b52cd08b1ad65aff5f835c Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Mon, 2 Sep 2024 00:06:37 +0200
Subject: [PATCH] lib-sieve: sieve-storage - Use int for
 sieve_storage_list_init() status result

---
 src/lib-sieve/sieve-storage-private.h            |  4 ++--
 src/lib-sieve/sieve-storage.c                    | 16 +++++++++-------
 src/lib-sieve/sieve-storage.h                    |  4 ++--
 .../storage/file/sieve-file-storage-list.c       | 11 ++++++-----
 src/lib-sieve/storage/file/sieve-file-storage.h  |  4 ++--
 src/managesieve/cmd-listscripts.c                |  3 +--
 .../doveadm-sieve/doveadm-sieve-cmd-list.c       |  3 +--
 src/plugins/doveadm-sieve/doveadm-sieve-sync.c   |  3 +--
 8 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/src/lib-sieve/sieve-storage-private.h b/src/lib-sieve/sieve-storage-private.h
index 589bfd735..04697fc02 100644
--- a/src/lib-sieve/sieve-storage-private.h
+++ b/src/lib-sieve/sieve-storage-private.h
@@ -54,8 +54,8 @@ struct sieve_storage_vfuncs {
 					     time_t *last_change_r);
 
 	/* listing scripts */
-	struct sieve_storage_list_context *(*list_init)(
-		struct sieve_storage *storage);
+	int (*list_init)(struct sieve_storage *storage,
+			 struct sieve_storage_list_context **lctx_r);
 	const char *(*list_next)(struct sieve_storage_list_context *lctx,
 				 bool *active_r);
 	int (*list_deinit)(struct sieve_storage_list_context *lctx);
diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index 29e51bc7b..15a66eae7 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -997,18 +997,20 @@ int sieve_storage_active_script_get_last_change(struct sieve_storage *storage,
  * Listing scripts
  */
 
-struct sieve_storage_list_context *
-sieve_storage_list_init(struct sieve_storage *storage)
+int sieve_storage_list_init(struct sieve_storage *storage,
+			    struct sieve_storage_list_context **lctx_r)
 {
 	struct sieve_storage_list_context *lctx;
 
-	i_assert(storage->v.list_init != NULL);
-	lctx = storage->v.list_init(storage);
+	*lctx_r = NULL;
 
-	if (lctx != NULL)
-		lctx->storage = storage;
+	i_assert(storage->v.list_init != NULL);
+	if (storage->v.list_init(storage, &lctx) < 0)
+		return -1;
 
-	return lctx;
+	lctx->storage = storage;
+	*lctx_r = lctx;
+	return 0;
 }
 
 const char *
diff --git a/src/lib-sieve/sieve-storage.h b/src/lib-sieve/sieve-storage.h
index 29ab19a1c..a4ad97346 100644
--- a/src/lib-sieve/sieve-storage.h
+++ b/src/lib-sieve/sieve-storage.h
@@ -80,8 +80,8 @@ int sieve_storage_active_script_get_last_change(struct sieve_storage *storage,
 struct sieve_storage_list_context;
 
 /* Create a context for listing the scripts in the storage */
-struct sieve_storage_list_context *
-sieve_storage_list_init(struct sieve_storage *storage);
+int sieve_storage_list_init(struct sieve_storage *storage,
+			    struct sieve_storage_list_context **lctx_r);
 /* Get the next script in the storage. */
 const char *sieve_storage_list_next(struct sieve_storage_list_context *lctx,
 				    bool *active_r) ATTR_NULL(2);
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 c2bd44a93..7718e9459 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage-list.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage-list.c
@@ -22,8 +22,8 @@ struct sieve_file_list_context {
 	DIR *dirp;
 };
 
-struct sieve_storage_list_context *
-sieve_file_storage_list_init(struct sieve_storage *storage)
+int sieve_file_storage_list_init(struct sieve_storage *storage,
+				 struct sieve_storage_list_context **lctx_r)
 {
 	struct sieve_file_storage *fstorage =
 		container_of(storage, struct sieve_file_storage, storage);
@@ -54,7 +54,7 @@ sieve_file_storage_list_init(struct sieve_storage *storage)
 				"opendir(%s) failed: %m", fstorage->path);
 			break;
 		}
-		return NULL;
+		return -1;
 	}
 
 	T_BEGIN {
@@ -78,9 +78,10 @@ sieve_file_storage_list_init(struct sieve_storage *storage)
 			e_error(storage->event,
 				"closedir(%s) failed: %m", fstorage->path);
 		}
-		return NULL;
+		return -1;
 	}
-	return &flctx->context;
+	*lctx_r = &flctx->context;
+	return 0;
 }
 
 const char *
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.h b/src/lib-sieve/storage/file/sieve-file-storage.h
index 4c01dd726..4a3350f3e 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.h
+++ b/src/lib-sieve/storage/file/sieve-file-storage.h
@@ -78,8 +78,8 @@ int sieve_file_storage_active_script_get_last_change(
 
 /* Listing */
 
-struct sieve_storage_list_context *
-sieve_file_storage_list_init(struct sieve_storage *storage);
+int sieve_file_storage_list_init(struct sieve_storage *storage,
+				 struct sieve_storage_list_context **lctx_r);
 const char *
 sieve_file_storage_list_next(struct sieve_storage_list_context *lctx,
 			     bool *active);
diff --git a/src/managesieve/cmd-listscripts.c b/src/managesieve/cmd-listscripts.c
index 7a4490c73..564c5cc13 100644
--- a/src/managesieve/cmd-listscripts.c
+++ b/src/managesieve/cmd-listscripts.c
@@ -25,8 +25,7 @@ bool cmd_listscripts(struct client_command_context *cmd)
 	if (!client_read_no_args(cmd))
 		return FALSE;
 
-	lctx = sieve_storage_list_init(client->storage);
-	if (lctx == NULL) {
+	if (sieve_storage_list_init(client->storage, &lctx) < 0) {
 		client_command_storage_error(
 			cmd, "Failed to list scripts");
 		return TRUE;
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-list.c b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-list.c
index e12b5e0c3..f648eda06 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-list.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-list.c
@@ -19,8 +19,7 @@ static int cmd_sieve_list_run(struct doveadm_sieve_cmd_context *_ctx)
 	const char *scriptname;
 	bool active;
 
-	lctx = sieve_storage_list_init(storage);
-	if (lctx == NULL) {
+	if (sieve_storage_list_init(storage, &lctx) < 0) {
 		e_error(event, "Listing Sieve scripts failed: %s",
 			sieve_storage_get_last_error(storage, &error_code));
 		doveadm_sieve_cmd_failed_error(_ctx, error_code);
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
index 879d6f62c..3d23e8e76 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c
@@ -625,8 +625,7 @@ sieve_attribute_iter_script_init(struct sieve_mailbox_attribute_iter *siter)
 	if (ret <= 0)
 		return ret;
 
-	siter->sieve_list = sieve_storage_list_init(svstorage);
-	if (siter->sieve_list == NULL) {
+	if (sieve_storage_list_init(svstorage, &siter->sieve_list) < 0) {
 		mail_storage_set_critical(
 			siter->iter.box->storage,
 			"Failed to iterate sieve scripts: %s",
-- 
GitLab