From ef1c18b952de0763037b7c940cc6960bbf990912 Mon Sep 17 00:00:00 2001 From: Dan Fandrich Date: Thu, 17 Mar 2011 16:59:30 -0700 Subject: Added support for LISTing a single POP3 message Added tests for a number of POP3 LIST operations, including one that shows a curl problem when listing no messages, so is disabled. --- lib/pop3.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'lib/pop3.c') diff --git a/lib/pop3.c b/lib/pop3.c index 65169cff5..e48c9b4f8 100644 --- a/lib/pop3.c +++ b/lib/pop3.c @@ -436,6 +436,24 @@ static CURLcode pop3_state_list_resp(struct connectdata *conn, return result; } +/* for LIST response with a given message */ +static CURLcode pop3_state_list_single_resp(struct connectdata *conn, + int pop3code, + pop3state instate) +{ + CURLcode result = CURLE_OK; + struct SessionHandle *data = conn->data; + (void)instate; /* no use for this yet */ + + if(pop3code != 'O') { + failf(data, "Invalid message. %c", pop3code); + result = CURLE_REMOTE_FILE_NOT_FOUND; + } + + state(conn, POP3_STOP); + return result; +} + /* start the DO phase for RETR */ static CURLcode pop3_retr(struct connectdata *conn) { @@ -460,7 +478,10 @@ static CURLcode pop3_list(struct connectdata *conn) if(result) return result; - state(conn, POP3_LIST); + if (strlen(pop3c->mailbox)) + state(conn, POP3_LIST_SINGLE); + else + state(conn, POP3_LIST); return result; } @@ -523,6 +544,10 @@ static CURLcode pop3_statemach_act(struct connectdata *conn) result = pop3_state_list_resp(conn, pop3code, pop3c->state); break; + case POP3_LIST_SINGLE: + result = pop3_state_list_single_resp(conn, pop3code, pop3c->state); + break; + case POP3_QUIT: /* fallthrough, just stop! */ default: @@ -747,7 +772,7 @@ CURLcode pop3_perform(struct connectdata *conn, /* If mailbox is empty, then assume user wants listing for mail IDs, * otherwise, attempt to retrieve the mail-id stored in mailbox */ - if (strlen(pop3c->mailbox)) + if (strlen(pop3c->mailbox) && !conn->data->set.ftp_list_only) result = pop3_retr(conn); else result = pop3_list(conn); -- cgit v1.2.3