]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: doveadm_mail_iter_init() - Add DOVEADM_MAIL_ITER_FLAG_STOP_WITH_CLIENT
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 21 Jan 2022 14:29:48 +0000 (16:29 +0200)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Tue, 25 Jan 2022 18:25:50 +0000 (18:25 +0000)
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
src/doveadm/doveadm-mail-iter.h

index c4c6d9273af31025c44b10b9bb59dc59d2fc9458..eca5421ec2e85aa8695818a8a06190fac8b83139 100644 (file)
@@ -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);
 }
 
index cbb51044e314e279cde1a72e143ac555533253f3..32cc2328d5e167462f8b5a8cd4107863a5ab05dc 100644 (file)
@@ -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;