]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Retry writing to the pipe if it fails with EAGAIN / EWOULDBLOCK
authorNick Porter <nick@portercomputing.co.uk>
Mon, 8 Sep 2025 10:01:39 +0000 (11:01 +0100)
committerNick Porter <nick@portercomputing.co.uk>
Wed, 17 Sep 2025 14:06:40 +0000 (15:06 +0100)
src/lib/io/control.c

index 5f3de7e110fe4b8d0ec8f5b1041450db4d9dc70b..c387efb94255d8a83aedfcd14f2a6a06419e6064 100644 (file)
@@ -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;
 }