int dbox_attachment_file_get_stream(struct dbox_file *file, struct istream **stream) { const char *ext_refs, *error; int ret; /* need to read metadata in case there are external references */ if ((ret = dbox_file_metadata_read(file)) <= 0) return ret; i_stream_seek(file->input, file->cur_offset + file->msg_header_size); ext_refs = dbox_file_metadata_get(file, DBOX_METADATA_EXT_REF); if (ext_refs == NULL) return 1; /* we have external references. */ T_BEGIN { ret = dbox_attachment_file_get_stream_from(file, ext_refs, stream, &error); if (ret == 0) { dbox_file_set_corrupted(file, "Corrupted ext-refs metadata %s: %s", ext_refs, error); } } T_END; return ret; }
int dbox_mail_metadata_read(struct dbox_mail *mail, struct dbox_file **file_r) { struct dbox_storage *storage = (struct dbox_storage *)mail->imail.mail.mail.box->storage; uoff_t offset; if (storage->v.mail_open(mail, &offset, file_r) < 0) return -1; if (dbox_file_seek(*file_r, offset) <= 0) return -1; if (dbox_file_metadata_read(*file_r) <= 0) return -1; if (mail->imail.data.stream != NULL) { /* we just messed up mail's input stream by reading metadata */ i_stream_seek((*file_r)->input, offset); i_stream_sync(mail->imail.data.stream); } return 0; }