about summary refs log tree commit diff
path: root/mdirs.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdirs.c')
-rw-r--r--mdirs.c41
1 files changed, 38 insertions, 3 deletions
diff --git a/mdirs.c b/mdirs.c
index 5f49906..89ebab5 100644
--- a/mdirs.c
+++ b/mdirs.c
@@ -3,8 +3,10 @@
 
 #include <dirent.h>
 #include <limits.h>
+#include <pwd.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 
 #include "blaze822.h"
@@ -72,6 +74,33 @@ mdirs(char *fpath)
 	closedir(dir);
 }
 
+char *
+profile_maildir()
+{
+	char *f = blaze822_home_file("profile");
+	struct message *config = blaze822(f);
+	char *maildir;
+	static char path[PATH_MAX];
+
+	if (!config)
+		return 0;
+
+	if (!(maildir = blaze822_hdr(config, "maildir")))
+		return 0;
+
+	if (strncmp(maildir, "~/", 2) == 0) {
+		const char *home = getenv("HOME");
+		if (!home) {
+			struct passwd *pw = getpwuid(getuid());
+			home = pw ? pw->pw_dir : "/dev/null/homeless";
+		}
+		snprintf(path, sizeof path, "%s/%s", home, maildir+2);
+		maildir = path;
+	}
+
+	return maildir;
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -86,11 +115,17 @@ usage:
 			exit(1);
 		}
 
-	if (argc == optind)
-		goto usage;
-
 	xpledge("stdio rpath", "");
 
+	if (argc == optind) {
+		char *maildir = profile_maildir();
+		if (maildir) {
+			mdirs(maildir);
+			return 0;
+		}
+		goto usage;
+	}
+
 	char toplevel[PATH_MAX];
 	if (!getcwd(toplevel, sizeof toplevel)) {
 		perror("mdirs: getcwd");