From ca61ed301de00dd778e52392ec621e260f23c337 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Wed, 16 Oct 2024 17:33:54 +0200
Subject: [PATCH] lib-sieve: sieve-storage - Add autodetect storage vfunc

---
 src/lib-sieve/sieve-storage-private.h         | 14 +++++------
 src/lib-sieve/sieve-storage.c                 |  4 +++-
 .../storage/file/sieve-file-storage.c         | 24 ++++++++++---------
 3 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/src/lib-sieve/sieve-storage-private.h b/src/lib-sieve/sieve-storage-private.h
index eb52e8baf..03183bdc6 100644
--- a/src/lib-sieve/sieve-storage-private.h
+++ b/src/lib-sieve/sieve-storage-private.h
@@ -25,6 +25,13 @@ struct sieve_storage_vfuncs {
 	void (*destroy)(struct sieve_storage *storage);
 	int (*init)(struct sieve_storage *storage, const char *const *options);
 
+	int (*autodetect)(struct sieve_instance *svinst,
+			  const char *active_path,
+			  enum sieve_storage_flags flags,
+			  struct sieve_storage **storage_r,
+			  enum sieve_error *error_code_r,
+			  const char **error_r);
+
 	int (*get_last_change)(struct sieve_storage *storage,
 			       time_t *last_change_r);
 	void (*set_modified)(struct sieve_storage *storage, time_t mtime);
@@ -216,13 +223,6 @@ extern const struct sieve_storage sieve_data_storage;
 
 extern const struct sieve_storage sieve_file_storage;
 
-int sieve_file_storage_init_default(struct sieve_instance *svinst,
-				    const char *active_path,
-				    enum sieve_storage_flags flags,
-				    struct sieve_storage **storage_r,
-				    enum sieve_error *error_code_r,
-				    const char **error_r);
-
 /* dict */
 
 #define SIEVE_DICT_STORAGE_DRIVER_NAME "dict"
diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index 069fb6602..6fa2154cc 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -615,7 +615,9 @@ sieve_storage_do_create_personal(struct sieve_instance *svinst,
 
 	if (storage == NULL) {
 		const char *error;
-		if (sieve_file_storage_init_default(svinst, set_sieve, flags,
+
+		i_assert(sieve_file_storage.v.autodetect != NULL);
+		if (sieve_file_storage.v.autodetect(svinst, set_sieve, flags,
 						    &storage, error_code_r,
 						    &error) < 0)
 			return -1;
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.c b/src/lib-sieve/storage/file/sieve-file-storage.c
index 3296bdeb7..67478b09a 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage.c
@@ -590,10 +590,9 @@ sieve_file_storage_init(struct sieve_storage *storage,
 }
 
 static int
-sieve_file_storage_do_init_default(struct sieve_file_storage *fstorage,
-				   const char *active_path,
-				   enum sieve_error *error_code_r,
-				   const char **error_r)
+sieve_file_storage_do_autodetect(
+	struct sieve_file_storage *fstorage, const char *active_path,
+	enum sieve_error *error_code_r, const char **error_r)
 {
 	struct sieve_storage *storage = &fstorage->storage;
 	struct sieve_instance *svinst = storage->svinst;
@@ -679,12 +678,13 @@ sieve_file_storage_do_init_default(struct sieve_file_storage *fstorage,
 	return 0;
 }
 
-int sieve_file_storage_init_default(struct sieve_instance *svinst,
-				    const char *active_path,
-				    enum sieve_storage_flags flags,
-				    struct sieve_storage **storage_r,
-				    enum sieve_error *error_code_r,
-				    const char **error_r)
+static int
+sieve_file_storage_autodetect(struct sieve_instance *svinst,
+			      const char *active_path,
+			      enum sieve_storage_flags flags,
+			      struct sieve_storage **storage_r,
+			      enum sieve_error *error_code_r,
+			      const char **error_r)
 {
 	struct sieve_storage *storage;
 	struct sieve_file_storage *fstorage;
@@ -698,7 +698,7 @@ int sieve_file_storage_init_default(struct sieve_instance *svinst,
 	fstorage = container_of(storage, struct sieve_file_storage, storage);
 
 	T_BEGIN {
-		ret = sieve_file_storage_do_init_default(
+		ret = sieve_file_storage_do_autodetect(
 			fstorage, active_path, error_code_r, error_r);
 	}  T_END_PASS_STR_IF(ret < 0, error_r);
 	if (ret < 0) {
@@ -888,6 +888,8 @@ const struct sieve_storage sieve_file_storage = {
 		.alloc = sieve_file_storage_alloc,
 		.init = sieve_file_storage_init,
 
+		.autodetect = sieve_file_storage_autodetect,
+
 		.get_last_change = sieve_file_storage_get_last_change,
 		.set_modified = sieve_file_storage_set_modified,
 
-- 
GitLab