summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/path.h2
-rw-r--r--lib/path.c22
2 files changed, 21 insertions, 3 deletions
diff --git a/include/path.h b/include/path.h
index 7ab9779a5..b34aa366e 100644
--- a/include/path.h
+++ b/include/path.h
@@ -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_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, ...)
__attribute__ ((__format__ (__printf__, 4, 5)));
diff --git a/lib/path.c b/lib/path.c
index 9cc2e3e2e..d36fe41e8 100644
--- a/lib/path.c
+++ b/lib/path.c
@@ -94,8 +94,7 @@ void ul_unref_path(struct path_cxt *pc)
DBG(CXT, ul_debugobj(pc, "dealloc"));
if (pc->dialect)
pc->free_dialect(pc);
- if (pc->dir_fd >= 0)
- close(pc->dir_fd);
+ ul_path_close_dirfd(pc);
free(pc->dir_path);
free(pc->prefix);
free(pc);
@@ -212,6 +211,23 @@ int ul_path_get_dirfd(struct path_cxt *pc)
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)
{
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) {
fd = open(path, flags);
- DBG(CXT, ul_debug("opening '%s'", path));
+ DBG(CXT, ul_debug("opening '%s' [no context]", path));
} else {
int fdx;
int dir = ul_path_get_dirfd(pc);