commit c7ceb56f6f78fb9f0981ea39cee5e8e4cd569539 Author: Oswald Buddenhagen <o...@kde.org> Date: Sun Mar 13 12:06:49 2011 +0100
move greeting response handling into get_cmd_result() the primary purpose of this is getting rid of the "free-standing" buffer_gets() call. src/drv_imap.c | 54 +++++++++++++++++++++++++++-------------------- 1 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/drv_imap.c b/src/drv_imap.c index da5b34e..a1a2145 100644 --- a/src/drv_imap.c +++ b/src/drv_imap.c @@ -129,7 +129,7 @@ typedef struct imap_store { #endif /* Used during sequential operations like connect */ - int preauth; + enum { GreetingPending = 0, GreetingBad, GreetingOk, GreetingPreauth } greeting; union { void (*imap_open)( store_t *srv, void *aux ); } callbacks; @@ -1098,6 +1098,7 @@ struct imap_cmd_trycreate { struct imap_cmd *orig_cmd; }; +static void imap_open_store_greeted( imap_store_t * ); static void get_cmd_result_p2( imap_store_t *, struct imap_cmd *, int ); static int @@ -1105,8 +1106,9 @@ get_cmd_result( imap_store_t *ctx, struct imap_cmd *tcmd ) { struct imap_cmd *cmdp, **pcmdp; char *cmd, *arg, *arg1, *p; - int n, resp, resp2, tag; + int n, resp, resp2, tag, greeted; + greeted = ctx->greeting; for (;;) { if (buffer_gets( &ctx->buf, &cmd )) break; @@ -1123,8 +1125,14 @@ get_cmd_result( imap_store_t *ctx, struct imap_cmd *tcmd ) ctx->ns_personal = parse_list( &cmd ); ctx->ns_other = parse_list( &cmd ); ctx->ns_shared = parse_list( &cmd ); - } else if (!strcmp( "OK", arg ) || !strcmp( "BAD", arg ) || - !strcmp( "NO", arg ) || !strcmp( "BYE", arg )) { + } else if (ctx->greeting == GreetingPending && !strcmp( "PREAUTH", arg )) { + ctx->greeting = GreetingPreauth; + parse_response_code( ctx, 0, cmd ); + } else if (!strcmp( "OK", arg )) { + ctx->greeting = GreetingOk; + parse_response_code( ctx, 0, cmd ); + } else if (!strcmp( "BAD", arg ) || !strcmp( "NO", arg ) || !strcmp( "BYE", arg )) { + ctx->greeting = GreetingBad; parse_response_code( ctx, 0, cmd ); } else if (!strcmp( "CAPABILITY", arg )) parse_capability( ctx, cmd ); @@ -1145,6 +1153,11 @@ get_cmd_result( imap_store_t *ctx, struct imap_cmd *tcmd ) error( "IMAP error: unrecognized untagged response '%s'\n", arg ); break; /* this may mean anything, so prefer not to spam the log */ } + if (greeted == GreetingPending) { + imap_ref( ctx ); + imap_open_store_greeted( ctx ); + return imap_deref( ctx ) ? RESP_CANCEL : RESP_OK; + } } else if (!ctx->in_progress) { error( "IMAP error: unexpected reply: %s %s\n", arg, cmd ? cmd : "" ); break; /* this may mean anything, so prefer not to spam the log */ @@ -1482,7 +1495,6 @@ imap_open_store( store_conf_t *conf, imap_server_conf_t *srvc = cfg->server; imap_store_t *ctx; store_t **ctxp; - char *arg, *rsp; struct hostent *he; struct sockaddr_in addr; int s, a[2]; @@ -1579,30 +1591,26 @@ imap_open_store( store_conf_t *conf, } } #endif + get_cmd_result( ctx, 0 ); + return; - /* read the greeting string */ - if (buffer_gets( &ctx->buf, &rsp )) - goto bail; - arg = next_arg( &rsp ); - if (!arg || *arg != '*' || (arg = next_arg( &rsp )) == NULL) { - error( "IMAP error: invalid greeting response\n" ); - goto bail; - } - if (!strcmp( "PREAUTH", arg )) - ctx->preauth = 1; - else if (strcmp( "OK", arg ) != 0) { + bail: + imap_open_store_bail( ctx ); +} + +static void +imap_open_store_greeted( imap_store_t *ctx ) +{ + if (ctx->greeting == GreetingBad) { error( "IMAP error: unknown greeting response\n" ); - goto bail; + imap_open_store_bail( ctx ); + return; } - parse_response_code( ctx, 0, rsp ); + if (!ctx->caps) imap_exec( ctx, 0, imap_open_store_p2, "CAPABILITY" ); else imap_open_store_authenticate( ctx ); - return; - - bail: - imap_open_store_bail( ctx ); } static void @@ -1617,7 +1625,7 @@ imap_open_store_p2( imap_store_t *ctx, struct imap_cmd *cmd ATTR_UNUSED, int res static void imap_open_store_authenticate( imap_store_t *ctx ) { - if (!ctx->preauth) { + if (ctx->greeting != GreetingPreauth) { #ifdef HAVE_LIBSSL imap_store_conf_t *cfg = (imap_store_conf_t *)ctx->gen.conf; imap_server_conf_t *srvc = cfg->server; ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ isync-devel mailing list isync-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/isync-devel