static int pop_retr (popserver server, int msgno, FILE *arg) { char *line; int ret; if (pop_retrieve_first (server, msgno, &line)) { snprintf (Errmsg, sizeof Errmsg, "Error from POP server: %s", pop_error); return (NOTOK); } while ((ret = pop_retrieve_next (server, &line)) >= 0) { if (! line) break; if (mbx_write (line, ret, arg) != OK) { strcpy (Errmsg, strerror (errno)); pop_close (server); return (NOTOK); } } if (ret) { snprintf (Errmsg, sizeof Errmsg, "Error from POP server: %s", pop_error); return (NOTOK); } return (OK); }
static int pop_retr (popserver server, int msgno, FILE *arg) { char *line; int ret; if (pop_retrieve_first (server, msgno, &line)) { char *msg = concat ("Error from POP server: ", pop_error, ""); strncpy (Errmsg, msg, sizeof (Errmsg)); Errmsg[sizeof (Errmsg)-1] = '\0'; free (msg); return (NOTOK); } while ((ret = pop_retrieve_next (server, &line)) >= 0) { if (! line) break; if (mbx_write (line, ret, arg) != OK) { strcpy (Errmsg, strerror (errno)); pop_close (server); return (NOTOK); } } if (ret) { char *msg = concat ("Error from POP server: ", pop_error, ""); strncpy (Errmsg, msg, sizeof (Errmsg)); Errmsg[sizeof (Errmsg)-1] = '\0'; free (msg); return (NOTOK); } return (OK); }
/* * Function: pop_retrieve * * Purpose: Retrieve a specified message from the maildrop. * * Arguments: * server The server to retrieve from. * message The message number to retrieve. * markfrom * If true, then mark the string "From " at the beginning * of lines with '>'. * msg_buf Output parameter to which a buffer containing the * message is assigned. * * Return value: The number of bytes in msg_buf, which may contain * embedded nulls, not including its final null, or -1 on error * with pop_error set. * * Side effects: May kill connection on error. */ int pop_retrieve (popserver server, int message, int markfrom, char **msg_buf) { int *IDs, *sizes, bufsize, fromcount = 0, cp = 0; char *ptr, *fromserver; int ret; if (server->in_multi) { strcpy (pop_error, "In multi-line query in pop_retrieve"); return (-1); } if (pop_list (server, message, &IDs, &sizes)) return (-1); if (pop_retrieve_first (server, message, &fromserver)) { return (-1); } /* * The "5" below is an arbitrary constant -- I assume that if * there are "From" lines in the text to be marked, there * probably won't be more than 5 of them. If there are, I * allocate more space for them below. */ bufsize = sizes[0] + (markfrom ? 5 : 0); ptr = (char *)malloc (bufsize); free ((char *) IDs); free ((char *) sizes); if (! ptr) { strcpy (pop_error, "Out of memory in pop_retrieve"); pop_retrieve_flush (server); return (-1); } while ((ret = pop_retrieve_next (server, &fromserver)) >= 0) { if (! fromserver) { ptr[cp] = '\0'; *msg_buf = ptr; return (cp); } if (markfrom && fromserver[0] == 'F' && fromserver[1] == 'r' && fromserver[2] == 'o' && fromserver[3] == 'm' && fromserver[4] == ' ') { if (++fromcount == 5) { bufsize += 5; ptr = (char *)realloc (ptr, bufsize); if (! ptr) { strcpy (pop_error, "Out of memory in pop_retrieve"); pop_retrieve_flush (server); return (-1); } fromcount = 0; } ptr[cp++] = '>'; } memcpy (&ptr[cp], fromserver, ret); cp += ret; ptr[cp++] = '\n'; } free (ptr); return (-1); }