summaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2023-06-20 12:02:08 -0400
committerTavian Barnes <tavianator@tavianator.com>2023-06-20 14:26:09 -0400
commita1490d98a1aebb3bfbd3873613977d0341ec7f98 (patch)
tree1320ab9e60b30621fedf29c50d42135dac8b4a2f /src/eval.c
parent4889f3ebb59c926b8e53a2e12edd5009d7cd4cbe (diff)
downloadbfs-a1490d98a1aebb3bfbd3873613977d0341ec7f98.tar.xz
dir: Arena-allocate directories
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/src/eval.c b/src/eval.c
index f16821e..5f27681 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -421,10 +421,15 @@ bool eval_empty(const struct bfs_expr *expr, struct bfs_eval *state) {
const struct BFTW *ftwbuf = state->ftwbuf;
if (ftwbuf->type == BFS_DIR) {
- struct bfs_dir *dir = bfs_opendir(ftwbuf->at_fd, ftwbuf->at_path);
+ struct bfs_dir *dir = bfs_allocdir();
if (!dir) {
eval_report_error(state);
- goto done;
+ return ret;
+ }
+
+ if (bfs_opendir(dir, ftwbuf->at_fd, ftwbuf->at_path) != 0) {
+ eval_report_error(state);
+ return ret;
}
int did_read = bfs_readdir(dir, NULL);
@@ -435,6 +440,7 @@ bool eval_empty(const struct bfs_expr *expr, struct bfs_eval *state) {
}
bfs_closedir(dir);
+ free(dir);
} else if (ftwbuf->type == BFS_REG) {
const struct bfs_stat *statbuf = eval_stat(state);
if (statbuf) {
@@ -442,7 +448,6 @@ bool eval_empty(const struct bfs_expr *expr, struct bfs_eval *state) {
}
}
-done:
return ret;
}
@@ -1495,20 +1500,25 @@ static int infer_fdlimit(const struct bfs_ctx *ctx, int limit) {
// Check /proc/self/fd for the current number of open fds, if possible
// (we may have inherited more than just the standard ones)
- struct bfs_dir *dir = bfs_opendir(AT_FDCWD, "/proc/self/fd");
+ struct bfs_dir *dir = bfs_allocdir();
if (!dir) {
- dir = bfs_opendir(AT_FDCWD, "/dev/fd");
+ goto done;
}
- if (dir) {
- // Account for 'dir' itself
- nopen = -1;
- while (bfs_readdir(dir, NULL) > 0) {
- ++nopen;
- }
+ if (bfs_opendir(dir, AT_FDCWD, "/proc/self/fd") != 0
+ && bfs_opendir(dir, AT_FDCWD, "/dev/fd") != 0) {
+ goto done;
+ }
- bfs_closedir(dir);
+ // Account for 'dir' itself
+ nopen = -1;
+
+ while (bfs_readdir(dir, NULL) > 0) {
+ ++nopen;
}
+ bfs_closedir(dir);
+done:
+ free(dir);
int ret = limit - nopen;
ret -= ctx->expr->persistent_fds;