[libvirt] [PATCH 3/4] virfile: Use virProcessWait in virFileUnlink

John Ferlan jferlan at redhat.com
Fri Sep 18 18:20:48 UTC 2015


Rather than inlining the code, use the common API.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/util/virfile.c | 38 +++++++++++++-------------------------
 1 file changed, 13 insertions(+), 25 deletions(-)

diff --git a/src/util/virfile.c b/src/util/virfile.c
index a0c8f0c..02d1a1f 100644
--- a/src/util/virfile.c
+++ b/src/util/virfile.c
@@ -2311,8 +2311,7 @@ virFileUnlink(const char *path,
               gid_t gid)
 {
     pid_t pid;
-    int waitret;
-    int status, ret = 0;
+    int status = 0, ret = 0;
     gid_t *groups;
     int ngroups;
 
@@ -2352,32 +2351,21 @@ virFileUnlink(const char *path,
         /* wait for child to complete, and retrieve its exit code */
         VIR_FREE(groups);
 
-        while ((waitret = waitpid(pid, &status, 0)) == -1 && errno == EINTR);
-        if (waitret == -1) {
-            ret = -errno;
-            virReportSystemError(errno,
-                                 _("failed to wait for child unlinking '%s'"),
-                                 path);
-            goto parenterror;
+        if (virProcessWait(pid, &status, 0) < 0) {
+            /* virProcessWait() reports errno on waitpid failure, so we'll just
+             * set our return status to EINTR; otherwise, set status to EACCES
+             * since the original failure for the fork+setuid path would have
+             * been EACCES or EPERM by definition.
+             */
+            if (virLastErrorIsSystemErrno(0))
+                status = EINTR;
+            else if (!status)
+                status = EACCES;
         }
 
-        /*
-         * If waitpid succeeded, but if the child exited abnormally or
-         * reported non-zero status, report failure
-         */
-        if (!WIFEXITED(status) || (WEXITSTATUS(status)) != 0) {
-            char *msg = virProcessTranslateStatus(status);
-            virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("child failed to unlink '%s': %s"),
-                           path, msg);
-            VIR_FREE(msg);
-            if (WIFEXITED(status))
-                ret = -WEXITSTATUS(status);
-            else
-                ret = -EACCES;
-        }
+        if (status)
+            ret = -status;
 
- parenterror:
         return ret;
     }
 
-- 
2.1.0




More information about the libvir-list mailing list