diff --git a/src/lib-sieve/sieve-script-private.h b/src/lib-sieve/sieve-script-private.h index 6b86285c289b10f51755262890cae6db197b7ed2..f06286b6353ea11348e39f562566418caa953976 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 b3fb348c3d834cd86cb623c25b789c0cb7bf6e79..718ee67b9a1b974665597ddb9f5475d20fc8bf2c 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 b0ab0d92b16ac3486212fb17aea9b73e6b9ed34d..69c797f2a4ca9395330d60d7687585f51f547488 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 c1900ee4d1f18e7670d2a69d5a9f7b636ffd8b3c..d6e16a36c5cfdd2656ae758a55bc47a4f0741596 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 ffb25a0861ade4871cc591106eea094150ce9fbf..333d0e9ffa1521fa31020616fadaca599efb9895 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 167fe8fe907fde32eff0ccc7644dd8b12819e678..b03fbc31c98f33cf988184623d9339e3a656fb59 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 07617e29b878a56b56212e00238af651c67c7ab9..2d65a6765bd29389200c483a66c0bf0a907cb214 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 f6f61413a8612583786f0164d3645e8e2e2c997b..be5f269f2c775e7853ea37e50176a85208cb5a2e 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 2ffa34c932812d885ac0543f9b15dae626b222d0..fba7f7ba1707de7cee9ba755fb1a4f9b67b6b11f 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 325f1511c2571ec5c389313cd4caafaaaafefd41..532eedd540c1ab9b3d82911a51996047faf95687 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 7d3eda2a247248af47ee59aba6773d0c0ca4fa7f..da614455d465c8cd867c3317307b91a2c8d03541 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 6bea3e7aaaab2aab0e22892a0bf4335130bb2fe7..a4fed92dd826676a978e47406086ad4605e852d5 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 9f27b4d7e73a0040c7e3b7721e8529c4cbb56b1a..36a66a42e0c7fcef1cafdda5011aa17eab31b7ab 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 2341900eeacdf80f66493fa0e0ac246ffe8065ea..978ad0e2f911386bf37f3bc7c459b7d84044e9c5 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);