stagit
static git repository generator
git clone https://9o.is/git/stagit.git
commit 150f455b359a2d988f1ccbe7e70085bff674eb83 parent d171cf9c56e174de8f178e6622947c1a62b102a6 Author: Hiltjo Posthuma <hiltjo@codemadness.org> 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_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) {