| 858 | } |
| 859 | |
| 860 | static void check_dead_children(void) |
| 861 | { |
| 862 | int status; |
| 863 | pid_t pid; |
| 864 | |
| 865 | struct child **cradle, *blanket; |
| 866 | for (cradle = &firstborn; (blanket = *cradle);) |
| 867 | if ((pid = waitpid(blanket->cld.pid, &status, WNOHANG)) > 1) { |
| 868 | const char *dead = ""; |
| 869 | if (status) |
| 870 | dead = " (with error)"; |
| 871 | loginfo("[%"PRIuMAX"] Disconnected%s", (uintmax_t)pid, dead); |
| 872 | |
| 873 | /* remove the child */ |
| 874 | *cradle = blanket->next; |
| 875 | live_children--; |
| 876 | child_process_clear(&blanket->cld); |
| 877 | free(blanket); |
| 878 | } else |
| 879 | cradle = &blanket->next; |
| 880 | } |
| 881 | |
| 882 | static struct strvec cld_argv = STRVEC_INIT; |
| 883 | static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen) |
no test coverage detected