static void list_expunged(const char *mboxname) { struct mailbox *mailbox = NULL; struct index_record *records = NULL; int alloc = 0; int num = 0; int i; int r; r = mailbox_open_irl(mboxname, &mailbox); if (r) { printf("Failed to open mailbox %s: %s", mboxname, error_message(r)); return; } /* first pass - read the records. Don't print until we release the * lock */ struct mailbox_iter *iter = mailbox_iter_init(mailbox, 0, ITER_SKIP_UNLINKED); const message_t *msg; while ((msg = mailbox_iter_step(iter))) { const struct index_record *record = msg_record(msg); /* still active */ if (!(record->internal_flags & FLAG_INTERNAL_EXPUNGED)) continue; /* pre-allocate more space */ if (alloc <= num) { alloc += 64; records = xrealloc(records, sizeof(struct index_record) * alloc); } records[num] = *record; num++; } mailbox_iter_done(&iter); mailbox_unlock_index(mailbox, NULL); for (i = 0; i < num; i++) { const struct index_record *record = &records[i]; printf("UID: %u\n", record->uid); printf("\tSize: %u\n", record->size); printf("\tSent: %s", ctime(&record->sentdate)); printf("\tRecv: %s", ctime(&record->internaldate)); printf("\tExpg: %s", ctime(&record->last_updated)); if (mailbox_cacherecord(mailbox, record)) { printf("\tERROR: cache record missing or corrupt, " "not printing cache details\n\n"); continue; } printf("\tFrom: %.*s\n", cacheitem_size(record, CACHE_FROM), cacheitem_base(record, CACHE_FROM)); printf("\tTo : %.*s\n", cacheitem_size(record, CACHE_TO), cacheitem_base(record, CACHE_TO)); printf("\tCc : %.*s\n", cacheitem_size(record, CACHE_CC), cacheitem_base(record, CACHE_CC)); printf("\tBcc : %.*s\n", cacheitem_size(record, CACHE_BCC), cacheitem_base(record, CACHE_BCC)); printf("\tSubj: %.*s\n\n", cacheitem_size(record, CACHE_SUBJECT), cacheitem_base(record, CACHE_SUBJECT)); } free(records); mailbox_close(&mailbox); }
static void list_expunged(const char *mboxname) { struct mailbox *mailbox = NULL; struct index_record *records = NULL; struct index_record *record; uint32_t recno; int alloc = 0; int num = 0; int i; int r; r = mailbox_open_irl(mboxname, &mailbox); if (r) { printf("Failed to open mailbox %s: %s", mboxname, error_message(r)); return; } /* first pass - read the records. Don't print until we release the * lock */ for (recno = 1; recno <= mailbox->i.num_records; recno++) { /* pre-allocate more space */ if (alloc <= num) { alloc += 64; records = xrealloc(records, sizeof(struct index_record) * alloc); } record = &records[num]; if (mailbox_read_index_record(mailbox, recno, record)) continue; /* still active */ if (!(record->system_flags & FLAG_EXPUNGED)) continue; /* no file, unrescuable */ if (record->system_flags & FLAG_UNLINKED) continue; num++; } mailbox_unlock_index(mailbox, NULL); for (i = 0; i < num; i++) { record = &records[i]; printf("UID: %u\n", record->uid); printf("\tSize: %u\n", record->size); printf("\tSent: %s", ctime(&record->sentdate)); printf("\tRecv: %s", ctime(&record->internaldate)); printf("\tExpg: %s", ctime(&record->last_updated)); if (mailbox_cacherecord(mailbox, record)) { printf("\tERROR: cache record missing or corrupt, " "not printing cache details\n\n"); continue; } printf("\tFrom: %.*s\n", cacheitem_size(record, CACHE_FROM), cacheitem_base(record, CACHE_FROM)); printf("\tTo : %.*s\n", cacheitem_size(record, CACHE_TO), cacheitem_base(record, CACHE_TO)); printf("\tCc : %.*s\n", cacheitem_size(record, CACHE_CC), cacheitem_base(record, CACHE_CC)); printf("\tBcc : %.*s\n", cacheitem_size(record, CACHE_BCC), cacheitem_base(record, CACHE_BCC)); printf("\tSubj: %.*s\n\n", cacheitem_size(record, CACHE_SUBJECT), cacheitem_base(record, CACHE_SUBJECT)); } free(records); mailbox_close(&mailbox); }