stagit-gopher

[fork] gopher git frontend
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) {