about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMeudwy <meudwy@meudwy.uk>2023-07-25 14:28:09 +0100
committerLeah Neukirchen <leah@vuxu.org>2023-07-27 14:08:05 +0200
commit07d064fc116cf5a72fd47632a0b8bd041df6a870 (patch)
tree2b9736818edd895871d32e040c28afc5610efb88
parent75de7d47da797b5cf6e7a859a1bff030f7b571a3 (diff)
downloadmblaze-07d064fc116cf5a72fd47632a0b8bd041df6a870.tar.gz
mblaze-07d064fc116cf5a72fd47632a0b8bd041df6a870.tar.xz
mblaze-07d064fc116cf5a72fd47632a0b8bd041df6a870.zip
mdirs: add Maildir profile key
When `mdirs` is executed without any arguments, look for the `Maildir`
key in the profile and use that instead (if set).

Closes: #245 [via git-merge-pr]
-rw-r--r--GNUmakefile8
-rw-r--r--man/mblaze-profile.54
-rw-r--r--man/mdirs.122
-rw-r--r--mdirs.c41
4 files changed, 66 insertions, 9 deletions
diff --git a/GNUmakefile b/GNUmakefile
index 89cb779..d3c081e 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -26,10 +26,10 @@ SCRIPT = mcolor mcom mless mmkdir mquote museragent
 all: $(ALL) museragent
 
 $(ALL) : % : %.o
-maddr magrep mdeliver mexport mflag mflow mgenmid mhdr mpick mscan msed mshow \
-  msort mthread : blaze822.o mymemmem.o mytimegm.o
-maddr magrep mdeliver mexport mflag mgenmid mhdr minc mlist mpick mscan msed \
-  mseq mshow msort mthread : seq.o slurp.o mystrverscmp.o
+maddr magrep mdeliver mdirs mexport mflag mflow mgenmid mhdr mpick mscan msed \
+  mshow msort mthread : blaze822.o mymemmem.o mytimegm.o
+maddr magrep mdeliver mdirs mexport mflag mgenmid mhdr minc mlist mpick mscan \
+  msed mseq mshow msort mthread : seq.o slurp.o mystrverscmp.o
 maddr magrep mflow mhdr mpick mscan mshow : rfc2047.o
 magrep mflow mhdr mshow : rfc2045.o
 mshow : filter.o safe_u8putstr.o rfc2231.o pipeto.o
diff --git a/man/mblaze-profile.5 b/man/mblaze-profile.5
index fe58309..d9aaad5 100644
--- a/man/mblaze-profile.5
+++ b/man/mblaze-profile.5
@@ -49,6 +49,10 @@ The fully qualified domain name used for
 .Li Message\&-Id\&:
 generation in
 .Xr mgenmid 1 .
+.It Li Maildir\&:
+If set,
+.Xr mdirs 1
+will use this maildir when no directories are supplied.
 .It Li Outbox\&:
 If set,
 .Xr mcom 1
diff --git a/man/mdirs.1 b/man/mdirs.1
index 44ffae4..f564803 100644
--- a/man/mdirs.1
+++ b/man/mdirs.1
@@ -1,4 +1,4 @@
-.Dd January 22, 2020
+.Dd July 25, 2023
 .Dt MDIRS 1
 .Os
 .Sh NAME
@@ -17,6 +17,14 @@ for maildir
 folders and prints them,
 separated by newlines.
 .Pp
+If
+.Ar dirs
+is not present then use
+.Sq Li Maildir\&:
+from
+.Pa "${MBLAZE:-$HOME/.mblaze}/profile"
+.Pq if set .
+.Pp
 To
 .Nm ,
 a maildir folder is a directory containing
@@ -36,10 +44,20 @@ Print folders separated by a NUL character.
 .It Fl a
 Traverse into all subfolders, without considering the maildir++ name conventions.
 .El
+.Sh ENVIRONMENT
+.Bl -tag -width Ds
+.It Ev MBLAZE
+Directory containing mblaze configuration.
+.Po
+Default:
+.Pa $HOME/.mblaze
+.Pc
+.El
 .Sh EXIT STATUS
 .Ex -std
 .Sh SEE ALSO
-.Xr find 1
+.Xr find 1 ,
+.Xr mblaze-profile 5
 .Sh AUTHORS
 .An Leah Neukirchen Aq Mt leah@vuxu.org
 .Sh LICENSE
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");