From 3ebcd58b39ed808d967c502b332efc868e468a3c Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Tue, 15 May 2007 09:51:58 +0200 Subject: [PATCH 1/1] simplify pop_query, letting it do the snprintf and append \r\n Signed-off-by: Pierre Habouzit --- pop.c | 134 +++++++++++++++++++++++----------------------------------- 1 file changed, 54 insertions(+), 80 deletions(-) diff --git a/pop.c b/pop.c index c78cebf..ea0cb8c 100644 --- a/pop.c +++ b/pop.c @@ -63,21 +63,20 @@ typedef enum { typedef struct { CONNECTION *conn; - unsigned status : 2; + unsigned status : 2; unsigned capabilities : 1; - unsigned use_stls : 2; - cmd_status cmd_capa : 2; /* optional command CAPA */ - cmd_status cmd_stls : 2; /* optional command STLS */ - cmd_status cmd_uidl : 2; /* optional command UIDL */ - cmd_status cmd_top : 2; /* optional command TOP */ - cmd_status cmd_user : 2; /* optional command USER */ - unsigned resp_codes : 1; /* server supports extended response codes */ - unsigned expire : 1; /* expire is greater than 0 */ - unsigned clear_cache : 1; + unsigned use_stls : 2; + cmd_status cmd_capa : 2; /* optional command CAPA */ + cmd_status cmd_stls : 2; /* optional command STLS */ + cmd_status cmd_uidl : 2; /* optional command UIDL */ + cmd_status cmd_top : 2; /* optional command TOP */ + cmd_status cmd_user : 2; /* optional command USER */ + unsigned resp_codes : 1; /* server supports extended response codes */ + unsigned expire : 1; /* expire is greater than 0 */ + unsigned clear_cache : 1; ssize_t size; time_t check_time; - time_t login_delay; /* minimal login delay capability */ char *auth_list; /* list of auth mechanisms */ char *timestamp; char err_msg[POP_CMD_RESPONSE]; @@ -104,7 +103,7 @@ static void pop_error(pop_data_t *pop_data, const char *msg) * -1 - conection lost, * -2 - invalid command or execution error. */ -static pop_query_status pop_query(pop_data_t *pop_data, char *buf, ssize_t buflen) +static pop_query_status _pop_query(pop_data_t *pop_data, char *buf, ssize_t buflen) { char *c; @@ -127,6 +126,8 @@ static pop_query_status pop_query(pop_data_t *pop_data, char *buf, ssize_t bufle pop_error(pop_data, buf); return PQ_ERR; } +#define pop_query(pd, b, l, fmt, ...) \ + (snprintf(b, l, fmt "\r\n", ##__VA_ARGS__), _pop_query(pd, b, l)) /* * Open connection @@ -173,13 +174,11 @@ static void pop_logout (CONTEXT * ctx) mutt_message _("Closing connection to POP server..."); if (ctx->readonly) { - m_strcpy(buf, sizeof(buf), "RSET\r\n"); - ret = pop_query (pop_data, buf, sizeof (buf)); + ret = pop_query(pop_data, buf, sizeof(buf), "RSET"); } if (ret != PQ_NOT_CONNECTED) { - m_strcpy(buf, sizeof(buf), "QUIT\r\n"); - pop_query (pop_data, buf, sizeof (buf)); + pop_query(pop_data, buf, sizeof(buf), "QUIT"); } mutt_clear_error (); @@ -285,8 +284,7 @@ static pop_auth_res_t pop_auth_sasl(pop_data_t *pop_data, const char *method) /* terminate SASL session if the last responce is not +OK nor -ERR */ if (!m_strncmp(inbuf, "+ ", 2)) { - snprintf(buf, sizeof(buf), "*\r\n"); - if (pop_query(pop_data, buf, sizeof(buf)) == PQ_NOT_CONNECTED) + if (pop_query(pop_data, buf, sizeof(buf), "*") == PQ_NOT_CONNECTED) return POP_A_SOCKET; } @@ -320,11 +318,9 @@ static pop_auth_res_t pop_auth_apop(pop_data_t *pop_data, const char *method) for (i = 0; i < countof(digest); i++) sprintf(hash + 2 * i, "%02x", digest[i]); - /* Send APOP command to server */ - snprintf(buf, sizeof(buf), "APOP %s %s\r\n", pop_data->conn->account.user, - hash); - - switch (pop_query(pop_data, buf, sizeof(buf))) { + switch (pop_query(pop_data, buf, sizeof(buf), "APOP %s %s", + pop_data->conn->account.user, hash)) + { case PQ_OK: return POP_A_SUCCESS; case PQ_NOT_CONNECTED: @@ -345,8 +341,8 @@ static pop_auth_res_t pop_auth_user(pop_data_t *pop_data, const char *method) return POP_A_UNAVAIL; mutt_message _("Authenticating (USER)..."); - snprintf(buf, sizeof(buf), "USER %s\r\n", pop_data->conn->account.user); - ret = pop_query(pop_data, buf, sizeof (buf)); + ret = pop_query(pop_data, buf, sizeof(buf), "USER %s", + pop_data->conn->account.user); if (pop_data->cmd_user == CMD_UNKNOWN) { if (ret == PQ_OK) @@ -356,9 +352,8 @@ static pop_auth_res_t pop_auth_user(pop_data_t *pop_data, const char *method) } if (ret == PQ_OK) { - snprintf(buf, sizeof(buf), "PASS %s\r\n", - pop_data->conn->account.pass); - ret = pop_query(pop_data, buf, sizeof(buf)); + ret = pop_query(pop_data, buf, sizeof(buf), "PASS %s", + pop_data->conn->account.pass); } switch (ret) { @@ -472,7 +467,7 @@ pop_fetch_data(pop_data_t *pop_data, const char *query, progress_t *bar, ssize_t lenbuf = 0; m_strcpy(buf, sizeof(buf), query); - ret = pop_query (pop_data, buf, sizeof (buf)); + ret = _pop_query(pop_data, buf, sizeof(buf)); if (ret != PQ_OK) return ret; @@ -561,30 +556,27 @@ static int fetch_auth (char *line, void *data) * -1 - conection lost, * -2 - execution error. */ -static pop_query_status pop_capabilities (pop_data_t * pop_data, int mode) +static pop_query_status pop_capabilities(pop_data_t * pop_data, int mode) { - char buf[LONG_STRING]; - /* don't check capabilities on reconnect */ if (pop_data->capabilities) return 0; /* init capabilities */ if (mode == 0) { - pop_data->cmd_capa = CMD_NOT_AVAILABLE; - pop_data->cmd_stls = CMD_NOT_AVAILABLE; - pop_data->cmd_uidl = CMD_NOT_AVAILABLE; - pop_data->cmd_top = CMD_NOT_AVAILABLE; + pop_data->cmd_capa = CMD_NOT_AVAILABLE; + pop_data->cmd_stls = CMD_NOT_AVAILABLE; + pop_data->cmd_uidl = CMD_NOT_AVAILABLE; + pop_data->cmd_top = CMD_NOT_AVAILABLE; + pop_data->cmd_user = CMD_NOT_AVAILABLE; pop_data->resp_codes = 0; - pop_data->expire = 1; - pop_data->login_delay = 0; + pop_data->expire = 1; p_delete(&pop_data->auth_list); } /* Execute CAPA command */ if (mode == 0 || pop_data->cmd_capa != CMD_NOT_AVAILABLE) { - m_strcpy(buf, sizeof(buf), "CAPA\r\n"); - switch (pop_fetch_data (pop_data, buf, NULL, fetch_capa, pop_data)) { + switch (pop_fetch_data(pop_data, "CAPA\r\n", NULL, fetch_capa, pop_data)) { case PQ_OK: pop_data->cmd_capa = CMD_AVAILABLE; break; @@ -602,8 +594,8 @@ static pop_query_status pop_capabilities (pop_data_t * pop_data, int mode) pop_data->cmd_uidl = CMD_UNKNOWN; pop_data->cmd_top = CMD_UNKNOWN; - m_strcpy(buf, sizeof(buf), "AUTH\r\n"); - if (pop_fetch_data (pop_data, buf, NULL, fetch_auth, pop_data) == PQ_NOT_CONNECTED) + if (pop_fetch_data(pop_data, "AUTH\r\n", NULL, fetch_auth, pop_data) == + PQ_NOT_CONNECTED) return PQ_NOT_CONNECTED; } @@ -693,8 +685,7 @@ static pop_query_status pop_open_connection (pop_data_t * pop_data) pop_data->use_stls = 2; } if (pop_data->use_stls == 2) { - m_strcpy(buf, sizeof(buf), "STLS\r\n"); - ret = pop_query (pop_data, buf, sizeof (buf)); + ret = pop_query(pop_data, buf, sizeof(buf), "STLS"); if (ret == PQ_NOT_CONNECTED) goto err_conn; if (ret != PQ_OK) { @@ -744,8 +735,7 @@ static pop_query_status pop_open_connection (pop_data_t * pop_data) } /* get total size of mailbox */ - m_strcpy(buf, sizeof(buf), "STAT\r\n"); - ret = pop_query (pop_data, buf, sizeof (buf)); + ret = pop_query(pop_data, buf, sizeof(buf), "STAT"); if (ret == PQ_NOT_CONNECTED) goto err_conn; if (ret == PQ_ERR) { @@ -857,21 +847,19 @@ static pop_query_status pop_read_header (pop_data_t * pop_data, HEADER * h) pop_query_status ret; long length; char buf[LONG_STRING]; - char tempfile[_POSIX_PATH_MAX]; - f = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL); + f = tmpfile(); if (!f) { mutt_error(_("Could not create temporary file")); return PFD_FUNCT_ERROR; } - snprintf (buf, sizeof (buf), "LIST %d\r\n", h->refno); - ret = pop_query (pop_data, buf, sizeof (buf)); + ret = pop_query(pop_data, buf, sizeof(buf), "LIST %d", h->refno); if (ret == PQ_OK) { sscanf (buf, "+OK %d %ld", &idx, &length); snprintf (buf, sizeof (buf), "TOP %d 0\r\n", h->refno); - ret = pop_fetch_data (pop_data, buf, NULL, fetch_message, f); + ret = pop_fetch_data(pop_data, buf, NULL, fetch_message, f); if (pop_data->cmd_top == CMD_UNKNOWN) { if (ret == PQ_OK) { @@ -918,7 +906,6 @@ static pop_query_status pop_read_header (pop_data_t * pop_data, HEADER * h) } m_fclose(&f); - unlink (tempfile); return ret; } @@ -972,7 +959,7 @@ static int pop_fetch_headers (CONTEXT * ctx) ctx->hdrs[i]->refno = -1; old_count = ctx->msgcount; - ret = pop_fetch_data (pop_data, "UIDL\r\n", NULL, fetch_uidl, ctx); + ret = pop_fetch_data(pop_data, "UIDL\r\n", NULL, fetch_uidl, ctx); new_count = ctx->msgcount; ctx->msgcount = old_count; @@ -1081,10 +1068,8 @@ static int pop_open_mailbox (CONTEXT * ctx) if (pop_reconnect (ctx) != PQ_OK) return -1; - ctx->size = pop_data->size; - mutt_message _("Fetching list of messages..."); - + ctx->size = pop_data->size; ret = pop_fetch_headers (ctx); if (ret >= 0) @@ -1125,10 +1110,8 @@ static int pop_check_mailbox(CONTEXT * ctx, int *index_hint, int unused) if (pop_open_connection (pop_data) < 0) return -1; - ctx->size = pop_data->size; - mutt_message _("Checking for new messages..."); - + ctx->size = pop_data->size; ret = pop_fetch_headers (ctx); pop_clear_cache (pop_data); @@ -1181,14 +1164,13 @@ static int pop_sync_mailbox(CONTEXT * ctx, int unused, int *index_hint) for (i = 0, ret = 0; ret == 0 && i < ctx->msgcount; i++) { if (ctx->hdrs[i]->deleted) { - snprintf (buf, sizeof (buf), "DELE %d\r\n", ctx->hdrs[i]->refno); - ret = pop_query (pop_data, buf, sizeof (buf)); + ret = pop_query(pop_data, buf, sizeof(buf), "DELE %d", + ctx->hdrs[i]->refno); } } if (ret == PQ_OK) { - m_strcpy(buf, sizeof(buf), "QUIT\r\n"); - ret = pop_query (pop_data, buf, sizeof (buf)); + ret = pop_query(pop_data, buf, sizeof(buf), "QUIT"); } if (ret == PQ_OK) { @@ -1241,7 +1223,6 @@ void pop_fetch_mail (void) if (!PopHost) { mutt_error _("POP host is not defined."); - return; } @@ -1278,8 +1259,7 @@ void pop_fetch_mail (void) mutt_message _("Checking for new messages..."); /* find out how many messages are in the mailbox. */ - m_strcpy(buffer, sizeof(buffer), "STAT\r\n"); - ret = pop_query (pop_data, buffer, sizeof (buffer)); + ret = pop_query(pop_data, buffer, sizeof(buffer), "STAT"); if (ret == PQ_NOT_CONNECTED) goto fail; if (ret == PQ_ERR) { @@ -1291,8 +1271,7 @@ void pop_fetch_mail (void) /* only get unread messages */ if (msgs > 0 && option (OPTPOPLAST)) { - m_strcpy(buffer, sizeof(buffer), "LAST\r\n"); - ret = pop_query (pop_data, buffer, sizeof (buffer)); + ret = pop_query(pop_data, buffer, sizeof(buffer), "LAST"); if (ret == PQ_NOT_CONNECTED) goto fail; if (ret == PQ_OK) @@ -1320,7 +1299,7 @@ void pop_fetch_mail (void) ret = -3; else { snprintf (buffer, sizeof (buffer), "RETR %d\r\n", i); - ret = pop_fetch_data (pop_data, buffer, NULL, fetch_message, msg->fp); + ret = pop_fetch_data(pop_data, buffer, NULL, fetch_message, msg->fp); if (ret == PFD_FUNCT_ERROR) rset = 1; @@ -1333,9 +1312,7 @@ void pop_fetch_mail (void) } if (ret == PQ_OK && delanswer == M_YES) { - /* delete the message on the server */ - snprintf (buffer, sizeof (buffer), "DELE %d\r\n", i); - ret = pop_query (pop_data, buffer, sizeof (buffer)); + ret = pop_query(pop_data, buffer, sizeof(buffer), "DELE %d", i); } if (ret == PQ_NOT_CONNECTED) { @@ -1360,15 +1337,13 @@ void pop_fetch_mail (void) if (rset) { /* make sure no messages get deleted */ - m_strcpy(buffer, sizeof(buffer), "RSET\r\n"); - if (pop_query (pop_data, buffer, sizeof (buffer)) == PQ_NOT_CONNECTED) + if (pop_query(pop_data, buffer, sizeof(buffer), "RSET") == + PQ_NOT_CONNECTED) goto fail; } finish: - /* exit gracefully */ - m_strcpy(buffer, sizeof(buffer), "QUIT\r\n"); - if (pop_query (pop_data, buffer, sizeof (buffer)) == PQ_NOT_CONNECTED) + if (pop_query(pop_data, buffer, sizeof(buffer), "QUIT") == PQ_NOT_CONNECTED) goto fail; mutt_socket_close (conn); p_delete(&pop_data); @@ -1436,9 +1411,8 @@ int pop_fetch_message (MESSAGE * msg, CONTEXT * ctx, int msgno) return -1; } - snprintf (buf, sizeof (buf), "RETR %d\r\n", h->refno); - - ret = pop_fetch_data (pop_data, buf, &bar, fetch_message, msg->fp); + snprintf(buf, sizeof(buf), "RETR %d\r\n", h->refno); + ret = pop_fetch_data(pop_data, buf, &bar, fetch_message, msg->fp); if (ret == PQ_OK) break; -- 2.20.1