Make it more data driven. This reduces code and makes it easier
to see dir mode requests at a glance.

Semantics of virDirCreate are subtly different, so keep dbusStateDir
separate for now

Besides some operation reordering this should behave the same as
before

Signed-off-by: Cole Robinson <[email protected]>
---
 src/qemu/qemu_driver.c | 224 ++++++++++-------------------------------
 1 file changed, 51 insertions(+), 173 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index b9f5e976b2..0cf88b8be9 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -522,192 +522,70 @@ static int
 qemuStateInitializeDirs(bool privileged,
                         virQEMUDriverConfig *cfg)
 {
-    int ret = -1;
+    size_t i;
+    g_autofree char *channeldir = g_path_get_dirname(cfg->channelTargetDir);
 
-    if (g_mkdir_with_parents(cfg->stateDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create state dir %1$s"),
-                             cfg->stateDir);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->libDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create lib dir %1$s"),
-                             cfg->libDir);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->cacheDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create cache dir %1$s"),
-                             cfg->cacheDir);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->saveDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create save dir %1$s"),
-                             cfg->saveDir);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->snapshotDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create snapshot dir %1$s"),
-                             cfg->snapshotDir);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->checkpointDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create checkpoint dir %1$s"),
-                             cfg->checkpointDir);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->autoDumpPath, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create dump dir %1$s"),
-                             cfg->autoDumpPath);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->channelTargetDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create channel target dir 
%1$s"),
-                             cfg->channelTargetDir);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->nvramDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create nvram dir %1$s"),
-                             cfg->nvramDir);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->varstoreDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create varstore dir %1$s"),
-                             cfg->varstoreDir);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->memoryBackingDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create memory backing dir 
%1$s"),
-                             cfg->memoryBackingDir);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->slirpStateDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create slirp state dir %1$s"),
-                             cfg->slirpStateDir);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->passtStateDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create passt state dir %1$s"),
-                             cfg->passtStateDir);
-        goto error;
+    struct dirperms {
+        const char *dir;
+        int mode;
+        uid_t user;
+        gid_t group;
+    };
+    struct dirperms dirs[] = {
+        /* example: /var/cache/libvirt/qemu */
+        { cfg->cacheDir, 0777, -1, -1 },
+
+        /* example: /run/libvirt/qemu */
+        { cfg->stateDir, 0777, -1, -1 },
+        { cfg->slirpStateDir, 0777, cfg->user, cfg->group },
+        { cfg->passtStateDir, 0777, cfg->user, cfg->group },
+        { cfg->rdpStateDir, 0777, cfg->user, cfg->group },
+        { channeldir, 0777, cfg->user, cfg->group },
+        { cfg->channelTargetDir, 0777, cfg->user, cfg->group },
+
+        /* example: /var/lib/libvirt/qemu */
+        { cfg->libDir, 0777, cfg->user, cfg->group },
+        { cfg->saveDir, 0777, cfg->user, cfg->group },
+        { cfg->snapshotDir, 0777, cfg->user, cfg->group },
+        { cfg->checkpointDir, 0777, cfg->user, cfg->group },
+        { cfg->autoDumpPath, 0777, cfg->user, cfg->group },
+        { cfg->nvramDir, 0777, cfg->user, cfg->group },
+        { cfg->varstoreDir, 0777, cfg->user, cfg->group },
+        { cfg->memoryBackingDir, 0777, cfg->user, cfg->group },
+    };
+
+    for (i = 0; i < G_N_ELEMENTS(dirs); i++) {
+        if (g_mkdir_with_parents(dirs[i].dir, dirs[i].mode) < 0) {
+            virReportSystemError(errno, _("Failed to create directory %1$s"),
+                                 dirs[i].dir);
+            return -1;
+        }
+
+        if (privileged &&
+            dirs[i].user != -1) {
+            if (chown(dirs[i].dir, dirs[i].user, dirs[i].group) < 0) {
+                virReportSystemError(errno,
+                                     _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
+                                     dirs[i].dir, (int)dirs[i].user,
+                                     (int)dirs[i].group);
+                return -1;
+            }
+        }
     }
 
     if (virDirCreate(cfg->dbusStateDir, 0770, cfg->user, cfg->group,
                      VIR_DIR_CREATE_ALLOW_EXIST) < 0) {
         virReportSystemError(errno, _("Failed to create dbus state dir %1$s"),
                              cfg->dbusStateDir);
-        goto error;
-    }
-    if (g_mkdir_with_parents(cfg->rdpStateDir, 0777) < 0) {
-        virReportSystemError(errno, _("Failed to create rdp state dir %1$s"),
-                             cfg->rdpStateDir);
-        goto error;
-    }
-
-    if (privileged) {
-        g_autofree char *channeldir = NULL;
-
-        if (chown(cfg->libDir, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to user 
%2$d:%3$d"),
-                                 cfg->libDir, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
-        if (chown(cfg->saveDir, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
-                                 cfg->saveDir, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
-        if (chown(cfg->snapshotDir, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
-                                 cfg->snapshotDir, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
-        if (chown(cfg->checkpointDir, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
-                                 cfg->checkpointDir, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
-        if (chown(cfg->autoDumpPath, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
-                                 cfg->autoDumpPath, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
-        channeldir = g_path_get_dirname(cfg->channelTargetDir);
-
-        if (chown(channeldir, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
-                                 channeldir, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
-        if (chown(cfg->channelTargetDir, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
-                                 cfg->channelTargetDir, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
-        if (chown(cfg->nvramDir, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
-                                 cfg->nvramDir, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
-        if (chown(cfg->varstoreDir, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
-                                 cfg->varstoreDir, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
-        if (chown(cfg->memoryBackingDir, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
-                                 cfg->memoryBackingDir, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
-        if (chown(cfg->slirpStateDir, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
-                                 cfg->slirpStateDir, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
-        if (chown(cfg->passtStateDir, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
-                                 cfg->passtStateDir, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
-        if (chown(cfg->rdpStateDir, cfg->user, cfg->group) < 0) {
-            virReportSystemError(errno,
-                                 _("unable to set ownership of '%1$s' to 
%2$d:%3$d"),
-                                 cfg->rdpStateDir, (int)cfg->user,
-                                 (int)cfg->group);
-            goto error;
-        }
+        return -1;
     }
 
     if (privileged &&
         virFileUpdatePerm(cfg->memoryBackingDir,
                           0, S_IXGRP | S_IXOTH) < 0)
-        goto error;
+        return -1;
 
-    ret = 0;
-error:
-    return ret;
+    return 0;
 }
 
 
-- 
2.53.0

Reply via email to