summaryrefslogtreecommitdiffstats
path: root/bfs.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2015-07-27 16:31:35 -0400
committerTavian Barnes <tavianator@tavianator.com>2015-07-27 16:31:35 -0400
commite7cb622ee5cf2cc1c019374c3911d9c70083701d (patch)
treef6ac4d57dab272c69cb66c1fcd93082973334603 /bfs.c
parent781f5902b7bbb91811f1f810f8a419607ed36294 (diff)
downloadbfs-e7cb622ee5cf2cc1c019374c3911d9c70083701d.tar.xz
Infer the right value for nopenfd, and recover from EMFILE.
Diffstat (limited to 'bfs.c')
-rw-r--r--bfs.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/bfs.c b/bfs.c
index fcd1383..6bbfa05 100644
--- a/bfs.c
+++ b/bfs.c
@@ -15,8 +15,27 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/resource.h>
#include <unistd.h>
+static int infer_nopenfd() {
+ int ret = 4096;
+
+ struct rlimit rl;
+ if (getrlimit(RLIMIT_NOFILE, &rl) == 0) {
+ if (rl.rlim_cur != RLIM_INFINITY) {
+ ret = rl.rlim_cur;
+ }
+ }
+
+ // Account for std{in,out,err}
+ if (ret > 3) {
+ ret -= 3;
+ }
+
+ return ret;
+}
+
typedef struct {
const char *path;
color_table *colors;
@@ -85,8 +104,8 @@ int main(int argc, char *argv[]) {
opts.colors = parse_colors(getenv("LS_COLORS"));
}
- // TODO: getrlimit(RLIMIT_NOFILE)
- if (bftw(opts.path, callback, 1024, flags, &opts) != 0) {
+ int nopenfd = infer_nopenfd();
+ if (bftw(opts.path, callback, nopenfd, flags, &opts) != 0) {
perror("bftw()");
goto done;
}