isync

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

commit 92b892d24757b117c8ee73741f263b46f4472a85
parent 27fa63a577cc23b87e78070a09ac22d28c8ea10d
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Sun,  8 Dec 2013 16:37:20 +0100

tag verbose output when channel links two verbose stores

otherwise it's pure guesswork to assign the output to particular stores.

Diffstat:
Msrc/drv_imap.c | 22+++++++++++++---------
Msrc/drv_maildir.c | 2+-
Msrc/isync.h | 6+++++-
Msrc/main.c | 7++++++-
4 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/src/drv_imap.c b/src/drv_imap.c @@ -83,6 +83,7 @@ struct imap_cmd; typedef struct imap_store { store_t gen; + const char *label; /* foreign */ const char *prefix; int ref_count; /* trash folder's existence is not confirmed yet */ @@ -254,9 +255,9 @@ send_imap_cmd( imap_store_t *ctx, struct imap_cmd *cmd ) if (ctx->num_in_progress) printf( "(%d in progress) ", ctx->num_in_progress ); if (memcmp( cmd->cmd, "LOGIN", 5 )) - printf( ">>> %s", buf ); + printf( "%s>>> %s", ctx->label, buf ); else - printf( ">>> %d LOGIN <user> <pass>\n", cmd->tag ); + printf( "%s>>> %d LOGIN <user> <pass>\n", ctx->label, cmd->tag ); fflush( stdout ); } if (socket_write( &ctx->conn, buf, bufl, KeepOwn ) < 0) @@ -692,9 +693,9 @@ parse_imap_list( imap_store_t *ctx, char **sp, parse_list_state_t *sts ) goto postpone; if (DFlags & XVERBOSE) { - puts( "=========" ); + printf( "%s=========\n", ctx->label ); fwrite( cur->val, cur->len, 1, stdout ); - puts( "=========" ); + printf( "%s=========\n", ctx->label ); fflush( stdout ); } @@ -702,7 +703,7 @@ parse_imap_list( imap_store_t *ctx, char **sp, parse_list_state_t *sts ) if (!(s = socket_read_line( &ctx->conn ))) goto postpone; if (DFlags & VERBOSE) { - puts( s ); + printf( "%s%s\n", ctx->label, s ); fflush( stdout ); } } else if (*s == '"') { @@ -1167,7 +1168,7 @@ imap_socket_read( void *aux ) if (!(cmd = socket_read_line( &ctx->conn ))) return; if (DFlags & VERBOSE) { - puts( cmd ); + printf( "%s%s\n", ctx->label, cmd ); fflush( stdout ); } @@ -1425,7 +1426,7 @@ do_cram_auth( imap_store_t *ctx, struct imap_cmd *cmdp, const char *prompt ) cram( prompt, srvc->user, srvc->pass, &resp, &l ); if (DFlags & VERBOSE) { - printf( ">+> %s\n", resp ); + printf( "%s>+> %s\n", ctx->label, resp ); fflush( stdout ); } if (socket_write( &ctx->conn, resp, l, GiveOwn ) < 0) @@ -1457,7 +1458,7 @@ static void imap_open_store_ssl_bail( imap_store_t * ); static void imap_open_store_bail( imap_store_t * ); static void -imap_open_store( store_conf_t *conf, +imap_open_store( store_conf_t *conf, const char *label, void (*cb)( store_t *srv, void *aux ), void *aux ) { imap_store_conf_t *cfg = (imap_store_conf_t *)conf; @@ -1468,12 +1469,14 @@ imap_open_store( store_conf_t *conf, for (ctxp = &unowned; (ctx = (imap_store_t *)*ctxp); ctxp = &ctx->gen.next) if (ctx->gen.conf == conf) { *ctxp = ctx->gen.next; + ctx->label = label; cb( &ctx->gen, aux ); return; } for (ctxp = &unowned; (ctx = (imap_store_t *)*ctxp); ctxp = &ctx->gen.next) if (((imap_store_conf_t *)ctx->gen.conf)->server == srvc) { *ctxp = ctx->gen.next; + ctx->label = label; /* One could ping the server here, but given that the idle timeout * is at least 30 minutes, this sounds pretty pointless. */ free_string_list( ctx->gen.boxes ); @@ -1491,6 +1494,7 @@ imap_open_store( store_conf_t *conf, ctx = nfcalloc( sizeof(*ctx) ); ctx->gen.conf = conf; + ctx->label = label; ctx->ref_count = 1; ctx->callbacks.imap_open = cb; ctx->callback_aux = aux; @@ -2355,7 +2359,7 @@ imap_parse_store( conffile_t *cfg, store_conf_t **storep ) } struct driver imap_driver = { - DRV_CRLF, + DRV_CRLF | DRV_VERBOSE, imap_parse_store, imap_cleanup, imap_open_store, diff --git a/src/drv_maildir.c b/src/drv_maildir.c @@ -122,7 +122,7 @@ maildir_join_path( const char *prefix, const char *box ) } static void -maildir_open_store( store_conf_t *conf, +maildir_open_store( store_conf_t *conf, const char *label ATTR_UNUSED, void (*cb)( store_t *ctx, void *aux ), void *aux ) { maildir_store_t *ctx; diff --git a/src/isync.h b/src/isync.h @@ -268,6 +268,10 @@ typedef struct { and as CRLF is the canonical format, we convert. */ #define DRV_CRLF 1 +/* + This flag says that the driver will act upon (DFlags & VERBOSE). +*/ +#define DRV_VERBOSE 2 #define LIST_PATH 1 #define LIST_INBOX 2 @@ -283,7 +287,7 @@ struct driver { /* Open a store with the given configuration. This may recycle existing * server connections. Upon failure, a null store is passed to the callback. */ - void (*open_store)( store_conf_t *conf, + void (*open_store)( store_conf_t *conf, const char *label, void (*cb)( store_t *ctx, void *aux ), void *aux ); /* Mark the store as available for recycling. Server connection may be kept alive. */ diff --git a/src/main.c b/src/main.c @@ -519,6 +519,7 @@ sync_chans( main_vars_t *mvars, int ent ) channel_conf_t *chan; string_list_t *mbox, *sbox, **mboxp, **sboxp; char *channame, *boxp, *nboxp; + const char *labels[2]; int t; if (!mvars->cben) @@ -585,10 +586,14 @@ sync_chans( main_vars_t *mvars, int ent ) mvars->state[M] = mvars->state[S] = ST_FRESH; info( "Channel %s\n", mvars->chan->name ); mvars->skip = mvars->cben = 0; + if (mvars->chan->stores[M]->driver->flags & mvars->chan->stores[S]->driver->flags & DRV_VERBOSE) + labels[M] = "M: ", labels[S] = "S: "; + else + labels[M] = labels[S] = ""; for (t = 0; t < 2; t++) { info( "Opening %s %s...\n", str_ms[t], mvars->chan->stores[t]->name ); mvars->drv[t] = mvars->chan->stores[t]->driver; - mvars->drv[t]->open_store( mvars->chan->stores[t], store_opened, AUX ); + mvars->drv[t]->open_store( mvars->chan->stores[t], labels[t], store_opened, AUX ); if (mvars->skip) break; }