mailfs: add -r flag to specify mail root (Richard Bilson)
diff --git a/src/cmd/upas/nfs/imap.c b/src/cmd/upas/nfs/imap.c
index e1a7777..0a93b6b 100644
--- a/src/cmd/upas/nfs/imap.c
+++ b/src/cmd/upas/nfs/imap.c
@@ -17,6 +17,7 @@
 	int		autoreconnect;
 	int		ticks;	/* until boom! */
 	char*	server;
+	char*	root;
 	int		mode;
 	int		fd;
 	Biobuf	b;
@@ -90,7 +91,7 @@
  */
 
 Imap*
-imapconnect(char *server, int mode)
+imapconnect(char *server, int mode, char *root)
 {
 	Imap *z;
 
@@ -100,6 +101,13 @@
 	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 @@
 		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 @@
 		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 @@
 		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);