isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

commit a266f28f1c35e555b570879b1655eb470e0d33b5
parent 171f7d6cd3f6b836e41accd6b47edcfa2a0b748c
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Sat, 19 Mar 2011 22:12:55 +0100

cancel submitted commands when canceling store

we already have some minimal asynchronicity, so there might be commands
in flight when a fatal error comes in.

Diffstat:
Msrc/drv_imap.c | 16++++++++++++++++
1 file changed, 16 insertions(+), 0 deletions(-)

diff --git a/src/drv_imap.c b/src/drv_imap.c @@ -283,6 +283,21 @@ submit_imap_cmd( imap_store_t *ctx, struct imap_cmd *cmd, const char *fmt, ... ) return ret; } +static void +cancel_submitted_imap_cmds( imap_store_t *ctx ) +{ + struct imap_cmd *cmd; + + while ((cmd = ctx->in_progress)) { + ctx->in_progress = cmd->next; + /* don't update num_in_progress and in_progress_append - store is dead */ + cmd->param.done( ctx, cmd, RESP_CANCEL ); + free( cmd->param.data ); + free( cmd->cmd ); + free( cmd ); + } +} + static int imap_exec( imap_store_t *ctx, struct imap_cmd *cmdp, void (*done)( imap_store_t *ctx, struct imap_cmd *cmd, int response ), @@ -927,6 +942,7 @@ imap_cancel_store( store_t *gctx ) imap_store_t *ctx = (imap_store_t *)gctx; socket_close( &ctx->conn ); + cancel_submitted_imap_cmds( ctx ); free_generic_messages( ctx->gen.msgs ); free_string_list( ctx->gen.boxes ); free_list( ctx->ns_personal );