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