Commit bd8ae680 authored by Steve Holme's avatar Steve Holme
Browse files

imap: Code tidy up prior to adding support for the CAPABILITY command

* Changing the order of the state machine to represent the order in
  which commands are sent to the server.

* Reworking the imap_endofresp() function as the FETCH response doesn't
  include the command id and shouldn't be part of the length comparison
  that takes into account the id string.
parent c02449ca
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -31,10 +31,10 @@ typedef enum {
  IMAP_STOP,         /* do nothing state, stops the state machine */
  IMAP_SERVERGREET,  /* waiting for the initial greeting immediately after
                        a connect */
  IMAP_LOGIN,
  IMAP_STARTTLS,
  IMAP_UPGRADETLS,   /* asynchronously upgrade the connection to SSL/TLS
                       (multi mode only) */
  IMAP_LOGIN,
  IMAP_SELECT,
  IMAP_FETCH,
  IMAP_LOGOUT,
+12 −9
Original line number Diff line number Diff line
@@ -329,15 +329,18 @@ static int imap_endofresp(struct pingpong *pp, int *resp)
  const char *id = imapc->idstr;
  size_t id_len = strlen(id);

  /* Do we have a generic command response? */
  if(len >= id_len + 3) {
    if(!memcmp(id, line, id_len) && (line[id_len] == ' ') ) {
      /* end of response */
      *resp = line[id_len+1]; /* O, N or B */
      return TRUE;
    }
    else if((imapc->state == IMAP_FETCH) &&
            !memcmp("* ", line, 2) ) {
      /* FETCH response we're interested in */
  }

  /* Are we processing FETCH command responses? */
  if(imapc->state == IMAP_FETCH) {
    /* Do we have a valid response? */
    if(len >= 2 && !memcmp("* ", line, 2)) {
      *resp = '*';
      return TRUE;
    }
@@ -356,9 +359,9 @@ static void state(struct connectdata *conn,
  static const char * const names[]={
    "STOP",
    "SERVERGREET",
    "LOGIN",
    "STARTTLS",
    "UPGRADETLS",
    "LOGIN",
    "SELECT",
    "FETCH",
    "LOGOUT",
@@ -687,14 +690,14 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
      result = imap_state_servergreet_resp(conn, imapcode, imapc->state);
      break;

    case IMAP_LOGIN:
      result = imap_state_login_resp(conn, imapcode, imapc->state);
      break;

    case IMAP_STARTTLS:
      result = imap_state_starttls_resp(conn, imapcode, imapc->state);
      break;

    case IMAP_LOGIN:
      result = imap_state_login_resp(conn, imapcode, imapc->state);
      break;

    case IMAP_FETCH:
      result = imap_state_fetch_resp(conn, imapcode, imapc->state);
      break;