From: Nick Porter Date: Mon, 8 Sep 2025 10:01:39 +0000 (+0100) Subject: Retry writing to the pipe if it fails with EAGAIN / EWOULDBLOCK X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6bfb89772d1de05e9cb9bd577c2408c24062f9e8;p=thirdparty%2Ffreeradius-server.git Retry writing to the pipe if it fails with EAGAIN / EWOULDBLOCK --- diff --git a/src/lib/io/control.c b/src/lib/io/control.c index 5f3de7e110f..c387efb9425 100644 --- a/src/lib/io/control.c +++ b/src/lib/io/control.c @@ -342,6 +342,8 @@ int fr_control_message_push(fr_control_t *c, fr_ring_buffer_t *rb, uint32_t id, */ int fr_control_message_send(fr_control_t *c, fr_ring_buffer_t *rb, uint32_t id, void *data, size_t data_size) { + ssize_t ret; + int delay = 0; (void) talloc_get_type_abort(c, fr_control_t); if (c->same_thread) { @@ -353,10 +355,19 @@ int fr_control_message_send(fr_control_t *c, fr_ring_buffer_t *rb, uint32_t id, if (fr_control_message_push(c, rb, id, data, data_size) < 0) return -1; - while (write(c->pipe[1], ".", 1) == 0) { +again: + while ((ret = write(c->pipe[1], ".", 1)) == 0) { /* nothing */ } - + if ((ret < 0) && ((errno == EAGAIN)) +#if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN) + || (errno == EWOULDBLOCK) +#endif + ) { + delay += 10; + usleep(delay); + goto again; + } return 0; }