From: Karel Zak Date: Thu, 17 May 2018 11:58:30 +0000 (+0200) Subject: lib/path: add ul_path_get_abspath() X-Git-Tag: v2.33-rc1~191 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e74e5401e11dde927042fa00a6db02d0381e0e0c;p=thirdparty%2Futil-linux.git lib/path: add ul_path_get_abspath() Signed-off-by: Karel Zak --- diff --git a/include/path.h b/include/path.h index 8b7d568e7f..ebdb58d05d 100644 --- a/include/path.h +++ b/include/path.h @@ -39,6 +39,9 @@ void *ul_path_get_dialect(struct path_cxt *pc); int ul_path_set_enoent_redirect(struct path_cxt *pc, int (*func)(struct path_cxt *, const char *, int *)); int ul_path_get_dirfd(struct path_cxt *pc); +char *ul_path_get_abspath(struct path_cxt *pc, char *buf, size_t bufsz, const char *path, ...) + __attribute__ ((__format__ (__printf__, 4, 5))); + int ul_path_access(struct path_cxt *pc, int mode, const char *path); int ul_path_accessf(struct path_cxt *pc, int mode, const char *path, ...) __attribute__ ((__format__ (__printf__, 3, 4))); diff --git a/lib/path.c b/lib/path.c index b1d0be9d1b..63f19af9a5 100644 --- a/lib/path.c +++ b/lib/path.c @@ -176,7 +176,6 @@ static const char *get_absdir(struct path_cxt *pc) return pc->path_buffer; } - int ul_path_get_dirfd(struct path_cxt *pc) { assert(pc); @@ -209,6 +208,39 @@ static const char *ul_path_mkpath(struct path_cxt *pc, const char *path, va_list return pc->path_buffer; } +char *ul_path_get_abspath(struct path_cxt *pc, char *buf, size_t bufsz, const char *path, ...) +{ + if (path) { + int rc; + va_list ap; + const char *tail = NULL; + + va_start(ap, path); + tail = ul_path_mkpath(pc, path, ap); + va_end(ap); + + rc = snprintf(buf, bufsz, "%s/%s/%s", + pc->prefix ? pc->prefix : "", + pc->dir_path, + tail); + + if ((size_t)rc >= bufsz) { + errno = ENAMETOOLONG; + return NULL; + } + } else { + const char *tmp = get_absdir(pc); + + if (!tmp) + return NULL; + strncpy(buf, tmp, bufsz); + buf[bufsz - 1] = '\0'; + } + + return buf; +} + + int ul_path_access(struct path_cxt *pc, int mode, const char *path) { int dir, rc;