commit 8b8313997c357238d85eb70e8fdee005c746eedf
Author: Oswald Buddenhagen <[email protected]>
Date: Tue Jul 30 07:50:49 2024 +0200
Revert "actually implement imap_commit_cmds()"
the CHECK command doesn't do what i thought; the formulation in the
specs was ambiguous - it really checks for new mail, rather than
committing, and each operation is supposed to be atomic. inefficient,
but safe. IMAP4rev2 eliminates the command altogether, subsuming its
function under NOOP.
consequently, the commit callback doesn't make sense for imap.
in principle, we could use it to coalesce multiple STOREs to counter the
inefficiency, but that won't happen any time soon, and the
implementation would look rather differently anyway.
as a "side effect", this fixes an assertion failure in imap_close_box()
when all flag sets failed (e.g., b/c the box was read-only), as their
callbacks would be short-cut in front of the completion of the CHECK
command, which was not sequenced before the close_box() call.
This reverts commit cfaa4848dd7c72e628fcc81a4c4532c9be226144.
src/drv_imap.c | 55 +++++++-------------------------------------------
1 file changed, 7 insertions(+), 48 deletions(-)
diff --git a/src/drv_imap.c b/src/drv_imap.c
index 170e7fc..681117e 100644
--- a/src/drv_imap.c
+++ b/src/drv_imap.c
@@ -163,8 +163,7 @@ union imap_store {
// Command queue
imap_cmd_t *pending, **pending_append;
imap_cmd_t *in_progress, **in_progress_append;
- imap_cmd_t *wait_check, **wait_check_append;
- int nexttag, num_in_progress, num_wait_check;
+ int nexttag, num_in_progress;
uint buffer_mem; // Memory currently occupied by buffers in
the queue
// Used during sequential operations like connect
@@ -204,7 +203,6 @@ union imap_store {
uint data_len; \
uint uid; /* to identify fetch responses */ \
char high_prio; /* if command is queued, put it at the front
of the queue. */ \
- char wait_check; /* Don't report success until subsequent
CHECK success. */ \
char to_trash; /* we are storing to trash, not current. */ \
char create; /* create the mailbox if we get an error which
suggests so. */ \
char failok; /* Don't complain about NO (@1) / BAD (@2)
response. */ \
@@ -352,8 +350,6 @@ new_imap_cmd( uint size )
static void
done_imap_cmd( imap_store_t *ctx, imap_cmd_t *cmd, int response )
{
- if (cmd->param.wait_check)
- ctx->num_wait_check--;
if (cmd->param.data) {
free( cmd->param.data );
cmd->param.data = NULL;
@@ -482,18 +478,6 @@ flush_imap_cmds( imap_store_t *ctx )
}
}
-static void
-finalize_checked_imap_cmds( imap_store_t *ctx, int resp )
-{
- imap_cmd_t *cmd;
-
- while ((cmd = ctx->wait_check)) {
- if (!(ctx->wait_check = cmd->next))
- ctx->wait_check_append = &ctx->wait_check;
- done_imap_cmd( ctx, cmd, resp );
- }
-}
-
static void
cancel_pending_imap_cmds( imap_store_t *ctx )
{
@@ -527,8 +511,6 @@ submit_imap_cmd( imap_store_t *ctx, imap_cmd_t *cmd )
assert( cmd );
assert( cmd->param.done );
- if (cmd->param.wait_check)
- ctx->num_wait_check++;
if ((ctx->pending && !cmd->param.high_prio) || !cmd_sendable( ctx, cmd
)) {
if (ctx->pending && cmd->param.high_prio) {
cmd->next = ctx->pending;
@@ -1943,13 +1925,7 @@ imap_socket_read( void *aux )
imap_ref( ctx );
if (resp == RESP_CANCEL)
imap_invoke_bad_callback( ctx );
- if (resp == RESP_OK && cmdp->param.wait_check) {
- cmdp->next = NULL;
- *ctx->wait_check_append = cmdp;
- ctx->wait_check_append = &cmdp->next;
- } else {
- done_imap_cmd( ctx, cmdp, resp );
- }
+ done_imap_cmd( ctx, cmdp, resp );
if (imap_deref( ctx ))
return;
if (ctx->canceling && !ctx->in_progress) {
@@ -1972,7 +1948,6 @@ get_cmd_result_p2( imap_store_t *ctx, imap_cmd_t *cmd,
int response )
if (response != RESP_OK) {
done_imap_cmd( ctx, ocmd, response );
} else {
- assert( !ocmd->param.wait_check );
ctx->uidnext = 1;
if (ocmd->param.to_trash)
ctx->trashnc = TrashKnown;
@@ -1993,7 +1968,6 @@ imap_cancel_store( store_t *gctx )
sasl_dispose( &ctx->sasl );
#endif
socket_close( &ctx->conn );
- finalize_checked_imap_cmds( ctx, RESP_CANCEL );
cancel_sent_imap_cmds( ctx );
cancel_pending_imap_cmds( ctx );
free( ctx->ns_prefix );
@@ -2053,7 +2027,7 @@ imap_free_store( store_t *gctx )
{
imap_store_t *ctx = (imap_store_t *)gctx;
- assert( !ctx->pending && !ctx->in_progress && !ctx->wait_check );
+ assert( !ctx->pending && !ctx->in_progress );
if (ctx->state == SST_BAD) {
imap_cancel_store( gctx );
@@ -2164,7 +2138,6 @@ imap_alloc_store( store_conf_t *conf, const char *label )
imap_socket_read, (void (*)(void *))flush_imap_cmds, ctx );
ctx->in_progress_append = &ctx->in_progress;
ctx->pending_append = &ctx->pending;
- ctx->wait_check_append = &ctx->wait_check;
gotsrv:
ctx->conf = cfg;
@@ -2878,7 +2851,7 @@ imap_select_box( store_t *gctx, const char *name )
{
imap_store_t *ctx = (imap_store_t *)gctx;
- assert( !ctx->pending && !ctx->in_progress && !ctx->wait_check );
+ assert( !ctx->pending && !ctx->in_progress );
reset_imap_messages( &ctx->msgs );
@@ -3278,9 +3251,7 @@ imap_flags_helper( imap_store_t *ctx, uint uid, char
what, int flags,
char buf[256];
buf[imap_make_flags( flags, buf )] = 0;
- imap_cmd_t *cmd = imap_refcounted_new_cmd( &sts->gen );
- cmd->param.wait_check = 1;
- imap_exec( ctx, cmd, imap_set_flags_p2,
+ imap_exec( ctx, imap_refcounted_new_cmd( &sts->gen ), imap_set_flags_p2,
"UID STORE %u %cFLAGS.SILENT %s", uid, what, buf );
}
@@ -3352,7 +3323,7 @@ imap_close_box( store_t *gctx,
{
imap_store_t *ctx = (imap_store_t *)gctx;
- assert( !ctx->num_wait_check );
+ assert( !ctx->pending && !ctx->in_progress );
if (ctx->opts & OPEN_UID_EXPUNGE) {
INIT_REFCOUNTED_STATE(imap_expunge_state_t, sts, cb, aux)
@@ -3672,7 +3643,6 @@ imap_cancel_cmds( store_t *gctx,
{
imap_store_t *ctx = (imap_store_t *)gctx;
- finalize_checked_imap_cmds( ctx, RESP_CANCEL );
cancel_pending_imap_cmds( ctx );
if (ctx->in_progress) {
ctx->canceling = 1;
@@ -3685,21 +3655,10 @@ imap_cancel_cmds( store_t *gctx,
/******************* imap_commit_cmds *******************/
-static void imap_commit_cmds_p2( imap_store_t *, imap_cmd_t *, int );
-
static void
imap_commit_cmds( store_t *gctx )
{
- imap_store_t *ctx = (imap_store_t *)gctx;
-
- if (ctx->num_wait_check)
- imap_exec( ctx, NULL, imap_commit_cmds_p2, "CHECK" );
-}
-
-static void
-imap_commit_cmds_p2( imap_store_t *ctx, imap_cmd_t *cmd ATTR_UNUSED, int
response )
-{
- finalize_checked_imap_cmds( ctx, response );
+ (void)gctx;
}
/******************* imap_get_memory_usage *******************/
_______________________________________________
isync-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/isync-devel