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.


Reply via email to