summaryrefslogtreecommitdiffstats
path: root/src/libnetdata/os/close_range.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libnetdata/os/close_range.c')
-rw-r--r--src/libnetdata/os/close_range.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/libnetdata/os/close_range.c b/src/libnetdata/os/close_range.c
index 56d5c2527..2ee5837ee 100644
--- a/src/libnetdata/os/close_range.c
+++ b/src/libnetdata/os/close_range.c
@@ -7,6 +7,12 @@ static int fd_is_valid(int fd) {
return fcntl(fd, F_GETFD) != -1 || errno != EBADF;
}
+static void setcloexec(int fd) {
+ int flags = fcntl(fd, F_GETFD);
+ if (flags != -1)
+ (void) fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
+}
+
int os_get_fd_open_max(void) {
static int fd_open_max = CLOSE_RANGE_FD_MAX;
@@ -33,9 +39,9 @@ int os_get_fd_open_max(void) {
return fd_open_max;
}
-void os_close_range(int first, int last) {
+void os_close_range(int first, int last, int flags) {
#if defined(HAVE_CLOSE_RANGE)
- if(close_range(first, last, 0) == 0) return;
+ if(close_range(first, last, flags) == 0) return;
#endif
#if defined(OS_LINUX)
@@ -44,8 +50,12 @@ void os_close_range(int first, int last) {
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
int fd = str2i(entry->d_name);
- if (fd >= first && (last == CLOSE_RANGE_FD_MAX || fd <= last) && fd_is_valid(fd))
- (void)close(fd);
+ if (fd >= first && (last == CLOSE_RANGE_FD_MAX || fd <= last) && fd_is_valid(fd)) {
+ if(flags & CLOSE_RANGE_CLOEXEC)
+ setcloexec(fd);
+ else
+ (void)close(fd);
+ }
}
closedir(dir);
return;
@@ -57,7 +67,12 @@ void os_close_range(int first, int last) {
last = os_get_fd_open_max();
for (int fd = first; fd <= last; fd++) {
- if (fd_is_valid(fd)) (void)close(fd);
+ if (fd_is_valid(fd)) {
+ if(flags & CLOSE_RANGE_CLOEXEC)
+ setcloexec(fd);
+ else
+ (void)close(fd);
+ }
}
}
@@ -67,9 +82,9 @@ static int compare_ints(const void *a, const void *b) {
return (int_a > int_b) - (int_a < int_b);
}
-void os_close_all_non_std_open_fds_except(const int fds[], size_t fds_num) {
+void os_close_all_non_std_open_fds_except(const int fds[], size_t fds_num, int flags) {
if (fds_num == 0 || fds == NULL) {
- os_close_range(STDERR_FILENO + 1, CLOSE_RANGE_FD_MAX);
+ os_close_range(STDERR_FILENO + 1, CLOSE_RANGE_FD_MAX, flags);
return;
}
@@ -89,10 +104,10 @@ void os_close_all_non_std_open_fds_except(const int fds[], size_t fds_num) {
// call os_close_range() as many times as needed
for (; i < fds_num; i++) {
if (fds_copy[i] > start)
- os_close_range(start, fds_copy[i] - 1);
+ os_close_range(start, fds_copy[i] - 1, flags);
start = fds_copy[i] + 1;
}
- os_close_range(start, CLOSE_RANGE_FD_MAX);
+ os_close_range(start, CLOSE_RANGE_FD_MAX, flags);
}