fix dirname for glibc - stagit-gopher - A git gopher frontend. (mirror) | |
git clone git://bitreich.org/stagit-gopher/ git://enlrupgkhuxnvlhsf6lc3fziv5h2h… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit 9c7e2c56784e353adf143d887d84c0e967dba7b9 | |
parent 1778cba9794bbe5624db907bda2d065c971405b7 | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Sat, 26 Dec 2015 12:56:23 +0100 | |
fix dirname for glibc | |
Diffstat: | |
M urmoms.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_… | |
{ | |
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) { |