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 <crobinso@redhat.com> --- 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