Show 44 quoted lines
> Since df076bdbcc ([PATCH] GIT: Listen on IPv6 as well, if available.,
> 2005-07-23), the original error checking was included in an inner loop
> unchanged, where its effect was different.
>
> Instead of retrying, after a EINTR during accept() in the listening
> socket, it will advance to the next one and try with that instead,
> leaving the client waiting for another round.
>
> Make sure to retry with the same listener socket that failed originally.
>
> To avoid an unlikely busy loop, fallback to the old behaviour after a
> couple of attempts.
>
> Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
> ---
> daemon.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/daemon.c b/daemon.c
> index d1be61fd57..9ac9efa17c 100644
> --- a/daemon.c
> +++ b/daemon.c
> @@ -1153,11 +1153,19 @@ static int service_loop(struct socketlist *socklist)
> #endif
> } ss;
> socklen_t sslen = sizeof(ss);
> - int incoming = accept(pfd[i].fd, &ss.sa, &sslen);
> + int incoming;
> + int retry = 3;
> +
> + redo:
> + incoming = accept(pfd[i].fd, &ss.sa, &sslen);
> if (incoming < 0) {
> switch (errno) {
> - case EAGAIN:
> case EINTR:
> + if (--retry)
> + goto redo;
> +
> + /* fallthrough */
> + case EAGAIN:
> case ECONNABORTED:
> continue;
> default: