/* If we did not grap the ack already, call pop3_readline() but handle Nonblocking also. */ int mu_pop3_response (mu_pop3_t pop3, size_t *pnread) { size_t n = 0; int status = 0; if (pop3 == NULL) return EINVAL; if (!MU_POP3_FISSET (pop3, MU_POP3_ACK)) { status = mu_stream_getline (pop3->carrier, &pop3->ackbuf, &pop3->acksize, NULL); if (status == 0) { n = mu_rtrim_class (pop3->ackbuf, MU_CTYPE_SPACE); MU_POP3_FSET (pop3, MU_POP3_ACK); /* Flag that we have the ack. */ } } else if (pop3->ackbuf) n = strlen (pop3->ackbuf); if (n < 3) status = MU_ERR_BADREPLY; else if (strncmp (pop3->ackbuf, "-ERR", 4) == 0) status = MU_ERR_REPLY; else if (strncmp (pop3->ackbuf, "+OK", 3)) status = MU_ERR_BADREPLY; if (pnread) *pnread = n; return status; }
/* If we did not grap the ack already, call pop3_readline() but handle Nonblocking also. */ int mu_pop3_response (mu_pop3_t pop3, size_t *pnread) { size_t n = 0; int status = 0; if (pop3 == NULL) return EINVAL; if (!MU_POP3_FISSET (pop3, MU_POP3_ACK)) { status = mu_stream_getline (pop3->carrier, &pop3->ackbuf, &pop3->acksize, NULL); if (status == 0) { n = mu_rtrim_class (pop3->ackbuf, MU_CTYPE_SPACE); MU_POP3_FSET (pop3, MU_POP3_ACK); /* Flag that we have the ack. */ } else { /* Provide them with an error. */ if (pop3->acksize < sizeof (POP3_DEFERR)) { char *p = realloc (pop3->ackbuf, sizeof (POP3_DEFERR)); if (p) { pop3->ackbuf = p; pop3->acksize = sizeof (POP3_DEFERR); } } if (pop3->ackbuf) strncpy (pop3->ackbuf, POP3_DEFERR, pop3->acksize); } } else if (pop3->ackbuf) n = strlen (pop3->ackbuf); if (n < 3) status = MU_ERR_BADREPLY; else if (strncmp (pop3->ackbuf, "-ERR", 4) == 0) status = MU_ERR_REPLY; else if (strncmp (pop3->ackbuf, "+OK", 3)) status = MU_ERR_BADREPLY; if (pnread) *pnread = n; return status; }