Re: [PATCH 2/2] daemon: graceful shutdown of client connection
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Apr 13, 2018, 13:03 UTC
- Message-ID
- <nycvar.QRO.7.76.6.1804131440100.65@ZVAVAG-6OXH6DA.rhebcr.pbec.zvpebfbsg.pbz>
- In-Reply-To
- <20180412210757.7792-3-kgybels@infogroep.be>
Hi Kim,
On Thu, 12 Apr 2018, Kim Gybels wrote:
Show 6 quoted lines
> 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!
Show 6 quoted lines
> @@ -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()):
Show 10 quoted lines
> 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