Commit c8fba597 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Merge branch 'imap' of https://github.com/bnoordhuis/curl into bnoordhuis-imap

parents 4d1d1b85 dd3760f2
Loading
Loading
Loading
Loading
+40 −7
Original line number Diff line number Diff line
@@ -108,6 +108,7 @@ static int imap_getsock(struct connectdata *conn,
static CURLcode imap_doing(struct connectdata *conn,
                           bool *dophase_done);
static CURLcode imap_setup_connection(struct connectdata * conn);
static CURLcode imap_state_upgrade_tls(struct connectdata *conn);

/*
 * IMAP protocol handler.
@@ -342,14 +343,35 @@ static CURLcode imap_state_starttls_resp(struct connectdata *conn,
    result = CURLE_LOGIN_DENIED;
  }
  else {
    /* Curl_ssl_connect is BLOCKING */
    if(data->state.used_interface == Curl_if_multi) {
      state(conn, IMAP_UPGRADETLS);
      return imap_state_upgrade_tls(conn);
    }
    else {
      result = Curl_ssl_connect(conn, FIRSTSOCKET);
      if(CURLE_OK == result) {
        conn->protocol |= PROT_IMAPS;
        result = imap_state_login(conn);
      }
    }
  }
  state(conn, IMAP_STOP);
  return result;
}

static CURLcode imap_state_upgrade_tls(struct connectdata *conn)
{
  struct imap_conn *imapc = &conn->proto.imapc;
  CURLcode result;

  result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &imapc->ssldone);

  if(imapc->ssldone) {
    conn->protocol |= PROT_IMAPS;
    result = imap_state_login(conn);
    state(conn, IMAP_STOP);
  }

  return result;
}

@@ -524,6 +546,10 @@ static CURLcode imap_statemach_act(struct connectdata *conn)
  struct pingpong *pp = &imapc->pp;
  size_t nread = 0;

  /* busy upgrading the connection; right now all I/O is SSL/TLS, not IMAP */
  if(imapc->state == IMAP_UPGRADETLS)
    return imap_state_upgrade_tls(conn);

  if(pp->sendleft)
    return Curl_pp_flushsend(pp);

@@ -588,7 +614,14 @@ static CURLcode imap_multi_statemach(struct connectdata *conn,
                                         bool *done)
{
  struct imap_conn *imapc = &conn->proto.imapc;
  CURLcode result = Curl_pp_multi_statemach(&imapc->pp);
  CURLcode result;

  if((conn->protocol & PROT_IMAPS) && !imapc->ssldone) {
    result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &imapc->ssldone);
  }
  else {
    result = Curl_pp_multi_statemach(&imapc->pp);
  }

  *done = (bool)(imapc->state == IMAP_STOP);

@@ -700,7 +733,7 @@ static CURLcode imap_connect(struct connectdata *conn,
  }
#endif /* !CURL_DISABLE_HTTP && !CURL_DISABLE_PROXY */

  if(conn->protocol & PROT_IMAPS) {
  if((conn->protocol & PROT_IMAPS) && data->state.used_interface != Curl_if_multi) {
    /* BLOCKING */
    /* IMAPS is simply imap with SSL for the control channel */
    /* now, perform the SSL initialization for this socket */
+2 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ typedef enum {
                       a connect */
  IMAP_LOGIN,
  IMAP_STARTTLS,
  IMAP_UPGRADETLS, /* asynchronously upgrade the connection to SSL/TLS (multi mode only) */
  IMAP_SELECT,
  IMAP_FETCH,
  IMAP_LOGOUT,
@@ -47,6 +48,7 @@ struct imap_conn {
  imapstate state; /* always use imap.c:state() to change state! */
  int cmdid;       /* id number/index */
  const char *idstr; /* pointer to a string for which to wait for as id */
  bool ssldone;      /* is connect() over SSL done? only relevant in multi mode */
};

extern const struct Curl_handler Curl_handler_imap;