summaryrefslogtreecommitdiffstats
path: root/src/dir.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2023-04-11 22:06:42 -0400
committerTavian Barnes <tavianator@tavianator.com>2023-06-12 14:39:34 -0400
commit0c10a1e984bc2bed1fe3a7dadbd94a9c24139a91 (patch)
tree43073ba63fc54b0b30e587aaf71c9e66b721c888 /src/dir.c
parente8df57b5a49a70e2daa5bb6c00b8e0e06c51306a (diff)
downloadbfs-0c10a1e984bc2bed1fe3a7dadbd94a9c24139a91.tar.xz
dir: Add a flag to bfs_freedir() to force the fd to stay the same
Diffstat (limited to 'src/dir.c')
-rw-r--r--src/dir.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/dir.c b/src/dir.c
index 01d26db..126f473 100644
--- a/src/dir.c
+++ b/src/dir.c
@@ -243,13 +243,15 @@ int bfs_closedir(struct bfs_dir *dir) {
int ret = xclose(dir->fd);
#else
int ret = closedir(dir->dir);
- bfs_verify(ret == 0 || errno != EBADF);
+ if (ret != 0) {
+ bfs_verify(errno != EBADF);
+ }
#endif
free(dir);
return ret;
}
-int bfs_freedir(struct bfs_dir *dir) {
+int bfs_freedir(struct bfs_dir *dir, bool same_fd) {
#if BFS_GETDENTS
int ret = dir->fd;
free(dir);
@@ -257,10 +259,16 @@ int bfs_freedir(struct bfs_dir *dir) {
int ret = fdclosedir(dir->dir);
free(dir);
#else
+ if (same_fd) {
+ errno = ENOTSUP;
+ return -1;
+ }
+
int ret = dup_cloexec(dirfd(dir->dir));
- int error = errno;
- bfs_closedir(dir);
- errno = error;
+ if (ret >= 0) {
+ bfs_closedir(dir);
+ }
#endif
+
return ret;
}