From e84044be84489b6f4f9ce69d0d6eba6cac66a9b6 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 5 Nov 2007 10:55:26 -0500 Subject: mailfs: add -r flag to specify mail root (Richard Bilson) --- src/cmd/upas/nfs/imap.c | 39 ++++++++++++++++++++++++++++++--------- src/cmd/upas/nfs/imap.h | 2 +- src/cmd/upas/nfs/main.c | 10 +++++++--- 3 files changed, 38 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/cmd/upas/nfs/imap.c b/src/cmd/upas/nfs/imap.c index e1a77773..0a93b6b5 100644 --- a/src/cmd/upas/nfs/imap.c +++ b/src/cmd/upas/nfs/imap.c @@ -17,6 +17,7 @@ struct Imap int autoreconnect; int ticks; /* until boom! */ char* server; + char* root; int mode; int fd; Biobuf b; @@ -90,7 +91,7 @@ static Sx* zBrdsx(Imap*); */ Imap* -imapconnect(char *server, int mode) +imapconnect(char *server, int mode, char *root) { Imap *z; @@ -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(); @@ -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; @@ -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]); @@ -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); diff --git a/src/cmd/upas/nfs/imap.h b/src/cmd/upas/nfs/imap.h index c4677a97..3f3d2aa6 100644 --- a/src/cmd/upas/nfs/imap.h +++ b/src/cmd/upas/nfs/imap.h @@ -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); diff --git a/src/cmd/upas/nfs/main.c b/src/cmd/upas/nfs/main.c index cd644db8..121d9746 100644 --- a/src/cmd/upas/nfs/main.c +++ b/src/cmd/upas/nfs/main.c @@ -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: @@ -52,6 +53,9 @@ threadmain(int argc, char **argv) case 'x': mode = Cmd; break; + case 'r': + root = EARGF(usage()); + break; }ARGEND quotefmtinstall(); @@ -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); } -- cgit v1.2.3