From 4eb82acbc39560eded6f4499b19b91c33b15e79c Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 21 Jan 2022 16:29:48 +0200 Subject: [PATCH] doveadm: doveadm_mail_iter_init() - Add DOVEADM_MAIL_ITER_FLAG_STOP_WITH_CLIENT When this flag is used, the iteration is stopped if print ostream has reported an error, i.e. doveadm-client has disconnected. --- src/doveadm/doveadm-mail-iter.c | 9 +++++++++ src/doveadm/doveadm-mail-iter.h | 2 ++ 2 files changed, 11 insertions(+) diff --git a/src/doveadm/doveadm-mail-iter.c b/src/doveadm/doveadm-mail-iter.c index c4c6d9273a..eca5421ec2 100644 --- a/src/doveadm/doveadm-mail-iter.c +++ b/src/doveadm/doveadm-mail-iter.c @@ -1,15 +1,18 @@ /* Copyright (c) 2010-2018 Dovecot authors, see the included COPYING file */ #include "lib.h" +#include "ostream.h" #include "mail-storage.h" #include "mail-namespace.h" #include "mail-search.h" +#include "doveadm-print.h" #include "doveadm-mail.h" #include "doveadm-mail-iter.h" struct doveadm_mail_iter { struct doveadm_mail_cmd_context *ctx; struct mail_search_args *search_args; + enum doveadm_mail_iter_flags flags; struct mailbox *box; struct mailbox_transaction_context *t; @@ -36,6 +39,7 @@ int doveadm_mail_iter_init(struct doveadm_mail_cmd_context *ctx, iter = i_new(struct doveadm_mail_iter, 1); iter->ctx = ctx; + iter->flags = flags; iter->box = mailbox_alloc(info->ns->list, info->vname, MAILBOX_FLAG_IGNORE_ACLS | readonly_flag); iter->search_args = search_args; @@ -158,6 +162,11 @@ bool doveadm_mail_iter_next(struct doveadm_mail_iter *iter, iter->killed = TRUE; return FALSE; } + if ((iter->flags & DOVEADM_MAIL_ITER_FLAG_STOP_WITH_CLIENT) != 0 && + doveadm_print_ostream->stream_errno != 0) { + iter->killed = TRUE; + return FALSE; + } return mailbox_search_next(iter->search_ctx, mail_r); } diff --git a/src/doveadm/doveadm-mail-iter.h b/src/doveadm/doveadm-mail-iter.h index cbb51044e3..32cc2328d5 100644 --- a/src/doveadm/doveadm-mail-iter.h +++ b/src/doveadm/doveadm-mail-iter.h @@ -6,6 +6,8 @@ enum doveadm_mail_iter_flags { /* Open the mailbox with MAILBOX_FLAG_READONLY */ DOVEADM_MAIL_ITER_FLAG_READONLY = BIT(0), + /* Stop the iteration if client is detected to be disconnected. */ + DOVEADM_MAIL_ITER_FLAG_STOP_WITH_CLIENT = BIT(1), }; struct doveadm_mail_iter; -- 2.47.3