diff --git a/include/proto/fd.h b/include/proto/fd.h index 81aea87bc..14c22201c 100644 --- a/include/proto/fd.h +++ b/include/proto/fd.h @@ -61,6 +61,9 @@ void fd_delete(int fd); */ void fd_remove(int fd); +/* close all FDs starting from */ +void my_closefrom(int start); + /* disable the specified poller */ void disable_poller(const char *poller_name); diff --git a/src/fd.c b/src/fd.c index 9434c6300..92d093cb6 100644 --- a/src/fd.c +++ b/src/fd.c @@ -149,6 +149,7 @@ #include #include #include +#include #include #include @@ -460,6 +461,27 @@ void fd_process_cached_events() fdlist_process_cached_events(&fd_cache); } +/* This is a portable implementation of closefrom(). It closes all open file + * descriptors starting at and above. This is a naive version for use + * when the operating system provides no alternative. + */ +void my_closefrom(int start) +{ + struct rlimit limit; + int nbfds; + + if (getrlimit(RLIMIT_NOFILE, &limit) == 0) + nbfds = limit.rlim_cur; + else + nbfds = 0; + + if (nbfds <= 0) + nbfds = 1024; /* safe limit */ + + while (start < nbfds) + close(start++); +} + /* disable the specified poller */ void disable_poller(const char *poller_name) {