commit 7e1df73d7d8584072e96656866fe1c43053529cf from: Omar Polo date: Wed Mar 31 13:56:58 2021 UTC fix mkdirs: create directories recursively commit - 33b455ada3f8b56119e5404050aba0ba25c0a9eb commit + 7e1df73d7d8584072e96656866fe1c43053529cf blob - 2467a1b601e61b418959e87ef2b247d35a2533d8 blob + 120459636dc2d4ffd321617a3cf1efcddca0adb8 --- gmid.c +++ gmid.c @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -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);