/*********************************************************************** * * pop3_perform() * * This is the actual DO function for POP3. Get a file/directory according to * the options previously setup. */ static CURLcode pop3_perform(struct connectdata *conn, bool *connected, bool *dophase_done) { /* This is POP3 and no proxy */ CURLcode result = CURLE_OK; DEBUGF(infof(conn->data, "DO phase starts\n")); if(conn->data->set.opt_no_body) { /* Requested no body means no transfer */ struct FTP *pop3 = conn->data->state.proto.pop3; pop3->transfer = FTPTRANSFER_INFO; } *dophase_done = FALSE; /* not done yet */ /* Start the first command in the DO phase */ result = pop3_command(conn); if(result) return result; /* Run the state-machine */ if(conn->data->state.used_interface == Curl_if_multi) result = pop3_multi_statemach(conn, dophase_done); else { result = pop3_easy_statemach(conn); *dophase_done = TRUE; /* with the easy interface we are done here */ } *connected = conn->bits.tcpconnect[FIRSTSOCKET]; if(*dophase_done) DEBUGF(infof(conn->data, "DO phase is complete\n")); return result; }
/*********************************************************************** * * pop3_quit() * * This should be called before calling sclose(). We should then wait for the * response from the server before returning. The calling code should then try * to close the connection. * */ static CURLcode pop3_quit(struct connectdata *conn) { CURLcode result = CURLE_OK; result = Curl_pp_sendf(&conn->proto.pop3c.pp, "QUIT", NULL); if(result) return result; state(conn, POP3_QUIT); result = pop3_easy_statemach(conn); return result; }
/* * pop3_connect() should do everything that is to be considered a part of * the connection phase. * * The variable 'done' points to will be TRUE if the protocol-layer connect * phase is done when this function returns, or FALSE is not. When called as * a part of the easy interface, it will always be TRUE. */ static CURLcode pop3_connect(struct connectdata *conn, bool *done) /* see description above */ { CURLcode result; struct pop3_conn *pop3c = &conn->proto.pop3c; struct SessionHandle *data=conn->data; struct pingpong *pp = &pop3c->pp; *done = FALSE; /* default to not done yet */ /* If there already is a protocol-specific struct allocated for this sessionhandle, deal with it */ Curl_reset_reqproto(conn); result = pop3_init(conn); if(CURLE_OK != result) return result; /* We always support persistent connections on pop3 */ conn->bits.close = FALSE; pp->response_time = RESP_TIMEOUT; /* set default response time-out */ pp->statemach_act = pop3_statemach_act; pp->endofresp = pop3_endofresp; pp->conn = conn; if(conn->handler->flags & PROTOPT_SSL) { /* BLOCKING */ result = Curl_ssl_connect(conn, FIRSTSOCKET); if(result) return result; } Curl_pp_init(pp); /* init the response reader stuff */ /* When we connect, we start in the state where we await the server greet response */ state(conn, POP3_SERVERGREET); if(data->state.used_interface == Curl_if_multi) result = pop3_multi_statemach(conn, done); else { result = pop3_easy_statemach(conn); if(!result) *done = TRUE; } return result; }
static CURLcode pop3_perform(struct connectdata *conn, bool *connected, /* connect status after PASV / PORT */ bool *dophase_done) { /* this is POP3 and no proxy */ CURLcode result=CURLE_OK; struct pop3_conn *pop3c = &conn->proto.pop3c; DEBUGF(infof(conn->data, "DO phase starts\n")); if(conn->data->set.opt_no_body) { /* requested no body means no transfer... */ struct FTP *pop3 = conn->data->state.proto.pop3; pop3->transfer = FTPTRANSFER_INFO; } *dophase_done = FALSE; /* not done yet */ /* start the first command in the DO phase */ /* 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) && !conn->data->set.ftp_list_only) result = pop3_retr(conn); else result = pop3_list(conn); if(result) return result; /* run the state-machine */ if(conn->data->state.used_interface == Curl_if_multi) result = pop3_multi_statemach(conn, dophase_done); else { result = pop3_easy_statemach(conn); *dophase_done = TRUE; /* with the easy interface we are done here */ } *connected = conn->bits.tcpconnect[FIRSTSOCKET]; if(*dophase_done) DEBUGF(infof(conn->data, "DO phase is complete\n")); return result; }
/* * pop3_connect() should do everything that is to be considered a part of * the connection phase. * * The variable 'done' points to will be TRUE if the protocol-layer connect * phase is done when this function returns, or FALSE is not. When called as * a part of the easy interface, it will always be TRUE. */ static CURLcode pop3_connect(struct connectdata *conn, bool *done) /* see description above */ { CURLcode result; struct pop3_conn *pop3c = &conn->proto.pop3c; struct SessionHandle *data=conn->data; struct pingpong *pp = &pop3c->pp; *done = FALSE; /* default to not done yet */ /* If there already is a protocol-specific struct allocated for this sessionhandle, deal with it */ Curl_reset_reqproto(conn); result = pop3_init(conn); if(CURLE_OK != result) return result; /* We always support persistent connections on pop3 */ conn->bits.close = FALSE; pp->response_time = RESP_TIMEOUT; /* set default response time-out */ pp->statemach_act = pop3_statemach_act; pp->endofresp = pop3_endofresp; pp->conn = conn; if(conn->bits.tunnel_proxy && conn->bits.httpproxy) { /* for POP3 over HTTP proxy */ struct HTTP http_proxy; struct FTP *pop3_save; /* BLOCKING */ /* We want "seamless" POP3 operations through HTTP proxy tunnel */ /* Curl_proxyCONNECT is based on a pointer to a struct HTTP at the member * conn->proto.http; we want POP3 through HTTP and we have to change the * member temporarily for connecting to the HTTP proxy. After * Curl_proxyCONNECT we have to set back the member to the original struct * POP3 pointer */ pop3_save = data->state.proto.pop3; memset(&http_proxy, 0, sizeof(http_proxy)); data->state.proto.http = &http_proxy; result = Curl_proxyCONNECT(conn, FIRSTSOCKET, conn->host.name, conn->remote_port); data->state.proto.pop3 = pop3_save; if(CURLE_OK != result) return result; } if(conn->handler->flags & PROTOPT_SSL) { /* BLOCKING */ result = Curl_ssl_connect(conn, FIRSTSOCKET); if(result) return result; } Curl_pp_init(pp); /* init the response reader stuff */ /* When we connect, we start in the state where we await the server greet response */ state(conn, POP3_SERVERGREET); if(data->state.used_interface == Curl_if_multi) result = pop3_multi_statemach(conn, done); else { result = pop3_easy_statemach(conn); if(!result) *done = TRUE; } return result; }