commit - 33b455ada3f8b56119e5404050aba0ba25c0a9eb
commit + 7e1df73d7d8584072e96656866fe1c43053529cf
blob - 2467a1b601e61b418959e87ef2b247d35a2533d8
blob + 120459636dc2d4ffd321617a3cf1efcddca0adb8
--- gmid.c
+++ gmid.c
#include <errno.h>
#include <fcntl.h>
+#include <libgen.h>
#include <limits.h>
#include <pwd.h>
#include <signal.h>
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));
}
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
};
/* gmid.c */
-void mkdirs(const char*);
char *data_dir(void);
void load_local_cert(const char*, const char*);
void load_vhosts(void);