static int Ack(char **server_response) { static char buf[MAIL_BUFFER_SIZE]; int rlen; int Index = 0; int Received = 0; again: if ((rlen = recv(sc, buf + Index, ((MAIL_BUFFER_SIZE) - 1) - Received, 0)) < 1) { return (FAILED_TO_RECEIVE); } Received += rlen; buf[Received] = 0; /*err_msg fprintf(stderr,"Received: (%d bytes) %s", rlen, buf + Index); */ /* Check for newline */ Index += rlen; /* SMPT RFC says \r\n is the only valid line ending, who are we to argue ;) * The response code must contain at least 5 characters ex. 220\r\n */ if (Received < 5 || buf[Received - 1] != '\n' || buf[Received - 2] != '\r') { goto again; } if (buf[0] > '3') { /* If we've a valid pointer, return the SMTP server response so the error message contains more information */ if (server_response) { int dec = 0; /* See if we have something like \r, \n, \r\n or \n\r at the end of the message and chop it off */ if (Received > 2) { if (buf[Received-1] == '\n' || buf[Received-1] == '\r') { dec++; if (buf[Received-2] == '\r' || buf[Received-2] == '\n') { dec++; } } } *server_response = estrndup(buf, Received - dec); } return (SMTP_SERVER_ERROR); } return (SUCCESS); }