From c33012613138c75164d9f1bccd88015c1a0dae99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= Date: Tue, 18 Jun 2013 22:36:35 +0200 Subject: [PATCH] mini-inetd: Clear O_NONBLOCK flag on accepted sockets. --- ChangeLog | 3 +++ src/testsuite/mini-inetd.c | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/ChangeLog b/ChangeLog index 690e21fb..4c0ee81b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2013-06-18 Niels Möller + * src/testsuite/mini-inetd.c (main): Clear O_NONBLOCK flag on + accepted sockets. + * src/testsuite/tcpconnect.c: Include netinet/in.h. (main): Set seen_remote_eof and seen_stdin_eof flags at EOF. diff --git a/src/testsuite/mini-inetd.c b/src/testsuite/mini-inetd.c index f8400023..c34d6b56 100644 --- a/src/testsuite/mini-inetd.c +++ b/src/testsuite/mini-inetd.c @@ -291,6 +291,7 @@ main (int argc, char **argv) if (FD_ISSET(fds[i], &wanted)) { int conn; + int flags; conn = accept(fds[i], NULL, NULL); if (conn < 0) @@ -299,6 +300,16 @@ main (int argc, char **argv) die("accept failed: %s\n", STRERROR(errno)); continue; } + + /* With traditional BSD behavior, the acccepted socket + inherits the O_NONBLOCK flag from the listening socket. + So clear it explicitly. */ + flags = fcntl(conn, F_GETFL); + if (flags < 0) + werror("fcntl F_GETFL failed: %s\n", STRERROR(errno)); + else if (fcntl(conn, F_SETFL, flags & ~O_NONBLOCK) < 0) + werror("fcntl F_SETFL failed: %s\n", STRERROR(errno)); + start_service (conn, argv[1], argv + 2); if (max_connections) -- GitLab