From 274c3b318e8107f09653bf005fb04ba4394f65a8 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan.bosch@open-xchange.com> Date: Sat, 13 Jul 2024 03:18:15 +0200 Subject: [PATCH] lib-sieve: sieve-script - Restructure script sequence initialization --- src/lib-sieve/sieve-script-private.h | 3 -- src/lib-sieve/sieve-script.c | 20 +++++------ src/lib-sieve/sieve-storage-private.h | 5 +-- src/lib-sieve/sieve-storage.c | 19 ---------- src/lib-sieve/sieve-storage.h | 8 ----- .../storage/dict/sieve-dict-script.c | 27 ++++++-------- .../storage/dict/sieve-dict-storage.c | 2 +- .../storage/dict/sieve-dict-storage.h | 6 ++-- .../storage/file/sieve-file-script-sequence.c | 32 ++++++++--------- .../storage/file/sieve-file-storage.c | 2 +- .../storage/file/sieve-file-storage.h | 6 ++-- .../storage/ldap/sieve-ldap-script.c | 35 ++++++++----------- .../storage/ldap/sieve-ldap-storage.c | 2 +- .../storage/ldap/sieve-ldap-storage.h | 6 ++-- 14 files changed, 61 insertions(+), 112 deletions(-) diff --git a/src/lib-sieve/sieve-script-private.h b/src/lib-sieve/sieve-script-private.h index 6b86285c2..f06286b63 100644 --- a/src/lib-sieve/sieve-script-private.h +++ b/src/lib-sieve/sieve-script-private.h @@ -98,7 +98,4 @@ void sieve_script_set_critical(struct sieve_script *script, * Script sequence */ -void sieve_script_sequence_init(struct sieve_script_sequence *sseq, - struct sieve_storage *storage); - #endif diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c index b3fb348c3..718ee67b9 100644 --- a/src/lib-sieve/sieve-script.c +++ b/src/lib-sieve/sieve-script.c @@ -875,20 +875,15 @@ const char *sieve_script_get_last_error_lcase(struct sieve_script *script) * Script sequence */ -void sieve_script_sequence_init(struct sieve_script_sequence *sseq, - struct sieve_storage *storage) -{ - sseq->storage = storage; - sieve_storage_ref(storage); -} - int sieve_script_sequence_create(struct sieve_instance *svinst, const char *location, struct sieve_script_sequence **sseq_r, enum sieve_error *error_code_r) { struct sieve_storage *storage; + struct sieve_script_sequence *sseq; enum sieve_error error_code; + int ret; *sseq_r = NULL; if (error_code_r != NULL) @@ -900,10 +895,14 @@ int sieve_script_sequence_create(struct sieve_instance *svinst, &storage, error_code_r) < 0) return -1; - *sseq_r = sieve_storage_get_script_sequence(storage, error_code_r); + sseq = i_new(struct sieve_script_sequence, 1); + sseq->storage = storage; - sieve_storage_unref(&storage); - return 0; + i_assert(storage->v.script_sequence_init != NULL); + ret = storage->v.script_sequence_init(sseq, error_code_r); + + *sseq_r = sseq; + return ret; } int sieve_script_sequence_next(struct sieve_script_sequence *sseq, @@ -937,4 +936,5 @@ void sieve_script_sequence_free(struct sieve_script_sequence **_sseq) storage->v.script_sequence_destroy(sseq); sieve_storage_unref(&storage); + i_free(sseq); } diff --git a/src/lib-sieve/sieve-storage-private.h b/src/lib-sieve/sieve-storage-private.h index b0ab0d92b..69c797f2a 100644 --- a/src/lib-sieve/sieve-storage-private.h +++ b/src/lib-sieve/sieve-storage-private.h @@ -37,8 +37,8 @@ struct sieve_storage_vfuncs { struct sieve_script **script_r); /* script sequence */ - struct sieve_script_sequence *(*get_script_sequence)( - struct sieve_storage *storage, enum sieve_error *error_code_r); + int (*script_sequence_init)(struct sieve_script_sequence *sseq, + enum sieve_error *error_code_r); int (*script_sequence_next)(struct sieve_script_sequence *sseq, struct sieve_script **script_r, enum sieve_error *error_code_r); @@ -154,6 +154,7 @@ struct sieve_storage_list_context { struct sieve_script_sequence { struct sieve_storage *storage; + void *storage_data; }; /* diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c index c1900ee4d..d6e16a36c 100644 --- a/src/lib-sieve/sieve-storage.c +++ b/src/lib-sieve/sieve-storage.c @@ -852,25 +852,6 @@ int sieve_storage_check_script(struct sieve_storage *storage, const char *name, return 1; } -/* - * Script sequence - */ - -struct sieve_script_sequence * -sieve_storage_get_script_sequence(struct sieve_storage *storage, - enum sieve_error *error_code_r) -{ - enum sieve_error error_code; - - if (error_code_r != NULL) - *error_code_r = SIEVE_ERROR_NONE; - else - error_code_r = &error_code; - - i_assert(storage->v.get_script_sequence != NULL); - return storage->v.get_script_sequence(storage, error_code_r); -} - /* * Active script */ diff --git a/src/lib-sieve/sieve-storage.h b/src/lib-sieve/sieve-storage.h index ffb25a086..333d0e9ff 100644 --- a/src/lib-sieve/sieve-storage.h +++ b/src/lib-sieve/sieve-storage.h @@ -51,14 +51,6 @@ int sieve_storage_open_script(struct sieve_storage *storage, const char *name, int sieve_storage_check_script(struct sieve_storage *storage, const char *name, enum sieve_error *error_code_r); -/* - * Script sequence - */ - -struct sieve_script_sequence * -sieve_storage_get_script_sequence(struct sieve_storage *storage, - enum sieve_error *error_code_r); - /* * Active script */ diff --git a/src/lib-sieve/storage/dict/sieve-dict-script.c b/src/lib-sieve/storage/dict/sieve-dict-script.c index 167fe8fe9..b03fbc31c 100644 --- a/src/lib-sieve/storage/dict/sieve-dict-script.c +++ b/src/lib-sieve/storage/dict/sieve-dict-script.c @@ -300,42 +300,36 @@ const struct sieve_script sieve_dict_script = { */ struct sieve_dict_script_sequence { - struct sieve_script_sequence seq; - bool done:1; }; -struct sieve_script_sequence * -sieve_dict_storage_get_script_sequence(struct sieve_storage *storage, - enum sieve_error *error_code_r) +int sieve_dict_script_sequence_init(struct sieve_script_sequence *sseq, + enum sieve_error *error_code_r ATTR_UNUSED) { - struct sieve_dict_script_sequence *dseq = NULL; - - if (error_code_r != NULL) - *error_code_r = SIEVE_ERROR_NONE; + struct sieve_dict_script_sequence *dseq; /* Create sequence object */ dseq = i_new(struct sieve_dict_script_sequence, 1); - sieve_script_sequence_init(&dseq->seq, storage); + sseq->storage_data = dseq; - return &dseq->seq; + return 0; } int sieve_dict_script_sequence_next(struct sieve_script_sequence *sseq, struct sieve_script **script_r, enum sieve_error *error_code_r) { - struct sieve_dict_script_sequence *dseq = - container_of(sseq, struct sieve_dict_script_sequence, seq); + struct sieve_dict_script_sequence *dseq = sseq->storage_data; + struct sieve_storage *storage = sseq->storage; struct sieve_dict_storage *dstorage = - container_of(sseq->storage, struct sieve_dict_storage, storage); + container_of(storage, struct sieve_dict_storage, storage); struct sieve_dict_script *dscript; if (dseq->done) return 0; dseq->done = TRUE; - dscript = sieve_dict_script_init(dstorage, sseq->storage->script_name); + dscript = sieve_dict_script_init(dstorage, storage->script_name); if (sieve_script_open(&dscript->script, error_code_r) < 0) { struct sieve_script *script = &dscript->script; @@ -349,8 +343,7 @@ int sieve_dict_script_sequence_next(struct sieve_script_sequence *sseq, void sieve_dict_script_sequence_destroy(struct sieve_script_sequence *sseq) { - struct sieve_dict_script_sequence *dseq = - container_of(sseq, struct sieve_dict_script_sequence, seq); + struct sieve_dict_script_sequence *dseq = sseq->storage_data; i_free(dseq); } diff --git a/src/lib-sieve/storage/dict/sieve-dict-storage.c b/src/lib-sieve/storage/dict/sieve-dict-storage.c index 07617e29b..2d65a6765 100644 --- a/src/lib-sieve/storage/dict/sieve-dict-storage.c +++ b/src/lib-sieve/storage/dict/sieve-dict-storage.c @@ -179,7 +179,7 @@ const struct sieve_storage sieve_dict_storage = { .get_script = sieve_dict_storage_get_script, - .get_script_sequence = sieve_dict_storage_get_script_sequence, + .script_sequence_init = sieve_dict_script_sequence_init, .script_sequence_next = sieve_dict_script_sequence_next, .script_sequence_destroy = sieve_dict_script_sequence_destroy, diff --git a/src/lib-sieve/storage/dict/sieve-dict-storage.h b/src/lib-sieve/storage/dict/sieve-dict-storage.h index f6f61413a..be5f269f2 100644 --- a/src/lib-sieve/storage/dict/sieve-dict-storage.h +++ b/src/lib-sieve/storage/dict/sieve-dict-storage.h @@ -53,10 +53,8 @@ sieve_dict_script_init(struct sieve_dict_storage *dstorage, const char *name); * Script sequence */ -struct sieve_script_sequence * -sieve_dict_storage_get_script_sequence(struct sieve_storage *storage, - enum sieve_error *error_code_r); - +int sieve_dict_script_sequence_init(struct sieve_script_sequence *sseq, + enum sieve_error *error_code_r); int sieve_dict_script_sequence_next(struct sieve_script_sequence *sseq, struct sieve_script **script_r, enum sieve_error *error_code_r); 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 2ffa34c93..fba7f7ba1 100644 --- a/src/lib-sieve/storage/file/sieve-file-script-sequence.c +++ b/src/lib-sieve/storage/file/sieve-file-script-sequence.c @@ -19,7 +19,6 @@ */ struct sieve_file_script_sequence { - struct sieve_script_sequence seq; pool_t pool; ARRAY_TYPE(const_string) script_files; @@ -29,10 +28,11 @@ struct sieve_file_script_sequence { }; static int -sieve_file_script_sequence_read_dir(struct sieve_file_script_sequence *fseq, +sieve_file_script_sequence_read_dir(struct sieve_script_sequence *sseq, + struct sieve_file_script_sequence *fseq, const char *path) { - struct sieve_storage *storage = fseq->seq.storage; + struct sieve_storage *storage = sseq->storage; DIR *dirp; int ret = 0; @@ -123,10 +123,10 @@ sieve_file_script_sequence_read_dir(struct sieve_file_script_sequence *fseq, return ret; } -struct sieve_script_sequence * -sieve_file_storage_get_script_sequence(struct sieve_storage *storage, - enum sieve_error *error_code_r) +int sieve_file_script_sequence_init(struct sieve_script_sequence *sseq, + enum sieve_error *error_code_r) { + struct sieve_storage *storage = sseq->storage; struct sieve_file_storage *fstorage = container_of(storage, struct sieve_file_storage, storage); struct sieve_file_script_sequence *fseq = NULL; @@ -158,14 +158,14 @@ sieve_file_storage_get_script_sequence(struct sieve_storage *storage, break; } *error_code_r = storage->error_code; - return NULL; + return -1; } /* Create sequence object */ pool = pool_alloconly_create("sieve_file_script_sequence", 1024); fseq = p_new(pool, struct sieve_file_script_sequence, 1); fseq->pool = pool; - sieve_script_sequence_init(&fseq->seq, storage); + sseq->storage_data = fseq; if (S_ISDIR(st.st_mode)) { i_array_init(&fseq->script_files, 16); @@ -174,10 +174,10 @@ sieve_file_storage_get_script_sequence(struct sieve_storage *storage, if (name == 0 || *name == '\0') { /* Read all '.sieve' files in directory */ if (sieve_file_script_sequence_read_dir( - fseq, fstorage->path) < 0) { + sseq, fseq, fstorage->path) < 0) { *error_code_r = storage->error_code; - sieve_file_script_sequence_destroy(&fseq->seq); - return NULL; + pool_unref(&fseq->pool); + return -1; } } else { @@ -193,15 +193,14 @@ sieve_file_storage_get_script_sequence(struct sieve_storage *storage, fseq->storage_is_file = TRUE; } - return &fseq->seq; + return 0; } int sieve_file_script_sequence_next(struct sieve_script_sequence *sseq, struct sieve_script **script_r, enum sieve_error *error_code_r) { - struct sieve_file_script_sequence *fseq = - container_of(sseq, struct sieve_file_script_sequence, seq); + struct sieve_file_script_sequence *fseq = sseq->storage_data; struct sieve_storage *storage = sseq->storage; struct sieve_file_storage *fstorage = container_of(storage, struct sieve_file_storage, storage); @@ -230,7 +229,7 @@ int sieve_file_script_sequence_next(struct sieve_script_sequence *sseq, &fscript); if (ret == 0) break; - if (sseq->storage->error_code != SIEVE_ERROR_NOT_FOUND) + if (storage->error_code != SIEVE_ERROR_NOT_FOUND) break; sieve_storage_clear_error(storage); if (fseq->index >= count) @@ -250,8 +249,7 @@ int 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 = - container_of(sseq, struct sieve_file_script_sequence, seq); + struct sieve_file_script_sequence *fseq = sseq->storage_data; if (array_is_created(&fseq->script_files)) array_free(&fseq->script_files); diff --git a/src/lib-sieve/storage/file/sieve-file-storage.c b/src/lib-sieve/storage/file/sieve-file-storage.c index 325f1511c..532eedd54 100644 --- a/src/lib-sieve/storage/file/sieve-file-storage.c +++ b/src/lib-sieve/storage/file/sieve-file-storage.c @@ -909,7 +909,7 @@ const struct sieve_storage sieve_file_storage = { .get_script = sieve_file_storage_get_script, - .get_script_sequence = sieve_file_storage_get_script_sequence, + .script_sequence_init = sieve_file_script_sequence_init, .script_sequence_next = sieve_file_script_sequence_next, .script_sequence_destroy = sieve_file_script_sequence_destroy, diff --git a/src/lib-sieve/storage/file/sieve-file-storage.h b/src/lib-sieve/storage/file/sieve-file-storage.h index 7d3eda2a2..da614455d 100644 --- a/src/lib-sieve/storage/file/sieve-file-storage.h +++ b/src/lib-sieve/storage/file/sieve-file-storage.h @@ -172,10 +172,8 @@ const char *sieve_file_script_get_path(const struct sieve_script *script); * Script sequence */ -struct sieve_script_sequence * -sieve_file_storage_get_script_sequence(struct sieve_storage *storage, - enum sieve_error *error_code_r); - +int sieve_file_script_sequence_init(struct sieve_script_sequence *sseq, + enum sieve_error *error_code_r); int sieve_file_script_sequence_next(struct sieve_script_sequence *sseq, struct sieve_script **script_r, enum sieve_error *error_code_r); diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-script.c b/src/lib-sieve/storage/ldap/sieve-ldap-script.c index 6bea3e7aa..a4fed92dd 100644 --- a/src/lib-sieve/storage/ldap/sieve-ldap-script.c +++ b/src/lib-sieve/storage/ldap/sieve-ldap-script.c @@ -316,42 +316,36 @@ const struct sieve_script sieve_ldap_script = { */ struct sieve_ldap_script_sequence { - struct sieve_script_sequence seq; - bool done:1; }; -struct sieve_script_sequence * -sieve_ldap_storage_get_script_sequence(struct sieve_storage *storage, - enum sieve_error *error_code_r) +int sieve_ldap_script_sequence_init(struct sieve_script_sequence *sseq, + enum sieve_error *error_code_r ATTR_UNUSED) { - struct sieve_ldap_script_sequence *lsec = NULL; - - if (error_code_r != NULL) - *error_code_r = SIEVE_ERROR_NONE; + struct sieve_ldap_script_sequence *lseq = NULL; /* Create sequence object */ - lsec = i_new(struct sieve_ldap_script_sequence, 1); - sieve_script_sequence_init(&lsec->seq, storage); + lseq = i_new(struct sieve_ldap_script_sequence, 1); + sseq->storage_data = lseq; - return &lsec->seq; + return 0; } int sieve_ldap_script_sequence_next(struct sieve_script_sequence *sseq, struct sieve_script **script_r, enum sieve_error *error_code_r) { - struct sieve_ldap_script_sequence *lsec = - container_of(sseq, struct sieve_ldap_script_sequence, seq); + struct sieve_ldap_script_sequence *lseq = sseq->storage_data; + struct sieve_storage *storage = sseq->storage; struct sieve_ldap_storage *lstorage = - container_of(sseq->storage, struct sieve_ldap_storage, storage); + container_of(storage, struct sieve_ldap_storage, storage); struct sieve_ldap_script *lscript; - if (lsec->done) + if (lseq->done) return 0; - lsec->done = TRUE; + lseq->done = TRUE; - lscript = sieve_ldap_script_init(lstorage, sseq->storage->script_name); + lscript = sieve_ldap_script_init(lstorage, storage->script_name); if (sieve_script_open(&lscript->script, error_code_r) < 0) { struct sieve_script *script = &lscript->script; @@ -364,10 +358,9 @@ int sieve_ldap_script_sequence_next(struct sieve_script_sequence *sseq, void sieve_ldap_script_sequence_destroy(struct sieve_script_sequence *sseq) { - struct sieve_ldap_script_sequence *lsec = - container_of(sseq, struct sieve_ldap_script_sequence, seq); + struct sieve_ldap_script_sequence *lseq = sseq->storage_data; - i_free(lsec); + i_free(lseq); } #endif diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c index 9f27b4d7e..36a66a42e 100644 --- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c +++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c @@ -164,7 +164,7 @@ const struct sieve_storage sieve_ldap_storage_plugin = { .get_script = sieve_ldap_storage_get_script, - .get_script_sequence = sieve_ldap_storage_get_script_sequence, + .script_sequence_init = sieve_ldap_script_sequence_init, .script_sequence_next = sieve_ldap_script_sequence_next, .script_sequence_destroy = sieve_ldap_script_sequence_destroy, diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h index 2341900ee..978ad0e2f 100644 --- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h +++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h @@ -93,10 +93,8 @@ sieve_ldap_script_init(struct sieve_ldap_storage *lstorage, const char *name); * Script sequence */ -struct sieve_script_sequence * -sieve_ldap_storage_get_script_sequence(struct sieve_storage *storage, - enum sieve_error *error_code_r); - +int sieve_ldap_script_sequence_init(struct sieve_script_sequence *sseq, + enum sieve_error *error_code_r); int sieve_ldap_script_sequence_next(struct sieve_script_sequence *sseq, struct sieve_script **script_r, enum sieve_error *error_code_r); -- GitLab