]> git.ipfire.org Git - thirdparty/git.git/commitdiff
daemon: use sigaction() to install child_handler()
authorCarlo Marcelo Arenas Belón <carenas@gmail.com>
Tue, 24 Jun 2025 14:08:41 +0000 (14:08 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 24 Jun 2025 16:15:58 +0000 (09:15 -0700)
In a future change, the flags used for processing SIGCHLD will need to
be updated, which is only possible by using sigaction().

Replace the call, which hs the added benefit of using BSD semantics
reliably and therefore not needing the rearming call.

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
daemon.c

index d1be61fd578949385c94e590ca3b7ba7c09048d2..d870ad2f63c14f3ea2ab010c7dea46ac9ca6d589 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -917,9 +917,7 @@ static void child_handler(int signo UNUSED)
        /*
         * Otherwise empty handler because systemcalls will get interrupted
         * upon signal receipt
-        * SysV needs the handler to be rearmed
         */
-       signal(SIGCHLD, child_handler);
 }
 
 static int set_reuse_addr(int sockfd)
@@ -1121,6 +1119,7 @@ static void socksetup(struct string_list *listen_addr, int listen_port, struct s
 static int service_loop(struct socketlist *socklist)
 {
        struct pollfd *pfd;
+       struct sigaction sa;
 
        CALLOC_ARRAY(pfd, socklist->nr);
 
@@ -1129,7 +1128,10 @@ static int service_loop(struct socketlist *socklist)
                pfd[i].events = POLLIN;
        }
 
-       signal(SIGCHLD, child_handler);
+       sigemptyset(&sa.sa_mask);
+       sa.sa_flags = SA_NOCLDSTOP | SA_RESTART;
+       sa.sa_handler = child_handler;
+       sigaction(SIGCHLD, &sa, NULL);
 
        for (;;) {
                check_dead_children();