On Mon, Apr 06, 2026 at 18:16:54 -0400, Cole Robinson via Devel wrote:
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
[1]
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);
Since you're keeping dbusStateDir separate, keep this one too. Especially since it's being removed later on. [...]
+ 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) {
Fails syntax-check: make -C /home/pipo/build/libvirt/gcc/build-aux sc_prohibit_risky_id_promotion ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ✀ ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― stdout: make: Entering directory '/home/pipo/build/libvirt/gcc/build-aux' /home/pipo/libvirt/src/qemu/qemu_driver.c:565: dirs[i].user != -1) { make: Leaving directory '/home/pipo/build/libvirt/gcc/build-aux' stderr: cast -1 to ([ug]id_t) before comparing against id make: *** [/home/pipo/libvirt/build-aux/syntax-check.mk:183: sc_prohibit_risky_id_promotion] Error 1 You need to typecast -1 to uid_t. With syntax-check fixed and the channelDir thing separate: Reviewed-by: Peter Krempa <pkrempa@redhat.com>