From 01690ed2bce50be86a045fe6edfe9ee72a9e9b9f Mon Sep 17 00:00:00 2001 From: Steve Holme Date: Sun, 25 Mar 2012 11:21:59 +0100 Subject: [PATCH] pop3: Removed the need for the single message LIST command handler Simplified the code to remove the need for a separate "LIST " command handler and state machine and instead use the LIST command handler for both operations. --- lib/pop3.c | 37 ++++++++----------------------------- lib/pop3.h | 5 ++--- 2 files changed, 10 insertions(+), 32 deletions(-) diff --git a/lib/pop3.c b/lib/pop3.c index e3f31c893..2bba61547 100644 --- a/lib/pop3.c +++ b/lib/pop3.c @@ -447,26 +447,6 @@ 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; -} - /* for the retr response */ static CURLcode pop3_state_retr_resp(struct connectdata *conn, int pop3code, @@ -518,17 +498,20 @@ static CURLcode pop3_list(struct connectdata *conn) CURLcode result = CURLE_OK; struct pop3_conn *pop3c = &conn->proto.pop3c; - if(pop3c->mailbox[0] != '\0') + if(pop3c->mailbox[0] != '\0') { + /* Message specific LIST means no transfer */ + struct FTP *pop3 = conn->data->state.proto.pop3; + pop3->transfer = FTPTRANSFER_INFO; + result = Curl_pp_sendf(&conn->proto.pop3c.pp, "LIST %s", pop3c->mailbox); + } else result = Curl_pp_sendf(&conn->proto.pop3c.pp, "LIST"); + if(result) return result; - if(pop3c->mailbox[0] != '\0') - state(conn, POP3_LIST_SINGLE); - else - state(conn, POP3_LIST); + state(conn, POP3_LIST); return result; } @@ -588,10 +571,6 @@ 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_RETR: result = pop3_state_retr_resp(conn, pop3code, pop3c->state); break; diff --git a/lib/pop3.h b/lib/pop3.h index 5723fba01..59c0839c6 100644 --- a/lib/pop3.h +++ b/lib/pop3.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2009 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 2009 - 2012, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -33,7 +33,6 @@ typedef enum { POP3_PASS, POP3_STARTTLS, POP3_LIST, - POP3_LIST_SINGLE, POP3_RETR, POP3_QUIT, POP3_LAST /* never used */ @@ -47,7 +46,7 @@ struct pop3_conn { size_t eob; /* number of bytes of the EOB (End Of Body) that has been received thus far */ size_t strip; /* number of bytes from the start to ignore as non-body */ - pop3state state; /* always use pop3.c:state() to change state! */ + pop3state state; /* always use pop3.c:state() to change state! */ }; extern const struct Curl_handler Curl_handler_pop3;