Daniel P. Berrange wrote:
On Tue, Apr 28, 2009 at 11:31:53AM -0400, Cole Robinson wrote:
> Wraps __virExec with the VIR_EXEC_DAEMON flag. Waits on the intermediate
> process to ensure we don't end up with any zombies, and differentiates between
> original process errors and intermediate process errors.
> +int virExecDaemonize(virConnectPtr conn,
> + const char *const*argv,
> + const char *const*envp,
> + const fd_set *keepfd,
> + pid_t *retpid,
> + int infd, int *outfd, int *errfd,
> + int flags,
> + virExecHook hook,
> + void *data) {
> + int ret;
> + int childstat = 0;
> +
> + ret = virExecWithHook(conn, argv, envp, keepfd, retpid,
> + infd, outfd, errfd,
> + flags |= VIR_EXEC_DAEMON,
> + hook, data);
> +
> + /* Wait for intermediate process to exit */
> + while (waitpid(*retpid, &childstat, 0) == -1 &&
> + errno == EINTR);
I think we should only call waitpid() if 'ret == 0', because if ret is
not 0, *retpid won't have been set and will thus contain random garbage.
Good catch. I've resent the series with this and your others comments
addressed.
Thanks,
Cole