From 65e66af7d6d80248f0474ad21aaaf193dfa41e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Tue, 18 Jun 2013 22:36:35 +0200 Subject: [PATCH] mini-inetd: Clear O_NONBLOCK flag on accepted sockets. (from c330126). --- ChangeLog | 2 ++ src/testsuite/mini-inetd.c | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/ChangeLog b/ChangeLog index 3a238589d..50dd56b4c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,8 @@ 2013-06-18 Niels Möller <nisse@lysator.liu.se> From lsh-2.0.4 branch: + * 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 f84000236..c34d6b566 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