提交 5314dffc 编写于 作者: C Cole Robinson

virExec: Delay daemonizing as long as possible.

This way the caller can catch more errors (e.g. from a hook callback) from
the intermediate process.
上级 a4d0a3fd
Mon May 4 11:42:01 EDT 2009 Cole Robinson <crobinso@redhat.com>
* src/util.c: virExec: Delay daemonizing as long as possible.
Mon May 4 11:40:27 EDT 2009 Cole Robinson <crobinso@redhat.com>
* src/util.c: Add some documentation to __virExec and virExec
......
......@@ -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 */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册