Daniel P. Berrange wrote: > 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 Thanks, committed. - Cole -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list