From: Timo Sirainen Date: Wed, 26 Oct 2016 20:20:17 +0000 (+0300) Subject: doveadm dump: Dump mailbox names in mailbox.list.index's header. X-Git-Tag: 2.3.0.rc1~2752 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7bab7c949c28f3b72fde43604111c349de9b9063;p=thirdparty%2Fdovecot%2Fcore.git doveadm dump: Dump mailbox names in mailbox.list.index's header. --- diff --git a/src/doveadm/doveadm-dump-index.c b/src/doveadm/doveadm-dump-index.c index 40cc91b89c..0b165a1811 100644 --- a/src/doveadm/doveadm-dump-index.c +++ b/src/doveadm/doveadm-dump-index.c @@ -71,6 +71,10 @@ struct mobox_map_mail_index_record { uint32_t size; guid_128_t oid; }; +struct mailbox_list_index_header { + uint8_t refresh_flag; + /* array of { uint32_t id; char name[]; } */ +}; struct mailbox_list_index_record { uint32_t name_id; uint32_t parent_uid; @@ -151,6 +155,41 @@ static void dump_hdr(struct mail_index *index) printf("day first uid[%u] ......... = %u\n", i, hdr->day_first_uid[i]); } +static void dump_list_header(const void *data, size_t size) +{ + const struct mailbox_list_index_header *hdr = data; + const void *name_start, *p; + size_t i, len; + uint32_t id; + + printf(" - refresh_flag = %d\n", hdr->refresh_flag); + for (i = sizeof(*hdr); i < size; ) { + /* get id */ + if (i + sizeof(id) > size) { + printf(" - corrupted\n"); + break; + } + memcpy(&id, CONST_PTR_OFFSET(data, i), sizeof(id)); + i += sizeof(id); + + if (id == 0) + break; + + /* get name */ + p = memchr(CONST_PTR_OFFSET(data, i), '\0', size-i); + if (p == NULL) { + printf(" - corrupted\n"); + break; + } + name_start = CONST_PTR_OFFSET(data, i); + len = (const char *)p - (const char *)name_start; + + printf(" - %d : %.*s\n", id, (int)len, name_start); + + i += len + 1; + } +} + static void dump_extension_header(struct mail_index *index, const struct mail_index_ext *ext) { @@ -266,6 +305,10 @@ static void dump_extension_header(struct mail_index *index, name += rec->name_len; } + } else if (strcmp(ext->name, "list") == 0) { + printf("header ........ = %s\n", + binary_to_hex(data, ext->hdr_size)); + dump_list_header(data, ext->hdr_size); } else { printf("header ........ = %s\n", binary_to_hex(data, ext->hdr_size));