* src/util/util.h (virWaitPid): New prototype.
* src/util/util.c (virWaitPid): Implement it.
* src/util/command.c (virCommandWait): Use it.
* src/libvirt_private.syms: Export it.
---
Should I convert over most remaining instances of waitpid() and
add a 'make syntax-check' entry? The only place that can't
convert is lxc_controller.c (it uses WNOHANG instead of 0), but
lxc is already Linux-specific, so it can be exempted from a
syntax-check.
src/libvirt_private.syms | 1 +
src/util/command.c | 3 +--
src/util/util.c | 20 ++++++++++++++++++++
src/util/util.h | 5 +++++
4 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index b24ca70..840588a 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -862,6 +862,7 @@ virStrcpy;
virStrncpy;
virTimestamp;
virVasprintf;
+virWaitPid;
# uuid.h
diff --git a/src/util/command.c b/src/util/command.c
index f9d475e..257b9cb 100644
--- a/src/util/command.c
+++ b/src/util/command.c
@@ -1204,8 +1204,7 @@ virCommandWait(virCommandPtr cmd, int *exitstatus)
/* Wait for intermediate process to exit */
- while ((ret = waitpid(cmd->pid, &status, 0)) == -1 &&
- errno == EINTR);
+ ret = virWaitPid(cmd->pid, &status);
if (ret == -1) {
virReportSystemError(errno, _("unable to wait for process %d"),
diff --git a/src/util/util.c b/src/util/util.c
index 1b5bc68..7eb8662 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -876,7 +876,19 @@ virRunWithHook(const char *const*argv,
return ret;
}
+/* Perform a blocking wait for the child process to complete, and put
+ * the child's exit status in *status. Return 0 if successful, -1 on
+ * failure to wait. */
+int virWaitPid(pid_t pid, int *status)
+{
+ int ret;
+ while ((ret = waitpid(pid, status, 0) == -1) && errno == EINTR);
+
+ return ret < 0 ? -1 : 0;
+}
+
#else /* WIN32 */
+# include <process.h>
int virSetCloseExec(int fd ATTRIBUTE_UNUSED)
{
@@ -940,6 +952,14 @@ virFork(pid_t *pid)
return -1;
}
+/* Perform a blocking wait for the child process to complete, and put
+ * the child's exit status in *status. Return 0 if successful, -1 on
+ * failure to wait. */
+int virWaitPid(pid_t pid, int *status)
+{
+ return _cwait(status, pid, 0) < 0 ? -1 : 0;
+}
+
#endif /* WIN32 */
int
diff --git a/src/util/util.h b/src/util/util.h
index ef4fc13..16f7f54 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -53,6 +53,11 @@ enum {
int virSetNonBlock(int fd) ATTRIBUTE_RETURN_CHECK;
int virSetCloseExec(int fd) ATTRIBUTE_RETURN_CHECK;
+/* Perform a blocking wait for the child process to complete, and put
+ * the child's exit status in *status. Return 0 if successful, -1 on
+ * failure to wait. */
+int virWaitPid(pid_t pid, int *status);
+
/* This will execute in the context of the first child
* after fork() but before execve() */
typedef int (*virExecHook)(void *data);
--
1.7.3.2