tEnable raw output of parts. - rohrpost - A commandline mail client to change the world as we see it.
 (HTM) git clone git://r-36.net/rohrpost
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit fd58a3320d9f5f3e9175153bc77389a9acbd176b
 (DIR) parent eeb642fbf88b64e1120f8aeba85dd3b699e3c2be
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Fri,  7 Mar 2014 20:41:15 +0100
       
       Enable raw output of parts.
       
       This is needed for encrypted emails.
       
       Diffstat:
         ind.c                               |       4 ++--
         ind.h                               |       2 +-
         mime.c                              |       7 ++++++-
         mime.h                              |       3 +++
         pager.c                             |       2 +-
         part.c                              |      51 +++++++++++++++++++++-----------
         path.c                              |       1 +
         sieve.c                             |       2 +-
       
       8 files changed, 49 insertions(+), 23 deletions(-)
       ---
 (DIR) diff --git a/ind.c b/ind.c
       t@@ -304,11 +304,11 @@ writeallfd(int fd, void *data, int len)
        }
        
        int
       -writefile(char *file, void *data, int len)
       +writefile(char *file, void *data, int len, char *mode)
        {
                FILE *fd;
        
       -        fd = fopen(file, "w+");
       +        fd = fopen(file, mode);
                if (fd == NULL)
                        return 1;
                if (writeall(fd, data, len))
 (DIR) diff --git a/ind.h b/ind.h
       t@@ -32,7 +32,7 @@ char *expandhome(char *path);
        
        int writeall(FILE *fd, void *data, int len);
        int writeallfd(int fd, void *data, int len);
       -int writefile(char *file, void *data, int len);
       +int writefile(char *file, void *data, int len, char *mode);
        int getfilesize(char *file);
        char *readtoeof(FILE *fd, int *len);
        char *readtoeoffd(int fd, int *len);
 (DIR) diff --git a/mime.c b/mime.c
       t@@ -71,6 +71,8 @@ mime_free(mime_t *mime)
                        free(mime->charset);
                if (mime->boundary != NULL)
                        free(mime->boundary);
       +        if (mime->rawhdrs != NULL)
       +                free(mime->rawhdrs);
                free(mime);
        }
        
       t@@ -900,8 +902,11 @@ mime_parsebufintern(mime_t *mime, char *str, int len)
                                /*
                                 * End of headers.
                                 */
       -                        if (strlen(buf) == 0)
       +                        if (strlen(buf) == 0) {
       +                                mime->rawhdrs = memdupz(str, (p - str));
       +                                mime->rawhdrslen = p - str;
                                        goto mimeparsebufbodyparse;
       +                        }
        
                                /*
                                 * "key: value"
 (DIR) diff --git a/mime.h b/mime.h
       t@@ -18,6 +18,9 @@ struct mime_t {
                char *body;
                int bodylen;
        
       +        char *rawhdrs;
       +        int rawhdrslen;
       +
                char *partid;
                char *ct;
                char *cte;
 (DIR) diff --git a/pager.c b/pager.c
       t@@ -66,7 +66,7 @@ runstring(void (*runner)(char *), char *str, int docmp)
                int tfd, len;
        
                tname = mktmpfile("rohrpost", &tfd);
       -        if (writefile(tname, str, strlen(str)))
       +        if (writefile(tname, str, strlen(str), "w+"))
                        edie("runstring writefile");
                runner(tname);
        
 (DIR) diff --git a/part.c b/part.c
       t@@ -49,7 +49,7 @@ part_print(char *id, mime_t *mime)
        
        int
        part_write(char *id, mime_t *mime, llist_t *partl, char *type,
       -                char *filename, int bequiet, int tostdout)
       +                char *filename, int bequiet, int tostdout, int raw)
        {
                llistelem_t *part;
                char *content, *lfilename, *lcontent;
       t@@ -76,21 +76,32 @@ part_write(char *id, mime_t *mime, llist_t *partl, char *type,
                        }
        
                        clen = 0;
       -                content = mime_decodepartencoding(mime, &clen);
       -                if (content == NULL) {
       -                        lcontent = mime->body;
       -                        clen = mime->bodylen;
       -                } else {
       -                        lcontent = content;
       +                lcontent = mime->body;
       +                clen = mime->bodylen;
       +                if (!raw) {
       +                        content = mime_decodepartencoding(mime, &clen);
       +                        if (content != NULL) {
       +                                lcontent = content;
       +                        } else {
       +                                clen = mime->bodylen;
       +                        }
                        }
                        //printf("mime->body = \"%s\"\ncontent = \"%s\"\n",
                        //                mime->body, lcontent);
        
                        if (tostdout) {
       +                        if (raw)
       +                                writeallfd(1, mime->rawhdrs, mime->rawhdrslen);
                                writeallfd(1, lcontent, clen);
                        } else {
       -                        if (writefile(lfilename, lcontent, clen))
       +                        if (raw) {
       +                                writefile(lfilename, mime->rawhdrs,
       +                                                mime->rawhdrslen, "w+");
       +                        }
       +                        if (writefile(lfilename, lcontent, clen,
       +                                                (raw)? "a+" : "w+")) {
                                        edie("Could not write file %s.", lfilename);
       +                        }
                        }
        
                        if (!bequiet && !tostdout)
       t@@ -105,8 +116,10 @@ part_write(char *id, mime_t *mime, llist_t *partl, char *type,
                if (mime->parts->len > 0) {
                        forllist(mime->parts, part) {
                                if (!part_write(id, (mime_t *)part->data, partl,
       -                                        type, filename, bequiet, tostdout))
       +                                        type, filename, bequiet, tostdout,
       +                                        raw)) {
                                        dowrite = 1;
       +                        }
                        }
                }
        
       t@@ -116,7 +129,7 @@ part_write(char *id, mime_t *mime, llist_t *partl, char *type,
        void
        partusage(void)
        {
       -        die("usage: %s [-hq] [-c cfg] [-m folder] [-s|-g|-f filename] "
       +        die("usage: %s [-hqr] [-c cfg] [-m folder] [-s|-g|-f filename] "
                                "[-t type|-p part|-a|-l]"
                                " [msgs]\n", argv0);
        }
       t@@ -139,8 +152,7 @@ partmain(int argc, char *argv[])
                        LISTPARTS = 0x04,
                        GIVENNAME = 0x08,
                        TOSTDOUT = 0x10,
       -
       -                NOARGS = 0x20,
       +                RAW = 0x20,
                };
        
                retc = 1;
       t@@ -176,6 +188,9 @@ partmain(int argc, char *argv[])
                case 'q':
                        status |= BEQUIET;
                        break;
       +        case 'r':
       +                status |= RAW;
       +                break;
                case 's':
                        status |= TOSTDOUT;
                        break;
       t@@ -227,9 +242,10 @@ partmain(int argc, char *argv[])
                        } else {
                                retc = part_write(NULL, mime, partl, type,
                                                filename, status & BEQUIET,
       -                                        status & TOSTDOUT);
       +                                        status & TOSTDOUT, status & RAW);
                        }
        
       +                llist_free(partl);
                        mime_free(mime);
        
                        return retc;
       t@@ -259,11 +275,14 @@ partmain(int argc, char *argv[])
                        imap_die(imap, "imap_init");
                if (imap_select(imap, selected))
                        imap_die(imap, "imap_select");
       +        free(selected);
        
                msgs = imap_fetchraw(imap, ids);
                if (msgs == NULL)
                        imap_die(imap, "imap_fetchraw");
                llist_efree(ids);
       +        imap_close(imap);
       +        imap_free(imap);
        
                forllist(msgs, msg) {
                        elem = llist_get((llist_t *)msg->data, "literal");
       t@@ -283,16 +302,14 @@ partmain(int argc, char *argv[])
                        } else {
                                retc = part_write((char *)ide->data, mime, partl, type,
                                                filename, status & BEQUIET,
       -                                        status & TOSTDOUT);
       +                                        status & TOSTDOUT, status & RAW);
                        }
        
                        mime_free(mime);
                }
       +        llist_free(partl);
                llist_efree(msgs);
        
       -        free(selected);
       -        imap_close(imap);
       -        imap_free(imap);
                return retc;
        }
        
 (DIR) diff --git a/path.c b/path.c
       t@@ -125,6 +125,7 @@ path_mkbasepath(char *cfgn)
        
                if (chdir(cwd) < 0)
                        edie("chdir");
       +        free(cwd);
        
                return rpath;
        }
 (DIR) diff --git a/sieve.c b/sieve.c
       t@@ -581,7 +581,7 @@ sievemain(int argc, char *argv[])
                                sieve_die("sieve_getscript");
        
                        if (argc > 1) {
       -                        if (writefile(argv[1], data, strlen(data)))
       +                        if (writefile(argv[1], data, strlen(data), "w+"))
                                        edie("writefile");
                                free(data);
                                return 0;