#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
+#include <time.h>
#include <unistd.h>
int mbox_write_pos;
int mbox_write_err;
-static void
+void
new_header(char* buf, struct list* h)
{
char* p;
new->value = xstrdup("");
else {
*p = 0;
- new->value = xstrdup(p+1);
+ if (*(p + 1) == ' ')
+ new->value = xstrdup(p + 2);
+ else
+ new->value = xstrdup(p + 1);
p = strrchr(new->value, '\n');
if (p && !*(p+1))
*p = 0;
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'){
fd = mkstemp(tmpfile);
/* cannot create tmpfile, try to continue reading */
if (fd < 0)
- bye(EX_TEMPFAIL, "%m");
+ bye(EX_TEMPFAIL, "Cannot create temporary file: %m");
else {
will_save = 1;
b->body = NULL;
res = write(fd, buf, MAIL_LEN);
if (res < MAIL_LEN) {
unlink(b->tmpfile);
- bye(EX_TEMPFAIL, "%m");
+ bye(EX_TEMPFAIL, "Cannot write to temporary file: %m");
}
break;
}
res = write(fd, buf, MAIL_LEN);
if (res < MAIL_LEN) {
unlink(b->tmpfile);
- bye(EX_TEMPFAIL, "%m");
+ bye(EX_TEMPFAIL, "Cannot write to temporary file: %m");
}
}
}
res = write(fd, buf, j);
if (res < j) {
unlink(b->tmpfile);
- bye(EX_TEMPFAIL, "%m");
+ bye(EX_TEMPFAIL, "Cannot write to temporary file: %m");
}
}
return b;
pos = 0;
LIST_FOREACH(ph, em->headers){
- int needed = strlen(ph->name) + strlen(ph->value) + 3;
- if (curbufsize < pos + needed)
+ int needed = strlen(ph->name) + strlen(ph->value) + 4;
+ while (curbufsize < pos + needed)
buf = xrealloc(buf, curbufsize*=2);
strcpy(buf + pos, ph->name);
pos += strlen(ph->name);
buf[pos++] = ':';
+ buf[pos++] = ' ';
strcpy(buf + pos, ph->value);
pos += strlen(ph->value);
buf[pos++] = '\n';
}
- buf[pos] = '\n';
+ buf[pos++] = '\n';
headers_sent = 1;
chars_written = pos;
return buf;
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;
}
mbox_write_err = 0;
mbox_write_pos = 0;
- /* headers */
+ /* From line */
struct hlist* ph;
+ int i, len;
+ time_t t;
+ time(&t);
+ char* date = ctime(&t);
+ int datelen = strlen(date);
+
+ 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){
for (pc = ph->name; *pc; pc++)
write_char_to_mailbox(*pc, fd);
write_char_to_mailbox(':', fd);
+ 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);
- /* body */
- /* FIXME: do not forget change Content-Length */
if (email->body) {
for (pc = email->body; pc < email->body + email->body_len; pc++){
write_char_to_mailbox(*pc, fd);