tcope with new upas/fs - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 1ea614ffaf9378df45410995d0a8c13042bba123
 (DIR) parent 846ec3d21def4cea144e9fbb1e523a5ff31fa2a6
 (HTM) Author: rsc <devnull@localhost>
       Date:   Wed, 15 Feb 2006 12:30:54 +0000
       
       cope with new upas/fs
       
       Diffstat:
         M src/cmd/upas/ned/nedmail.c          |      75 +++++++++++++++++++++++++------
       
       1 file changed, 62 insertions(+), 13 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/upas/ned/nedmail.c b/src/cmd/upas/ned/nedmail.c
       t@@ -356,6 +356,38 @@ threadmain(int argc, char **argv)
                qcmd(nil, nil);
        }
        
       +static char*
       +mkaddrs(char *t)
       +{
       +        int i, nf, inquote;
       +        char **f, *s;
       +        Fmt fmt;
       +        
       +        inquote = 0;
       +        nf = 2;
       +        for(s=t; *s; s++){
       +                if(*s == '\'')
       +                        inquote = !inquote;
       +                if(*s == ' ' && !inquote)
       +                        nf++;
       +        }
       +        f = malloc(nf*sizeof f[0]);
       +        if(f == nil)
       +                return nil;
       +        nf = tokenize(t, f, nf);
       +        fmtstrinit(&fmt);
       +        for(i=0; i+1<nf; i+=2){
       +                if(i > 0)
       +                        fmtprint(&fmt, " ");
       +        //        if(f[i][0] == 0 || strcmp(f[i], f[i+1]) == 0)
       +                        fmtprint(&fmt, "%s", f[i+1]);
       +        //        else
       +        //                fmtprint(&fmt, "%s <%s>", f[i], f[i+1]);
       +        }
       +        free(f);
       +        return fmtstrflush(&fmt);
       +}
       +
        //
        // read the message info
        //
       t@@ -391,13 +423,13 @@ file2message(Message *parent, char *name)
                        *t++ = 0;
                        
                        if(strcmp(s, "from") == 0)
       -                        m->from = t;
       +                        m->from = mkaddrs(t);
                        else if(strcmp(s, "to") == 0)
       -                        m->to = t;
       +                        m->to = mkaddrs(t);
                        else if(strcmp(s, "cc") == 0)
       -                        m->cc = t;
       +                        m->cc = mkaddrs(t);
                        else if(strcmp(s, "replyto") == 0)
       -                        m->replyto = t;
       +                        m->replyto = mkaddrs(t);
                        else if(strcmp(s, "unixdate") == 0 && (t=strchr(t, ' ')) != nil)
                                m->date = t;
                        else if(strcmp(s, "subject") == 0)
       t@@ -464,7 +496,6 @@ dir2message(Message *parent, int reverse)
                                continue;
                        if(atoi(d[i].name) <= highest)
                                continue;
       -                fprint(2,"calling file2message %d\n", i);
                        m = file2message(parent, d[i].name);
                        // fprint(2,"returned from file2message\n");
                        if(m == nil)
       t@@ -1560,13 +1591,14 @@ flushdeleted(Message *cur)
                doflush = 0;
                deld = 0;
        
       -        fd = fsopen(mailfs, "ctl", OWRITE);
       +        snprint(buf, sizeof buf, "%s/ctl", mbname);
       +        fd = fsopen(mailfs, buf, OWRITE);
                if(fd == nil){
       -                fprint(2, "!can't delete mail, opening /mail/fs/ctl: %r\n");
       +                fprint(2, "!can't delete mail, opening %s: %r\n", buf);
                        exitfs(0);
                }
                e = &buf[sizeof(buf)];
       -        p = seprint(buf, e, "delete %s", mbname);
       +        p = seprint(buf, e, "delete");
                n = 0;
                for(l = &top.child; *l != nil;){
                        m = *l;
       t@@ -1588,7 +1620,7 @@ flushdeleted(Message *cur)
                        if(e-p < 10){
                                fswrite(fd, buf, p-buf);
                                n = 0;
       -                        p = seprint(buf, e, "delete %s", mbname);
       +                        p = seprint(buf, e, "delete");
                        }
                        p = seprint(p, e, " %s", msg);
                        n++;
       t@@ -2068,7 +2100,9 @@ appendtofile(Message *m, char *part, char *base, int mbox)
        Message*
        scmd(Cmd *c, Message *m)
        {
       -        char *file;
       +        char buf[256];
       +        CFid *fd;
       +        char *file, *msg;
        
                if(m == &top){
                        Bprint(&out, "!address\n");
       t@@ -2087,9 +2121,24 @@ scmd(Cmd *c, Message *m)
                        return nil;
                }
        
       -        if(appendtofile(m, "raw", file, 1) < 0)
       -                return nil;
       -
       +        if(file[0] == '/' || (file[0]=='.' && file[1]=='/')){
       +                if(appendtofile(m, "raw", file, 1) < 0)
       +                        return nil;
       +        }else{
       +                snprint(buf, sizeof buf, "%s/ctl", mbname);
       +                if((fd = fsopen(mailfs, buf, OWRITE)) == nil)
       +                        return nil;
       +                msg = strrchr(s_to_c(m->path), '/');
       +                if(msg == nil)
       +                        msg = s_to_c(m->path);
       +                else
       +                        msg++;
       +                if(fsprint(fd, "save %s %s", file, msg) < 0){
       +                        fsclose(fd);
       +                        return nil;
       +                }
       +                fsclose(fd);
       +        }
                m->stored = 1;
                return m;
        }