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