mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-25 07:05:28 +00:00
util: Fix virDaemonForkIntoBackground
This commit partially reverts
commit c360ea28dc
Refs: v6.2.0-rc1-1-gc360ea28dc
Author: Rafael Fonseca <r4f4rfs@gmail.com>
AuthorDate: Fri Mar 27 18:40:47 2020 +0100
Commit: Michal Prívozník <mprivozn@redhat.com>
CommitDate: Mon Mar 30 09:48:22 2020 +0200
util: virdaemon: fix compilation on mingw
The daemons are not supported on Win32 and therefore were not compiled
in that platform. However, with the daemon code sharing, all the code in
utils *is* compiled and it failed because `waitpid`, `fork`, and
`setsid` are not available. So, as before, let's not build them on
Win32 and make the code more portable by using existing vir* wrappers.
Not compiling virDaemonForkIntoBackground on Win32 is good, but the
second part of the original patch incorrectly replaced waitpid and fork
with our virProcessWait and virFork APIs. These APIs are more than just
simple wrappers and we don't want any of the extra functionality.
Especially virFork would reset any setup made before
virDaemonForkIntoBackground is called, such as logging, signal handling,
etc.
As a result of the change the additional fix in v6.2.0-67-ga87e4788d2
(util: virdaemon: fix waiting for child processes) is no longer
needed and it is effectively reverted by this commit.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
e94ddeac06
commit
36e125296a
@ -20,7 +20,9 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@ -30,8 +32,6 @@
|
|||||||
#include "virfile.h"
|
#include "virfile.h"
|
||||||
#include "virlog.h"
|
#include "virlog.h"
|
||||||
#include "viralloc.h"
|
#include "viralloc.h"
|
||||||
#include "virprocess.h"
|
|
||||||
#include "vircommand.h"
|
|
||||||
|
|
||||||
#include "configmake.h"
|
#include "configmake.h"
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ virDaemonForkIntoBackground(const char *argv0)
|
|||||||
if (virPipeQuiet(statuspipe) < 0)
|
if (virPipeQuiet(statuspipe) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
pid_t pid = virFork();
|
pid_t pid = fork();
|
||||||
switch (pid) {
|
switch (pid) {
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
@ -73,7 +73,7 @@ virDaemonForkIntoBackground(const char *argv0)
|
|||||||
if (setsid() < 0)
|
if (setsid() < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
nextpid = virFork();
|
nextpid = fork();
|
||||||
switch (nextpid) {
|
switch (nextpid) {
|
||||||
case 0: /* grandchild */
|
case 0: /* grandchild */
|
||||||
return statuspipe[1];
|
return statuspipe[1];
|
||||||
@ -97,14 +97,15 @@ virDaemonForkIntoBackground(const char *argv0)
|
|||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
/* parent */
|
/* parent */
|
||||||
int exitstatus = 0;
|
int got, exitstatus = 0;
|
||||||
int ret;
|
int ret;
|
||||||
char status;
|
char status;
|
||||||
|
|
||||||
VIR_FORCE_CLOSE(statuspipe[1]);
|
VIR_FORCE_CLOSE(statuspipe[1]);
|
||||||
|
|
||||||
/* We wait to make sure the first child forked successfully */
|
/* We wait to make sure the first child forked successfully */
|
||||||
if (virProcessWait(pid, &exitstatus, 0) < 0 ||
|
if ((got = waitpid(pid, &exitstatus, 0)) < 0 ||
|
||||||
|
got != pid ||
|
||||||
exitstatus != 0) {
|
exitstatus != 0) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user