commit 8b8313997c357238d85eb70e8fdee005c746eedf
Author: Oswald Buddenhagen <o...@users.sf.net>
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
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to