]> mj.ucw.cz Git - umpf.git/blobdiff - ham.c
allow comments behind #
[umpf.git] / ham.c
diff --git a/ham.c b/ham.c
index 1441451d246e78d83bbd89f894743c6a05acf7b8..e54ec5e3b099d191a5bd30464f16f6b5ed03c2a5 100644 (file)
--- a/ham.c
+++ b/ham.c
@@ -2,6 +2,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sysexits.h>
+#include <time.h>
 
 #include <unistd.h>
 
@@ -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);