aboutsummaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorClément Léger <cleger@rivosinc.com>2024-08-02 16:54:21 +0200
committerRichard Henderson <richard.henderson@linaro.org>2024-08-05 08:33:36 +1000
commit9996a35c6433c0e019a1c05791299db5e63a5db7 (patch)
tree16095f436d6ad4ac2045c0d25ea981e530318696 /net
parent7532ca570a449bafe990a00f21ae41bff7709845 (diff)
net/tap: Use qemu_close_all_open_fd()
Instead of using a slow implementation to close all open fd after forking, use qemu_close_all_open_fd(). Signed-off-by: Clément Léger <cleger@rivosinc.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-ID: <20240802145423.3232974-6-cleger@rivosinc.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'net')
-rw-r--r--net/tap.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/net/tap.c b/net/tap.c
index 7b2d5d5703..3f90022c0b 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -387,13 +387,20 @@ static TAPState *net_tap_fd_init(NetClientState *peer,
static void close_all_fds_after_fork(int excluded_fd)
{
- int open_max = sysconf(_SC_OPEN_MAX), i;
+ const int skip_fd[] = {STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO,
+ excluded_fd};
+ unsigned int nskip = ARRAY_SIZE(skip_fd);
- for (i = 3; i < open_max; i++) {
- if (i != excluded_fd) {
- close(i);
- }
+ /*
+ * skip_fd must be an ordered array of distinct fds, exclude
+ * excluded_fd if already included in the [STDIN_FILENO - STDERR_FILENO]
+ * range
+ */
+ if (excluded_fd <= STDERR_FILENO) {
+ nskip--;
}
+
+ qemu_close_all_open_fd(skip_fd, nskip);
}
static void launch_script(const char *setup_script, const char *ifname,