Hi Kim, On Thu, 12 Apr 2018, Kim Gybels wrote: > On Windows, a connection is shutdown when the last open handle to it is > closed. When that last open handle is stdout of our child process, an > abortive shutdown is triggered when said process exits. Ensure a > graceful shutdown of the client connection by keeping an open handle > until we detect our child process has finished. This allows all the data > to be sent to the client, instead of being discarded. Nice explanation! > @@ -928,13 +931,13 @@ static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen) > } > > cld.argv = cld_argv.argv; > - cld.in = incoming; > + cld.in = dup(incoming); At first I was worried that somebody might want to remove this in the future, but then I saw this line (which also calls dup()): > cld.out = dup(incoming); > > if (start_command(&cld)) > logerror("unable to fork"); > else > - add_child(&cld, addr, addrlen); > + add_child(&cld, addr, addrlen, incoming); > } > > static void child_handler(int signo) Nice work! I wonder whether you found a reliable way to trigger this? It would be nice to have a regression test for this. Ciao, Dscho