[libvirt] [PATCHv2 ACKed 06/15] qemu: replace exec hook with virCommandSetUID/GID in qemuCaps*

Laine Stump laine at laine.org
Tue Feb 12 20:15:40 UTC 2013


Setting the uid/gid of the child process was the only thing done by
the hook function in this case, and that can now be done more simply
with virCommandSetUID/GID.
---
Change from V1: rebased.

 src/qemu/qemu_capabilities.c | 64 +++++++++++++-------------------------------
 1 file changed, 18 insertions(+), 46 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 4efe052..51fc9dc 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -279,37 +279,10 @@ static const char *virQEMUCapsArchToString(virArch arch)
 }
 
 
-struct _virQEMUCapsHookData {
-    uid_t runUid;
-    gid_t runGid;
-};
-typedef struct _virQEMUCapsHookData virQEMUCapsHookData;
-typedef virQEMUCapsHookData *virQEMUCapsHookDataPtr;
-
-static int virQEMUCapsHook(void * data)
-{
-    int ret;
-    virQEMUCapsHookDataPtr hookData = data;
-
-    if (!hookData) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("QEMU uid:gid not specified by caller"));
-        ret = -1;
-        goto cleanup;
-    }
-
-    VIR_DEBUG("Switch QEMU uid:gid to %d:%d",
-              hookData->runUid, hookData->runGid);
-    ret = virSetUIDGID(hookData->runUid, hookData->runGid);
-
-cleanup:
-    return ret;
-}
-
 static virCommandPtr
 virQEMUCapsProbeCommand(const char *qemu,
                         virQEMUCapsPtr qemuCaps,
-                        virQEMUCapsHookDataPtr hookData)
+                        uid_t runUid, gid_t runGid)
 {
     virCommandPtr cmd = virCommandNew(qemu);
 
@@ -322,7 +295,8 @@ virQEMUCapsProbeCommand(const char *qemu,
 
     virCommandAddEnvPassCommon(cmd);
     virCommandClearCaps(cmd);
-    virCommandSetPreExecHook(cmd, virQEMUCapsHook, hookData);
+    virCommandSetGID(cmd, runGid);
+    virCommandSetUID(cmd, runUid);
 
     return cmd;
 }
@@ -416,7 +390,8 @@ no_memory:
 }
 
 static int
-virQEMUCapsProbeMachineTypes(virQEMUCapsPtr qemuCaps, virQEMUCapsHookDataPtr hookData)
+virQEMUCapsProbeMachineTypes(virQEMUCapsPtr qemuCaps,
+                             uid_t runUid, gid_t runGid)
 {
     char *output;
     int ret = -1;
@@ -433,7 +408,7 @@ virQEMUCapsProbeMachineTypes(virQEMUCapsPtr qemuCaps, virQEMUCapsHookDataPtr hoo
         return -1;
     }
 
-    cmd = virQEMUCapsProbeCommand(qemuCaps->binary, qemuCaps, hookData);
+    cmd = virQEMUCapsProbeCommand(qemuCaps->binary, qemuCaps, runUid, runGid);
     virCommandAddArgList(cmd, "-M", "?", NULL);
     virCommandSetOutputBuffer(cmd, &output);
 
@@ -572,7 +547,7 @@ cleanup:
 }
 
 static int
