int mdbox_map_view_lookup_rec(struct mdbox_map *map, struct mail_index_view *view, uint32_t seq, struct dbox_mail_lookup_rec *rec_r) { const uint16_t *ref16_p; const void *data; memset(rec_r, 0, sizeof(*rec_r)); mail_index_lookup_uid(view, seq, &rec_r->map_uid); mail_index_lookup_ext(view, seq, map->map_ext_id, &data, NULL); if (data == NULL) { mdbox_map_set_corrupted(map, "missing map extension"); return -1; } memcpy(&rec_r->rec, data, sizeof(rec_r->rec)); mail_index_lookup_ext(view, seq, map->ref_ext_id, &data, NULL); if (data == NULL) { mdbox_map_set_corrupted(map, "missing ref extension"); return -1; } ref16_p = data; rec_r->refcount = *ref16_p; return 0; }
static void dbox_mail_set_expunged(struct dbox_mail *mail, uint32_t map_uid) { struct mail *_mail = &mail->imail.mail.mail; struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)_mail->box; (void)mail_index_refresh(_mail->box->index); if (mail_index_is_expunged(_mail->transaction->view, _mail->seq)) { mail_set_expunged(_mail); return; } mdbox_map_set_corrupted(mbox->storage->map, "Unexpectedly lost %s uid=%u map_uid=%u", mailbox_get_vname(_mail->box), _mail->uid, map_uid); }
static int mdbox_map_lookup_seq(struct mdbox_map *map, uint32_t seq, const struct mdbox_map_mail_index_record **rec_r) { const struct mdbox_map_mail_index_record *rec; const void *data; uint32_t uid; mail_index_lookup_ext(map->view, seq, map->map_ext_id, &data, NULL); rec = data; if (rec == NULL || rec->file_id == 0) { mail_index_lookup_uid(map->view, seq, &uid); mdbox_map_set_corrupted(map, "file_id=0 for map_uid=%u", uid); return -1; } *rec_r = rec; return 0; }
int mdbox_map_lookup_seq_full(struct mdbox_map *map, uint32_t seq, struct mdbox_map_mail_index_record *rec_r, uint16_t *refcount_r) { const struct mdbox_map_mail_index_record *rec; const uint16_t *ref16_p; const void *data; if (mdbox_map_lookup_seq(map, seq, &rec) < 0) return -1; *rec_r = *rec; mail_index_lookup_ext(map->view, seq, map->ref_ext_id, &data, NULL); if (data == NULL) { mdbox_map_set_corrupted(map, "missing ref extension"); return -1; } ref16_p = data; *refcount_r = *ref16_p; return 1; }