tmailfs: add -r flag to specify mail root (Richard Bilson) - 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 e84044be84489b6f4f9ce69d0d6eba6cac66a9b6
 (DIR) parent f1ea0d2916f842454306bde2e9cdec47f0af9ee4
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Mon,  5 Nov 2007 10:55:26 -0500
       
       mailfs: add -r flag to specify mail root (Richard Bilson)
       
       Diffstat:
         M src/cmd/upas/nfs/imap.c             |      39 ++++++++++++++++++++++++-------
         M src/cmd/upas/nfs/imap.h             |       2 +-
         M src/cmd/upas/nfs/main.c             |      10 +++++++---
       
       3 files changed, 38 insertions(+), 13 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/upas/nfs/imap.c b/src/cmd/upas/nfs/imap.c
       t@@ -17,6 +17,7 @@ struct Imap
                int                autoreconnect;
                int                ticks;        /* until boom! */
                char*        server;
       +        char*        root;
                int                mode;
                int                fd;
                Biobuf        b;
       t@@ -90,7 +91,7 @@ static Sx*                zBrdsx(Imap*);
         */
        
        Imap*
       -imapconnect(char *server, int mode)
       +imapconnect(char *server, int mode, char *root)
        {
                Imap *z;
        
       t@@ -100,6 +101,13 @@ imapconnect(char *server, int mode)
                z = emalloc(sizeof *z);
                z->server = estrdup(server);
                z->mode = mode;
       +        if(root)
       +                if(root[0] != 0 && root[strlen(root)-1] != '/')
       +                        z->root = smprint("%s/", root);
       +                else
       +                        z->root = root;
       +        else
       +                z->root = "";
                z->fd = -1;
                z->autoreconnect = 0;
                z->io = ioproc();
       t@@ -220,7 +228,9 @@ getboxes(Imap *z)
                        boxes[i]->exists = 0;
                        boxes[i]->maxseen = 0;
                }
       -        if(imapcmd(z, nil, "LIST %Z *", "") < 0)
       +        if(imapcmd(z, nil, "LIST %Z *", z->root) < 0)
       +                return -1;
       +        if(z->root != nil && imapcmd(z, nil, "LIST %Z INBOX", "") < 0)
                        return -1;
                if(z->nextbox && z->nextbox->mark)
                        z->nextbox = nil;
       t@@ -739,7 +749,8 @@ imapdial(char *server, int mode)
                        fd[1] = dup(p[0], -1);
                        fd[2] = dup(2, -1);
                        tmp = esmprint("%s:993", server);
       -                if(threadspawnl(fd, "/usr/sbin/stunnel", "stunnel", "-c", "-r", tmp, nil) < 0){
       +                if(threadspawnl(fd, "/usr/sbin/stunnel", "stunnel", "-c", "-r", tmp, nil) < 0
       +                    && threadspawnl(fd, "/usr/bin/stunnel", "stunnel", "-c", "-r", tmp, nil) < 0){
                                free(tmp);
                                close(p[0]);
                                close(p[1]);
       t@@ -1222,22 +1233,32 @@ xlist(Imap *z, Sx *sx)
                        s = gsub(s, "/", "_");
                        s = gsub(s, sx->sx[3]->data, "/");
                }
       +
       +        /*
       +         * INBOX is the special imap name for the main mailbox.
       +         * All other mailbox names have the root prefix removed, if applicable.
       +         */
       +        inbox = 0;
       +        if(cistrcmp(s, "INBOX") == 0){
       +                inbox = 1;
       +                free(s);
       +                s = estrdup("mbox");
       +        } else if(z->root && strstr(s, z->root) == s) {
       +                t = estrdup(s+strlen(z->root));
       +                free(s);
       +                s = t;
       +        }
                
                /* 
                 * Plan 9 calls the main mailbox mbox.  
                 * Rename any existing mbox by appending a $.
                 */
       -        inbox = 0;
       -        if(strncmp(s, "mbox", 4) == 0 && alldollars(s+4)){
       +        if(!inbox && strncmp(s, "mbox", 4) == 0 && alldollars(s+4)){
                        t = emalloc(strlen(s)+2);
                        strcpy(t, s);
                        strcat(t, "$");
                        free(s);
                        s = t;
       -        }else if(cistrcmp(s, "INBOX") == 0){
       -                inbox = 1;
       -                free(s);
       -                s = estrdup("mbox");
                }
        
                box = boxcreate(s);
 (DIR) diff --git a/src/cmd/upas/nfs/imap.h b/src/cmd/upas/nfs/imap.h
       t@@ -1,7 +1,7 @@
        typedef struct Imap Imap;
        
        void                imapcheckbox(Imap *z, Box *b);
       -Imap*                imapconnect(char *server, int mode);
       +Imap*                imapconnect(char *server, int mode, char *root);
        int                imapcopylist(Imap *z, char *nbox, Msg **m, uint nm);
        void                imapfetchraw(Imap *z, Part *p);
        void                imapfetchrawbody(Imap *z, Part *p);
 (DIR) diff --git a/src/cmd/upas/nfs/main.c b/src/cmd/upas/nfs/main.c
       t@@ -22,17 +22,18 @@ Imap *imap;
        void
        usage(void)
        {
       -        fprint(2, "usage: mailfs [-DVtx] [-s srvname] server\n");
       +        fprint(2, "usage: mailfs [-DVtx] [-s srvname] [-r root] server\n");
                threadexitsall("usage");
        }
        
        void
        threadmain(int argc, char **argv)
        {
       -        char *server, *srvname;
       +        char *server, *srvname, *root;
                int mode;
        
                srvname = "mail";
       +        root = "";
                mode = Unencrypted;
                ARGBEGIN{
                default:
       t@@ -52,6 +53,9 @@ threadmain(int argc, char **argv)
                case 'x':
                        mode = Cmd;
                        break;
       +        case 'r':
       +                root = EARGF(usage());
       +                break;
                }ARGEND
        
                quotefmtinstall();        
       t@@ -65,7 +69,7 @@ threadmain(int argc, char **argv)
                boxinit();
                fsinit0();
        
       -        if((imap = imapconnect(server, mode)) == nil)
       +        if((imap = imapconnect(server, mode, root)) == nil)
                        sysfatal("imapconnect: %r");
                threadpostmountsrv(&fs, srvname, nil, 0);
        }