dovecot-2.2-pigeonhole: lib-sieve: Fixed file storage sequence i...
pigeonhole at rename-it.nl
pigeonhole at rename-it.nl
Thu Jul 24 00:04:56 UTC 2014
details: http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/0c9797a8ae3c
changeset: 1885:0c9797a8ae3c
user: Stephan Bosch <stephan at rename-it.nl>
date: Thu Jul 24 02:04:47 2014 +0200
description:
lib-sieve: Fixed file storage sequence implementation.
Directory iteration was very broken.
diffstat:
src/lib-sieve/storage/file/sieve-file-script-sequence.c | 29 ++++++++++------
src/lib-sieve/storage/file/sieve-file-script.c | 14 +++++++-
2 files changed, 30 insertions(+), 13 deletions(-)
diffs (101 lines):
diff -r c01b68b0c6b1 -r 0c9797a8ae3c src/lib-sieve/storage/file/sieve-file-script-sequence.c
--- a/src/lib-sieve/storage/file/sieve-file-script-sequence.c Wed Jul 23 19:36:00 2014 +0200
+++ b/src/lib-sieve/storage/file/sieve-file-script-sequence.c Thu Jul 24 02:04:47 2014 +0200
@@ -27,6 +27,8 @@
ARRAY_TYPE(const_string) script_files;
unsigned int index;
+
+ unsigned int storage_is_file:1;
};
static int sieve_file_script_sequence_read_dir
@@ -84,7 +86,7 @@
file = t_strconcat(path, "/", dp->d_name, NULL);
if ( stat(file, &st) == 0 && S_ISREG(st.st_mode) )
- file = p_strdup(fseq->pool, file);
+ file = p_strdup(fseq->pool, dp->d_name);
else
file = NULL;
} T_END;
@@ -163,9 +165,10 @@
fseq = p_new(pool, struct sieve_file_script_sequence, 1);
fseq->pool = pool;
sieve_script_sequence_init(&fseq->seq, storage);
- i_array_init(&fseq->script_files, 16);
if ( S_ISDIR(st.st_mode) ) {
+ i_array_init(&fseq->script_files, 16);
+
/* Path is directory */
if (name == 0 || *name == '\0') {
/* Read all '.sieve' files in directory */
@@ -179,7 +182,6 @@
} else {
/* Read specific script file */
file = sieve_script_file_from_name(name);
- file = sieve_file_storage_path_extend(fstorage, file);
file = p_strdup(pool, file);
array_append(&fseq->script_files, &file, 1);
}
@@ -187,8 +189,7 @@
} else {
/* Path is a file
(apparently; we'll see about that once it is opened) */
- file = p_strdup(pool, fstorage->path);
- array_append(&fseq->script_files, &file, 1);
+ fseq->storage_is_file = TRUE;
}
return &fseq->seq;
@@ -208,13 +209,19 @@
if ( error_r != NULL )
*error_r = SIEVE_ERROR_NONE;
- files = array_get(&fseq->script_files, &count);
+ fscript = NULL;
+ if ( fseq->storage_is_file ) {
+ if ( fseq->index++ < 1 )
+ fscript = sieve_file_script_init_from_name(fstorage, NULL);
- fscript = NULL;
- while ( fseq->index < count ) {
- fscript = sieve_file_script_open_from_filename
- (fstorage, files[fseq->index++], NULL);
- if (fscript == NULL) {
+ } else {
+ files = array_get(&fseq->script_files, &count);
+
+ while ( fseq->index < count ) {
+ fscript = sieve_file_script_open_from_filename
+ (fstorage, files[fseq->index++], NULL);
+ if (fscript != NULL)
+ break;
if (seq->storage->error_code != SIEVE_ERROR_NOT_FOUND)
break;
sieve_storage_clear_error(seq->storage);
diff -r c01b68b0c6b1 -r 0c9797a8ae3c src/lib-sieve/storage/file/sieve-file-script.c
--- a/src/lib-sieve/storage/file/sieve-file-script.c Wed Jul 23 19:36:00 2014 +0200
+++ b/src/lib-sieve/storage/file/sieve-file-script.c Thu Jul 24 02:04:47 2014 +0200
@@ -148,8 +148,18 @@
struct sieve_file_script *sieve_file_script_init_from_name
(struct sieve_file_storage *fstorage, const char *name)
{
- return sieve_file_script_init_from_filename
- (fstorage, sieve_script_file_from_name(name), name);
+ struct sieve_storage *storage = &fstorage->storage;
+ struct sieve_file_script *fscript;
+
+ if (name != NULL) {
+ return sieve_file_script_init_from_filename
+ (fstorage, sieve_script_file_from_name(name), name);
+ }
+
+ fscript = sieve_file_script_alloc();
+ sieve_script_init
+ (&fscript->script, storage, &sieve_file_script, fstorage->path, NULL);
+ return fscript;
}
struct sieve_file_script *sieve_file_script_init_from_path
More information about the dovecot-cvs
mailing list