char* buf;
int i = 0; /* current position */
int c, last = 0;
+ int first_line = 1;
+ int want_from_line = 0;
list_init(l);
buf = xmalloc(BUFSIZE);
if (c == '\r')
continue;
- if (i >= curbufsize-2)
+ if (i >= curbufsize-3)
buf = xrealloc(buf, curbufsize *= 2);
- buf[i++] = c;
+ if (first_line &&
+ ( (!i && c != 'F') || (i == 1 && c != 'r') || (i == 2 && c != 'o')
+ || (i == 3 && c != 'm') || (i == 4 && c != ' ') )
+ )
+ first_line = 0;
+ else {
+ if (first_line && i == 4)
+ want_from_line = 1;
+ }
+
+ buf[i++] = c;
if (c == '\n'){
+ if (want_from_line) {
+ buf[i] = 0;
+ fromline = xstrdup(buf);
+ want_from_line = 0;
+ i = 0;
+ continue;
+ }
if (last == '\n')
break;
if ((c = give_me_char(fd)) != ' ' && c != '\t'){
res = write(fd, buf, MAIL_LEN);
if (res < MAIL_LEN) {
unlink(b->tmpfile);
- bye(EX_TEMPFAIL, "Cannot write to remporary file: %m");
+ bye(EX_TEMPFAIL, "Cannot write to temporary file: %m");
}
break;
}
LIST_FOREACH(ph, em->headers){
int needed = strlen(ph->name) + strlen(ph->value) + 4;
- if (curbufsize < pos + needed)
+ while (curbufsize < pos + needed)
buf = xrealloc(buf, curbufsize*=2);
strcpy(buf + pos, ph->name);
pos += strlen(ph->name);
write_email_to_fd(int fd, struct email* email)
{
char* buf;
- int wr;
+ int wr, to_write;
open_email();
- do {
+ for (;;) {
buf = read_email(email);
- wr = write(fd, buf, chars_written);
- if (wr < chars_written)
- return 1;
- } while (chars_written);
+ if (!chars_written)
+ break;
+
+ to_write = chars_written;
+ while (to_write) {
+ wr = write(fd, buf, to_write);
+ to_write -= wr;
+ }
+ };
return 0;
}
/* From line */
struct hlist* ph;
int i, len;
- char* fromline;
- char* from = NULL;
time_t t;
time(&t);
char* date = ctime(&t);
int datelen = strlen(date);
-
- LIST_FOREACH(ph, email->headers) {
- if (!strcasecmp(ph->name, "From")) {
- from = ph->value;
- break;
- }
- }
- len = 5 + datelen + 1;
- if (from)
- len += strlen(from);
-
- fromline = xmalloc(len);
- if (from)
- sprintf(fromline, "From %s %s", from, date);
- else
- sprintf(fromline, "From %s", date);
- len = strlen(fromline);
+ if (! fromline) {
+ len = 5 + datelen + 1;
+ fromline = xmalloc(len);
+ sprintf(fromline, "From %s", date);
+ len = strlen(fromline);
+ } else
+ len = strlen(fromline);
for (i = 0; i < len; i++)
write_char_to_mailbox(fromline[i], fd);
-
+
/* headers */
char* pc;
LIST_FOREACH(ph, email->headers){
write_char_to_mailbox(' ', fd);
for (pc = ph->value; *pc; pc++)
write_char_to_mailbox(*pc, fd);
- write_char_to_mailbox('\n', fd);
+ write_char_to_mailbox('\n', fd);
}
write_char_to_mailbox('\n', fd);