-virQEMUCapsProbeCPUModels(virQEMUCapsPtr qemuCaps, virQEMUCapsHookDataPtr hookData)
+virQEMUCapsProbeCPUModels(virQEMUCapsPtr qemuCaps, uid_t runUid, gid_t runGid)
 {
     char *output = NULL;
     int ret = -1;
@@ -590,7 +565,7 @@ virQEMUCapsProbeCPUModels(virQEMUCapsPtr qemuCaps, virQEMUCapsHookDataPtr hookDa
         return 0;
     }
 
-    cmd = virQEMUCapsProbeCommand(qemuCaps->binary, qemuCaps, hookData);
+    cmd = virQEMUCapsProbeCommand(qemuCaps->binary, qemuCaps, runUid, runGid);
     virCommandAddArgList(cmd, "-cpu", "?", NULL);
     virCommandSetOutputBuffer(cmd, &output);
 
@@ -1601,7 +1576,7 @@ virQEMUCapsParseDeviceStr(virQEMUCapsPtr qemuCaps, const char *str)
 static int
 virQEMUCapsExtractDeviceStr(const char *qemu,
                             virQEMUCapsPtr qemuCaps,
-                            virQEMUCapsHookDataPtr hookData)
+                            uid_t runUid, gid_t runGid)
 {
     char *output = NULL;
     virCommandPtr cmd;
@@ -1615,7 +1590,7 @@ virQEMUCapsExtractDeviceStr(const char *qemu,
      * understand '-device name,?', and always exits with status 1 for
      * the simpler '-device ?', so this function is really only useful
      * if -help includes "device driver,?".  */
-    cmd = virQEMUCapsProbeCommand(qemu, qemuCaps, hookData);
+    cmd = virQEMUCapsProbeCommand(qemu, qemuCaps, runUid, runGid);
     virCommandAddArgList(cmd,
                          "-device", "?",
                          "-device", "pci-assign,?",
@@ -2183,7 +2158,6 @@ virQEMUCapsInitHelp(virQEMUCapsPtr qemuCaps, uid_t runUid, gid_t runGid)
     char *help = NULL;
     int ret = -1;
     const char *tmp;
-    virQEMUCapsHookData hookData;
 
     VIR_DEBUG("qemuCaps=%p", qemuCaps);
 
@@ -2196,9 +2170,7 @@ virQEMUCapsInitHelp(virQEMUCapsPtr qemuCaps, uid_t runUid, gid_t runGid)
         qemuCaps->arch = virArchFromHost();
     }
 
-    hookData.runUid = runUid;
-    hookData.runGid = runGid;
-    cmd = virQEMUCapsProbeCommand(qemuCaps->binary, NULL, &hookData);
+    cmd = virQEMUCapsProbeCommand(qemuCaps->binary, NULL, runUid, runGid);
     virCommandAddArgList(cmd, "-help", NULL);
     virCommandSetOutputBuffer(cmd, &help);
 
@@ -2227,13 +2199,15 @@ virQEMUCapsInitHelp(virQEMUCapsPtr qemuCaps, uid_t runUid, gid_t runGid)
      * understands the 0.13.0+ notion of "-device driver,".  */
     if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE) &&
         strstr(help, "-device driver,?") &&
-        virQEMUCapsExtractDeviceStr(qemuCaps->binary, qemuCaps, &hookData) < 0)
+        virQEMUCapsExtractDeviceStr(qemuCaps->binary,
+                                    qemuCaps, runUid, runGid) < 0) {
         goto cleanup;
+    }
 
-    if (virQEMUCapsProbeCPUModels(qemuCaps, &hookData) < 0)
+    if (virQEMUCapsProbeCPUModels(qemuCaps, runUid, runGid) < 0)
         goto cleanup;
 
-    if (virQEMUCapsProbeMachineTypes(qemuCaps, &hookData) < 0)
+    if (virQEMUCapsProbeMachineTypes(qemuCaps, runUid, runGid) < 0)
         goto cleanup;
 
     ret = 0;
@@ -2329,7 +2303,6 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
     char *monarg = NULL;
     char *monpath = NULL;
     char *pidfile = NULL;
-    virQEMUCapsHookData hookData;
     char *archstr;
     pid_t pid = 0;
     virDomainObj vm;
@@ -2383,9 +2356,8 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
                                NULL);
     virCommandAddEnvPassCommon(cmd);
     virCommandClearCaps(cmd);
-    hookData.runUid = runUid;
-    hookData.runGid = runGid;
-    virCommandSetPreExecHook(cmd, virQEMUCapsHook, &hookData);
+    virCommandSetGID(cmd, runGid);
+    virCommandSetUID(cmd, runUid);
 
     if (virCommandRun(cmd, &status) < 0)
         goto cleanup;
-- 
1.8.1




More information about the libvir-list mailing list