[libvirt] [PATCH 2/7] virExec: Delay daemonizing as long as possible.
Daniel P. Berrange
berrange at redhat.com
Wed Apr 29 12:14:34 UTC 2009
On Tue, Apr 28, 2009 at 11:31:52AM -0400, Cole Robinson wrote:
> This way the caller can catch more errors (e.g. from a hook callback) from
> the intermediate process.
> ---
> src/util.c | 56 ++++++++++++++++++++++++++++----------------------------
> 1 files changed, 28 insertions(+), 28 deletions(-)
>
> diff --git a/src/util.c b/src/util.c
> index 87e215d..47a1cd3 100644
> --- a/src/util.c
> +++ b/src/util.c
> @@ -445,7 +445,7 @@ __virExec(virConnectPtr conn,
> if (pthread_sigmask(SIG_SETMASK, &newmask, NULL) != 0) {
> virReportSystemError(conn, errno,
> "%s", _("cannot unblock signals"));
> - return -1;
> + _exit(1);
> }
>
> openmax = sysconf (_SC_OPEN_MAX);
> @@ -458,31 +458,6 @@ __virExec(virConnectPtr conn,
> !FD_ISSET(i, keepfd)))
> close(i);
>
> - if (flags & VIR_EXEC_DAEMON) {
> - if (setsid() < 0) {
> - virReportSystemError(conn, errno,
> - "%s", _("cannot become session leader"));
> - _exit(1);
> - }
> -
> - if (chdir("/") < 0) {
> - virReportSystemError(conn, errno,
> - "%s", _("cannot change to root directory: %s"));
> - _exit(1);
> - }
> -
> - pid = fork();
> - if (pid < 0) {
> - virReportSystemError(conn, errno,
> - "%s", _("cannot fork child process"));
> - _exit(1);
> - }
> -
> - if (pid > 0)
> - _exit(0);
> - }
> -
> -
> if (dup2(infd >= 0 ? infd : null, STDIN_FILENO) < 0) {
> virReportSystemError(conn, errno,
> "%s", _("failed to setup stdin file handle"));
> @@ -513,6 +488,33 @@ __virExec(virConnectPtr conn,
> if (hook)
> if ((hook)(data) != 0)
> _exit(1);
> +
> + /* Daemonize as late as possible, so the parent process can detect
> + * the above errors with wait* */
> + if (flags & VIR_EXEC_DAEMON) {
> + if (setsid() < 0) {
> + virReportSystemError(conn, errno,
> + "%s", _("cannot become session leader"));
> + _exit(1);
> + }
> +
> + if (chdir("/") < 0) {
> + virReportSystemError(conn, errno,
> + "%s", _("cannot change to root directory: %s"));
> + _exit(1);
> + }
> +
> + pid = fork();
> + if (pid < 0) {
> + virReportSystemError(conn, errno,
> + "%s", _("cannot fork child process"));
> + _exit(1);
> + }
> +
> + if (pid > 0)
> + _exit(0);
> + }
> +
> if (envp)
> execve(argv[0], (char **) argv, (char**)envp);
> else
> @@ -524,8 +526,6 @@ __virExec(virConnectPtr conn,
>
> _exit(1);
>
> - return 0;
> -
> cleanup:
> /* This is cleanup of parent process only - child
> should never jump here on error */
> --
ACK
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 :|
More information about the libvir-list
mailing list