Commit Diff


commit - 33b455ada3f8b56119e5404050aba0ba25c0a9eb
commit + 7e1df73d7d8584072e96656866fe1c43053529cf
blob - 2467a1b601e61b418959e87ef2b247d35a2533d8
blob + 120459636dc2d4ffd321617a3cf1efcddca0adb8
--- gmid.c
+++ gmid.c
@@ -20,6 +20,7 @@
 
 #include <errno.h>
 #include <fcntl.h>
+#include <libgen.h>
 #include <limits.h>
 #include <pwd.h>
 #include <signal.h>
@@ -44,11 +45,28 @@ dummy_handler(int signo)
 	return;
 }
 
-/* XXX: create recursively */
-void
-mkdirs(const char *path)
+/* wrapper around dirname(3).  dn must be PATH_MAX+1 at least. */
+static void
+pdirname(const char *path, char *dn)
 {
-	if (mkdir(path, 0755) == -1 && errno != EEXIST)
+	char	 p[PATH_MAX+1];
+	char	*t;
+
+	strlcpy(p, path, sizeof(p));
+	t = dirname(p);
+	memmove(dn, t, strlen(t)+1);
+}
+
+static void
+mkdirs(const char *path, mode_t mode)
+{
+	char	dname[PATH_MAX+1];
+
+	pdirname(path, dname);
+	if (!strcmp(dname, "/"))
+		return;
+	mkdirs(dname, mode);
+	if (mkdir(path, mode) != 0 && errno != EEXIST)
 		fatal("can't mkdir %s: %s", path, strerror(errno));
 }
 
@@ -64,13 +82,12 @@ data_dir(void)
 			errx(1, "XDG_DATA_HOME and HOME both empty");
 		if (asprintf(&t, "%s/.local/share/gmid", home) == -1)
 			err(1, "asprintf");
-		mkdirs(t);
-		return t;
+	} else {
+		if (asprintf(&t, "%s/gmid", xdg) == -1)
+			err(1, "asprintf");
 	}
 
-	if (asprintf(&t, "%s/gmid", xdg) == -1)
-		err(1, "asprintf");
-	mkdirs(t);
+	mkdirs(t, 0755);
 	return t;
 }
 
blob - 8188bf993352830d3837e94e7e95824635e4a5f8
blob + 17a1315ce7bd43cc62af145c4801b1a3756bfb0c
--- gmid.h
+++ gmid.h
@@ -230,7 +230,6 @@ enum imsg_type {
 };
 
 /* gmid.c */
-void		 mkdirs(const char*);
 char		*data_dir(void);
 void		 load_local_cert(const char*, const char*);
 void		 load_vhosts(void);