lib/path: allow to close dirfd
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
b158bd29de
commit
c9ea91d41e
|
@ -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)));
|
||||||
|
|
22
lib/path.c
22
lib/path.c
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue