stagit-responsive

My mobile friendly fork of stagit
Log | Files | Refs | README | LICENSE

commit 9c7e2c56784e353adf143d887d84c0e967dba7b9
parent 1778cba9794bbe5624db907bda2d065c971405b7
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date:   Sat, 26 Dec 2015 12:56:23 +0100

fix dirname for glibc

Diffstat:
Murmoms.c | 29+++++++++++++++++++++++++++--

1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/urmoms.c b/urmoms.c
@@ -140,6 +140,27 @@ xmlencode(FILE *fp, const char *s, size_t len)
 	}
 }
 
+/* Some implementations of dirname(3) return a pointer to a static
+ * internal buffer (OpenBSD). Others modify the contents of `path` (POSIX).
+ * This is a wrapper function that is compatible with both versions.
+ * The program will error out if dirname(3) failed, this can only happen
+ * with the OpenBSD version. */
+char *
+xdirname(const char *path)
+{
+	char *p, *b;
+
+	if (!(p = strdup(path)))
+		err(1, "strdup");
+	if (!(b = dirname(p)))
+		err(1, "basename");
+	if (!(b = strdup(b)))
+		err(1, "strdup");
+	free(p);
+
+	return b;
+}
+
 /* Some implementations of basename(3) return a pointer to a static
  * internal buffer (OpenBSD). Others modify the contents of `path` (POSIX).
  * This is a wrapper function that is compatible with both versions.
@@ -571,12 +592,16 @@ writeblob(git_object *obj, const char *filename, git_off_t filesize)
 {
 	char fpath[PATH_MAX];
 	char tmp[PATH_MAX] = "";
-	char *p;
+	char *d, *p;
 	FILE *fp;
 
 	snprintf(fpath, sizeof(fpath), "file/%s.html", filename);
-	if (mkdirp(dirname(fpath)))
+	d = xdirname(fpath);
+	if (mkdirp(d)) {
+		free(d);
 		return 1;
+	}
+	free(d);
 
 	p = fpath;
 	while (*p) {