dovecot-2.2: lib-storage: Moved more of dbox attachments code to...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Nov 6 23:01:14 EET 2013
details: http://hg.dovecot.org/dovecot-2.2/rev/0ed18f77ff08
changeset: 16946:0ed18f77ff08
user: Timo Sirainen <tss at iki.fi>
date: Wed Nov 06 23:00:58 2013 +0200
description:
lib-storage: Moved more of dbox attachments code to generic code.
diffstat:
src/lib-storage/index/dbox-common/dbox-attachment.c | 163 +-------------------
src/lib-storage/index/dbox-common/dbox-attachment.h | 4 -
src/lib-storage/index/dbox-multi/mdbox-purge.c | 8 +-
src/lib-storage/index/dbox-single/sdbox-copy.c | 2 +-
src/lib-storage/index/dbox-single/sdbox-file.c | 2 +-
src/lib-storage/index/dbox-single/sdbox-sync.c | 3 +-
src/lib-storage/index/index-attachment.c | 158 +++++++++++++++++++-
src/lib-storage/index/index-attachment.h | 12 +
8 files changed, 185 insertions(+), 167 deletions(-)
diffs (truncated from 482 to 300 lines):
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/dbox-common/dbox-attachment.c
--- a/src/lib-storage/index/dbox-common/dbox-attachment.c Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/dbox-common/dbox-attachment.c Wed Nov 06 23:00:58 2013 +0200
@@ -3,155 +3,32 @@
#include "lib.h"
#include "istream.h"
#include "str.h"
-#include "fs-api.h"
-#include "istream-fs-file.h"
-#include "istream-attachment-connector.h"
#include "dbox-file.h"
#include "dbox-save.h"
#include "dbox-attachment.h"
-enum dbox_attachment_decode_option {
- DBOX_ATTACHMENT_DECODE_OPTION_NONE = '-',
- DBOX_ATTACHMENT_DECODE_OPTION_BASE64 = 'B',
- DBOX_ATTACHMENT_DECODE_OPTION_CRLF = 'C'
-};
-
void dbox_attachment_save_write_metadata(struct mail_save_context *ctx,
string_t *str)
{
const ARRAY_TYPE(mail_attachment_extref) *extrefs;
- const struct mail_attachment_extref *extref;
- bool add_space = FALSE;
- unsigned int startpos;
extrefs = index_attachment_save_get_extrefs(ctx);
if (extrefs == NULL || array_count(extrefs) == 0)
return;
str_append_c(str, DBOX_METADATA_EXT_REF);
- array_foreach(extrefs, extref) {
- if (!add_space)
- add_space = TRUE;
- else
- str_append_c(str, ' ');
- str_printfa(str, "%"PRIuUOFF_T" %"PRIuUOFF_T" ",
- extref->start_offset, extref->size);
-
- startpos = str_len(str);
- if (extref->base64_have_crlf)
- str_append_c(str, DBOX_ATTACHMENT_DECODE_OPTION_CRLF);
- if (extref->base64_blocks_per_line > 0) {
- str_printfa(str, "%c%u",
- DBOX_ATTACHMENT_DECODE_OPTION_BASE64,
- extref->base64_blocks_per_line * 4);
- }
- if (startpos == str_len(str)) {
- /* make it clear there are no options */
- str_append_c(str, DBOX_ATTACHMENT_DECODE_OPTION_NONE);
- }
- str_append_c(str, ' ');
- str_append(str, extref->path);
- }
+ index_attachment_append_extrefs(str, extrefs);
str_append_c(str, '\n');
}
-static bool
-parse_extref_decode_options(const char *str,
- struct mail_attachment_extref *extref)
-{
- unsigned int num;
-
- if (*str == DBOX_ATTACHMENT_DECODE_OPTION_NONE)
- return str[1] == '\0';
-
- while (*str != '\0') {
- switch (*str) {
- case DBOX_ATTACHMENT_DECODE_OPTION_BASE64:
- str++; num = 0;
- while (*str >= '0' && *str <= '9') {
- num = num*10 + (*str-'0');
- str++;
- }
- if (num == 0 || num % 4 != 0)
- return FALSE;
-
- extref->base64_blocks_per_line = num/4;
- break;
- case DBOX_ATTACHMENT_DECODE_OPTION_CRLF:
- extref->base64_have_crlf = TRUE;
- str++;
- break;
- default:
- return FALSE;
- }
- }
- return TRUE;
-}
-
-static bool
-dbox_attachment_parse_extref_real(const char *line, pool_t pool,
- ARRAY_TYPE(mail_attachment_extref) *extrefs)
-{
- struct mail_attachment_extref extref;
- const char *const *args;
- unsigned int i, len;
- uoff_t last_voffset;
-
- args = t_strsplit(line, " ");
- len = str_array_length(args);
- if ((len % 4) != 0)
- return FALSE;
-
- last_voffset = 0;
- for (i = 0; args[i] != NULL; i += 4) {
- const char *start_offset_str = args[i+0];
- const char *size_str = args[i+1];
- const char *decode_options = args[i+2];
- const char *path = args[i+3];
-
- memset(&extref, 0, sizeof(extref));
- if (str_to_uoff(start_offset_str, &extref.start_offset) < 0 ||
- str_to_uoff(size_str, &extref.size) < 0 ||
- extref.start_offset < last_voffset ||
- !parse_extref_decode_options(decode_options, &extref))
- return FALSE;
-
- last_voffset += extref.size +
- (extref.start_offset - last_voffset);
-
- extref.path = p_strdup(pool, path);
- array_append(extrefs, &extref, 1);
- }
- return TRUE;
-}
-
-bool dbox_attachment_parse_extref(const char *line, pool_t pool,
- ARRAY_TYPE(mail_attachment_extref) *extrefs)
-{
- bool ret;
-
- T_BEGIN {
- ret = dbox_attachment_parse_extref_real(line, pool, extrefs);
- } T_END;
- return ret;
-}
-
static int
dbox_attachment_file_get_stream_from(struct dbox_file *file,
const char *ext_refs,
struct istream **stream,
const char **error_r)
{
- ARRAY_TYPE(mail_attachment_extref) extrefs_arr;
- const struct mail_attachment_extref *extref;
- struct istream_attachment_connector *conn;
- struct fs_file *fsfile;
- struct istream *input;
- const char *path, *path_suffix;
+ const char *path_suffix;
uoff_t msg_size;
- int ret;
-
- *error_r = NULL;
if (*file->storage->attachment_dir == '\0') {
mail_storage_set_critical(&file->storage->storage,
@@ -160,37 +37,13 @@
return -1;
}
- t_array_init(&extrefs_arr, 16);
- if (!dbox_attachment_parse_extref_real(ext_refs, pool_datastack_create(),
- &extrefs_arr)) {
- *error_r = "Broken ext-refs string";
+ msg_size = dbox_file_get_plaintext_size(file);
+ path_suffix = file->storage->v.get_attachment_path_suffix(file);
+ if (index_attachment_stream_get(file->storage->attachment_fs,
+ file->storage->attachment_dir,
+ path_suffix, stream, msg_size,
+ ext_refs, error_r) < 0)
return 0;
- }
- msg_size = dbox_file_get_plaintext_size(file);
- conn = istream_attachment_connector_begin(*stream, msg_size);
-
- path_suffix = file->storage->v.get_attachment_path_suffix(file);
- array_foreach(&extrefs_arr, extref) {
- path = t_strdup_printf("%s/%s%s", file->storage->attachment_dir,
- extref->path, path_suffix);
- fsfile = fs_file_init(file->storage->attachment_fs, path,
- FS_OPEN_MODE_READONLY);
- input = i_stream_create_fs_file(&fsfile, IO_BLOCK_SIZE);
-
- ret = istream_attachment_connector_add(conn, input,
- extref->start_offset, extref->size,
- extref->base64_blocks_per_line,
- extref->base64_have_crlf, error_r);
- i_stream_unref(&input);
- if (ret < 0) {
- istream_attachment_connector_abort(&conn);
- return 0;
- }
- }
-
- input = istream_attachment_connector_finish(&conn);
- i_stream_unref(stream);
- *stream = input;
return 1;
}
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/dbox-common/dbox-attachment.h
--- a/src/lib-storage/index/dbox-common/dbox-attachment.h Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/dbox-common/dbox-attachment.h Wed Nov 06 23:00:58 2013 +0200
@@ -8,10 +8,6 @@
void dbox_attachment_save_write_metadata(struct mail_save_context *ctx,
string_t *str);
-/* Parse DBOX_METADATA_EXT_REF line to given array. Names are allocated
- from the given pool. */
-bool dbox_attachment_parse_extref(const char *line, pool_t pool,
- ARRAY_TYPE(mail_attachment_extref) *extrefs);
/* Build a single message body stream out of the current message and all of its
attachments. */
int dbox_attachment_file_get_stream(struct dbox_file *file,
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/dbox-multi/mdbox-purge.c
--- a/src/lib-storage/index/dbox-multi/mdbox-purge.c Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-purge.c Wed Nov 06 23:00:58 2013 +0200
@@ -147,13 +147,13 @@
/* end of metadata */
break;
}
- if (*line == DBOX_METADATA_EXT_REF) {
- if (!dbox_attachment_parse_extref(line+1, ext_refs_pool,
- extrefs)) {
+ if (*line == DBOX_METADATA_EXT_REF) T_BEGIN {
+ if (!index_attachment_parse_extrefs(line+1, ext_refs_pool,
+ extrefs)) {
i_warning("%s: Ignoring corrupted extref: %s",
file->cur_path, line);
}
- }
+ } T_END;
}
i_stream_set_max_buffer_size(file->input, buf_size);
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/dbox-single/sdbox-copy.c
--- a/src/lib-storage/index/dbox-single/sdbox-copy.c Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/dbox-single/sdbox-copy.c Wed Nov 06 23:00:58 2013 +0200
@@ -40,7 +40,7 @@
pool = pool_alloconly_create("sdbox attachments copy", 1024);
p_array_init(&extrefs, pool, 16);
- if (!dbox_attachment_parse_extref(extrefs_line, pool, &extrefs)) {
+ if (!index_attachment_parse_extrefs(extrefs_line, pool, &extrefs)) {
mail_storage_set_critical(&dest_storage->storage,
"Can't copy %s with corrupted extref metadata: %s",
src_file->file.cur_path, extrefs_line);
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/dbox-single/sdbox-file.c
--- a/src/lib-storage/index/dbox-single/sdbox-file.c Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/dbox-single/sdbox-file.c Wed Nov 06 23:00:58 2013 +0200
@@ -436,7 +436,7 @@
pool = pool_alloconly_create("sdbox attachments unlink", 1024);
p_array_init(&extrefs, pool, 16);
- if (!dbox_attachment_parse_extref(extrefs_line, pool, &extrefs)) {
+ if (!index_attachment_parse_extrefs(extrefs_line, pool, &extrefs)) {
i_warning("%s: Ignoring corrupted extref: %s",
sfile->file.cur_path, extrefs_line);
array_clear(&extrefs);
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/dbox-single/sdbox-sync.c
--- a/src/lib-storage/index/dbox-single/sdbox-sync.c Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/dbox-single/sdbox-sync.c Wed Nov 06 23:00:58 2013 +0200
@@ -160,8 +160,9 @@
/* NOTE: Index is no longer locked. Multiple processes may be unlinking
the files at the same time. */
ctx->mbox->box.tmp_sync_view = ctx->sync_view;
- array_foreach(&ctx->expunged_uids, uidp)
+ array_foreach(&ctx->expunged_uids, uidp) T_BEGIN {
dbox_sync_file_expunge(ctx, *uidp);
+ } T_END;
if (ctx->mbox->box.v.sync_notify != NULL)
ctx->mbox->box.v.sync_notify(&ctx->mbox->box, 0, 0);
ctx->mbox->box.tmp_sync_view = NULL;
diff -r 883ba4a47829 -r 0ed18f77ff08 src/lib-storage/index/index-attachment.c
--- a/src/lib-storage/index/index-attachment.c Wed Nov 06 21:10:22 2013 +0200
+++ b/src/lib-storage/index/index-attachment.c Wed Nov 06 23:00:58 2013 +0200
@@ -10,11 +10,20 @@
#include "str.h"
#include "message-parser.h"
#include "rfc822-parser.h"
+#include "fs-api.h"
+#include "istream-fs-file.h"
+#include "istream-attachment-connector.h"
#include "istream-attachment-extractor.h"
#include "mail-user.h"
#include "index-mail.h"
#include "index-attachment.h"
+enum mail_attachment_decode_option {
+ MAIL_ATTACHMENT_DECODE_OPTION_NONE = '-',
+ MAIL_ATTACHMENT_DECODE_OPTION_BASE64 = 'B',
+ MAIL_ATTACHMENT_DECODE_OPTION_CRLF = 'C'
+};
+
struct mail_save_attachment {
More information about the dovecot-cvs
mailing list