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. > + > + /* __virExec should have set an error */ > + if (ret != 0) > + return -1; > + > + if (childstat != 0) { > + ReportError(conn, VIR_ERR_INTERNAL_ERROR, > + _("Intermediate daemon process exited with status %d."), > + WEXITSTATUS(childstat)); > + ret = -2; > + } > + > + return ret; > +} > + Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list