diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2026-07-23 15:52:05 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2026-07-23 15:52:05 +0000 |
| commit | 82e0628b934630fadd3d3759b27356da156baaa3 (patch) | |
| tree | 211fb91c491c76c6eed7adeaa7344ae6019ed35b | |
| parent | 23d265243887dd549f6806f985a07473a22120dc (diff) | |
| download | s6-82e0628b934630fadd3d3759b27356da156baaa3.tar.gz | |
systemd sends READY=1 without a terminating newline
| -rw-r--r-- | src/supervision/s6-notify-fd-from-socket.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/src/supervision/s6-notify-fd-from-socket.c b/src/supervision/s6-notify-fd-from-socket.c index 834955d..625f57a 100644 --- a/src/supervision/s6-notify-fd-from-socket.c +++ b/src/supervision/s6-notify-fd-from-socket.c @@ -41,11 +41,11 @@ static void bindit (int sock, char *name) struct sockaddr_un addr = { .sun_family = AF_UNIX, .sun_path = "" } ; socklen_t addrlen = sizeof(struct sockaddr_un) ; if (bind(sock, (struct sockaddr *)&addr, sizeof(sa_family_t)) == -1) /* autobind */ - strerr_diefu1sys(111, "bind") ; + strerr_diefusys(111, "bind") ; if (getsockname(sock, (struct sockaddr *)&addr, &addrlen) == -1) - strerr_diefu1sys(111, "getsockname") ; + strerr_diefusys(111, "getsockname") ; if (addr.sun_path[0]) - strerr_diefu1x(111, "autobind to an abstract socket") ; + strerr_diefu(111, "autobind to an abstract socket") ; memcpy(name, addr.sun_path + 1, 5) ; name[5] = 0 ; } @@ -54,27 +54,30 @@ static inline int run_child (int sock, int fd, unsigned int timeout) { char buf[8192] ; iopause_fd x = { .fd = sock, .events = IOPAUSE_READ } ; - int found = 0 ; tain deadline = TAIN_INFINITE_RELATIVE ; tain_now_g() ; if (timeout) tain_from_millisecs(&deadline, timeout) ; tain_add_g(&deadline, &deadline) ; - while (!found) + for (;;) { int r = iopause_g(&x, 1, &deadline) ; if (r == -1) strerr_diefu1sys(111, "iopause") ; - if (!r) strerr_dief1x(99, "timed out waiting for notification") ; + if (!r) strerr_dief(99, "timed out waiting for notification") ; r = sanitize_read(fd_recv(sock, buf, 8191, 0)) ; if (r == -1) { if (errno == EPIPE) _exit(0) ; - else strerr_diefu1sys(111, "recv") ; + else strerr_diefusys(111, "recv") ; } if (r) { buf[r++] = 0 ; - if (!strncmp(buf, "READY=1\n", 8) || strstr(buf, "\nREADY=1\n")) - found = 1 ; + if (!strncmp(buf, "READY=1", 7) && (!buf[7] || buf[7] == '\n')) break ; + else + { + char *s = strstr(buf, "\nREADY=1\n") ; + if (s && (!s[8] || s[8] == '\n')) break ; + } } } fd_write(fd, "\n", 1) ; @@ -117,27 +120,27 @@ int main (int argc, char const *const *argv) if (!argc) dieusage() ; if (wgola[GOLA_TIMEOUT] && !uint0_scan(wgola[GOLA_TIMEOUT], &timeout)) - strerr_dief2x(100, "timeout", " must be an unsigned integer") ; + strerr_dief(100, "timeout", " must be an unsigned integer") ; if (wgola[GOLA_NOTIF]) { if (!uint0_scan(wgola[GOLA_NOTIF], &fd)) - strerr_dief2x(100, "notification-fd", " must be an unsigned integer") ; + strerr_dief(100, "notification-fd", " must be an unsigned integer") ; } else { int r = read_uint("notification-fd", &fd) ; if (r == -1) strerr_diefu2sys(111, "read ", "./notification-fd") ; - if (!r) strerr_dief2x(100, "invalid ", "./notification-fd") ; + if (!r) strerr_dief(100, "invalid ", "./notification-fd") ; } if (fcntl(fd, F_GETFD) == -1) - strerr_dief2sys(111, "notification-fd", " sanity check failed") ; + strerr_diefsys(111, "notification-fd", " sanity check failed") ; sock = ipc_datagram_nbcoe() ; - if (sock == -1) strerr_diefu1sys(111, "create socket") ; + if (sock == -1) strerr_diefusys(111, "create socket") ; bindit(sock, modif + 15) ; pid = wgolb & GOLB_SINGLEFORK ? fork() : doublefork() ; - if (pid == -1) strerr_diefu1sys(111, wgolb & GOLB_SINGLEFORK ? "fork" : "doublefork") ; + if (pid == -1) strerr_diefusys(111, wgolb & GOLB_SINGLEFORK ? "fork" : "doublefork") ; if (!pid) run_child(sock, fd, timeout) ; fd_close(sock) ; fd_close(fd) ; |
