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); }