diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index 940569c8be..f2bdb70754 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -346,6 +346,8 @@ struct mailbox { /* Filled lazily when mailbox is opened, use mailbox_get_index_path() to access it */ const char *_index_path; + /* Reason for why mailbox is being accessed or NULL if unknown. */ + const char *reason; /* default vfuncs for new struct mails. */ const struct mail_vfuncs *mail_vfuncs; diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index 080018c42d..03eafb23ca 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -819,6 +819,13 @@ struct mailbox *mailbox_alloc_guid(struct mailbox_list *list, return box; } +void mailbox_set_reason(struct mailbox *box, const char *reason) +{ + i_assert(reason != NULL); + + box->reason = p_strdup(box->pool, reason); +} + static bool mailbox_is_autocreated(struct mailbox *box) { if (box->inbox_user) @@ -1125,6 +1132,12 @@ mailbox_open_full(struct mailbox *box, struct istream *input) if (box->opened) return 0; + + if (box->storage->set->mail_debug && box->reason != NULL) { + i_debug("%s: Mailbox opened because: %s", + box->vname, box->reason); + } + switch (box->open_error) { case 0: break; diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 3dc77dd449..9935369997 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -507,6 +507,9 @@ struct mailbox *mailbox_alloc(struct mailbox_list *list, const char *vname, struct mailbox *mailbox_alloc_guid(struct mailbox_list *list, const guid_128_t guid, enum mailbox_flags flags); +/* Set a human-readable reason for why this mailbox is being accessed. + This is used for logging purposes. */ +void mailbox_set_reason(struct mailbox *box, const char *reason); /* Get mailbox existence state. If auto_boxes=FALSE, return MAILBOX_EXISTENCE_NONE for autocreated mailboxes that haven't been physically created yet */