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