]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm dump: Dump mailbox names in mailbox.list.index's header.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 26 Oct 2016 20:20:17 +0000 (23:20 +0300)
committerGitLab <gitlab@git.dovecot.net>
Wed, 26 Oct 2016 21:39:25 +0000 (00:39 +0300)
src/doveadm/doveadm-dump-index.c

index 40cc91b89c7d87a05b495831a9677befb6cffc9a..0b165a18119363bc6326a4469be01720a0a9ca4a 100644 (file)
@@ -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));