+#ifdef HAVE_POLL
+ memset(poll_fds, 0, sizeof(poll_fds));
+ polled_sockets = 0;
+#else
+ /*
+ * Wait for a connection on any socket.
+ * Return immediately if no socket is listening.
+ * XXX: Why not treat this as fatal error?
+ */
+ FD_ZERO(&selected_fds);
+#endif
+ max_selected_socket = 0;
+ for (i = 0; i < MAX_LISTENING_SOCKETS; i++)
+ {
+ if (JB_INVALID_SOCKET != fds[i])
+ {
+#ifdef HAVE_POLL
+ poll_fds[i].fd = fds[i];
+ poll_fds[i].events = POLLIN;
+ polled_sockets++;
+#else
+ FD_SET(fds[i], &selected_fds);
+#endif
+ if (max_selected_socket < fds[i] + 1)
+ {
+ max_selected_socket = fds[i] + 1;
+ }
+ }
+ }
+ if (0 == max_selected_socket)
+ {
+ return 0;
+ }
+ do
+ {
+#ifdef HAVE_POLL
+ retval = poll(poll_fds, polled_sockets, -1);
+#else
+ retval = select(max_selected_socket, &selected_fds, NULL, NULL, NULL);
+#endif
+ } while (retval < 0 && errno == EINTR);
+ if (retval <= 0)
+ {
+ if (0 == retval)
+ {
+ log_error(LOG_LEVEL_ERROR,
+ "Waiting on new client failed because select(2) returned 0."
+ " This should not happen.");
+ }
+ else
+ {
+ log_error(LOG_LEVEL_ERROR,
+ "Waiting on new client failed because of problems in select(2): "
+ "%s.", strerror(errno));
+ }
+ return 0;
+ }
+#ifdef HAVE_POLL
+ for (i = 0; i < MAX_LISTENING_SOCKETS && (poll_fds[i].revents == 0); i++);
+#else
+ for (i = 0; i < MAX_LISTENING_SOCKETS && !FD_ISSET(fds[i], &selected_fds);
+ i++);
+#endif
+ if (i >= MAX_LISTENING_SOCKETS)
+ {
+ log_error(LOG_LEVEL_ERROR,
+ "select(2) reported connected clients (number = %u, "
+ "descriptor boundary = %u), but none found.",
+ retval, max_selected_socket);
+ return 0;
+ }
+ fd = fds[i];
+
+ /* Accept selected connection */