lib/path: allow to close dirfd

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2018-10-17 13:18:25 +02:00
parent b158bd29de
commit c9ea91d41e
2 changed files with 21 additions and 3 deletions

View File

@ -40,6 +40,8 @@ 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_set_enoent_redirect(struct path_cxt *pc, int (*func)(struct path_cxt *, const char *, int *));
int ul_path_get_dirfd(struct path_cxt *pc); int ul_path_get_dirfd(struct path_cxt *pc);
void ul_path_close_dirfd(struct path_cxt *pc);
int ul_path_isopen_dirfd(struct path_cxt *pc);
char *ul_path_get_abspath(struct path_cxt *pc, char *buf, size_t bufsz, const char *path, ...) char *ul_path_get_abspath(struct path_cxt *pc, char *buf, size_t bufsz, const char *path, ...)
__attribute__ ((__format__ (__printf__, 4, 5))); __attribute__ ((__format__ (__printf__, 4, 5)));

View File

@ -94,8 +94,7 @@ void ul_unref_path(struct path_cxt *pc)
DBG(CXT, ul_debugobj(pc, "dealloc")); DBG(CXT, ul_debugobj(pc, "dealloc"));
if (pc->dialect) if (pc->dialect)
pc->free_dialect(pc); pc->free_dialect(pc);
if (pc->dir_fd >= 0) ul_path_close_dirfd(pc);
close(pc->dir_fd);
free(pc->dir_path); free(pc->dir_path);
free(pc->prefix); free(pc->prefix);
free(pc); free(pc);
@ -212,6 +211,23 @@ int ul_path_get_dirfd(struct path_cxt *pc)
return pc->dir_fd; return pc->dir_fd;
} }
/* Note that next ul_path_get_dirfd() will reopen the directory */
void ul_path_close_dirfd(struct path_cxt *pc)
{
assert(pc);
if (pc->dir_fd >= 0) {
DBG(CXT, ul_debugobj(pc, "closing dir: '%s'", pc->dir_path));
close(pc->dir_fd);
pc->dir_fd = -1;
}
}
int ul_path_isopen_dirfd(struct path_cxt *pc)
{
return pc && pc->dir_fd >= 0;
}
static const char *ul_path_mkpath(struct path_cxt *pc, const char *path, va_list ap) static const char *ul_path_mkpath(struct path_cxt *pc, const char *path, va_list ap)
{ {
int rc = vsnprintf(pc->path_buffer, sizeof(pc->path_buffer), path, ap); int rc = vsnprintf(pc->path_buffer, sizeof(pc->path_buffer), path, ap);
@ -301,7 +317,7 @@ int ul_path_open(struct path_cxt *pc, int flags, const char *path)
if (!pc) { if (!pc) {
fd = open(path, flags); fd = open(path, flags);
DBG(CXT, ul_debug("opening '%s'", path)); DBG(CXT, ul_debug("opening '%s' [no context]", path));
} else { } else {
int fdx; int fdx;
int dir = ul_path_get_dirfd(pc); int dir = ul_path_get_dirfd(pc);