X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ham.c;h=e54ec5e3b099d191a5bd30464f16f6b5ed03c2a5;hb=6b3d60b53a72a491b6792e3bd08c7835297f8f7b;hp=1441451d246e78d83bbd89f894743c6a05acf7b8;hpb=8628def3891660a2ebfce358dc65cf6b0f0a92d1;p=umpf.git diff --git a/ham.c b/ham.c index 1441451..e54ec5e 100644 --- a/ham.c +++ b/ham.c @@ -2,6 +2,7 @@ #include #include #include +#include #include @@ -27,7 +28,10 @@ new_header(char* buf, struct list* h) 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; @@ -154,7 +158,7 @@ get_body(int rfd) 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; @@ -163,7 +167,7 @@ get_body(int rfd) res = write(fd, buf, MAIL_LEN); if (res < MAIL_LEN) { unlink(b->tmpfile); - bye(EX_TEMPFAIL, "%m"); + bye(EX_TEMPFAIL, "Cannot write to remporary file: %m"); } break; } @@ -181,14 +185,14 @@ get_body(int rfd) 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; @@ -261,18 +265,19 @@ read_email(struct email* em) pos = 0; LIST_FOREACH(ph, em->headers){ - int needed = strlen(ph->name) + strlen(ph->value) + 3; + int needed = strlen(ph->name) + strlen(ph->value) + 4; if (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; @@ -330,21 +335,49 @@ copy_email(int fd, struct email* email) mbox_write_err = 0; mbox_write_pos = 0; - /* headers */ + /* 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); + 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); - /* 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);