%ghost %dir %{_rundir}/libvirt/qemu/slirp/
%ghost %dir %{_rundir}/libvirt/qemu/swtpm/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/
-%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/channel/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/checkpoint/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/dump/
%dir %attr(0751, %{qemu_user}, %{qemu_group}) %{_localstatedir}/lib/libvirt/qemu/nvram/
cfg->configBaseDir = g_strdup_printf("%s/etc", root);
cfg->stateDir = g_strdup_printf("%s/run/qemu", root);
cfg->swtpmStateDir = g_strdup_printf("%s/run/swtpm", root);
+ cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->stateDir);
cfg->cacheDir = g_strdup_printf("%s/cache/qemu", root);
cfg->libDir = g_strdup_printf("%s/lib/qemu", root);
cfg->swtpmStorageDir = g_strdup_printf("%s/lib/swtpm", root);
cfg->snapshotDir = g_strdup_printf("%s/snapshot", cfg->libDir);
cfg->checkpointDir = g_strdup_printf("%s/checkpoint", cfg->libDir);
cfg->autoDumpPath = g_strdup_printf("%s/dump", cfg->libDir);
- cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->libDir);
cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir);
cfg->memoryBackingDir = g_strdup_printf("%s/ram", cfg->libDir);
} else if (privileged) {
cfg->configBaseDir = g_strdup(SYSCONFDIR "/libvirt");
cfg->stateDir = g_strdup_printf("%s/libvirt/qemu", RUNSTATEDIR);
-
cfg->swtpmStateDir = g_strdup_printf("%s/libvirt/qemu/swtpm", RUNSTATEDIR);
+ cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->stateDir);
cfg->cacheDir = g_strdup_printf("%s/cache/libvirt/qemu", LOCALSTATEDIR);
cfg->snapshotDir = g_strdup_printf("%s/snapshot", cfg->libDir);
cfg->checkpointDir = g_strdup_printf("%s/checkpoint", cfg->libDir);
cfg->autoDumpPath = g_strdup_printf("%s/dump", cfg->libDir);
- cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->libDir);
cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir);
cfg->memoryBackingDir = g_strdup_printf("%s/ram", cfg->libDir);
cfg->swtpmStorageDir = g_strdup_printf("%s/lib/libvirt/swtpm",
rundir = virGetUserRuntimeDirectory();
cfg->stateDir = g_strdup_printf("%s/qemu/run", rundir);
-
cfg->swtpmStateDir = g_strdup_printf("%s/swtpm", cfg->stateDir);
+ cfg->channelTargetDir = g_strdup_printf("%s/channel", cfg->stateDir);
cfg->configBaseDir = virGetUserConfigDirectory();
cfg->checkpointDir = g_strdup_printf("%s/qemu/checkpoint",
cfg->configBaseDir);
cfg->autoDumpPath = g_strdup_printf("%s/qemu/dump", cfg->configBaseDir);
- cfg->channelTargetDir = g_strdup_printf("%s/qemu/channel",
- cfg->configBaseDir);
cfg->nvramDir = g_strdup_printf("%s/qemu/nvram", cfg->configBaseDir);
cfg->memoryBackingDir = g_strdup_printf("%s/qemu/ram", cfg->configBaseDir);
cfg->swtpmStorageDir = g_strdup_printf("%s/qemu/swtpm",
}
+
+static bool
+qemuDomainChrMatchDefaultPath(const char *prefix,
+ const char *infix,
+ const char *target,
+ const char *path)
+{
+ g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
+ g_autofree char *regexp = NULL;
+
+ virBufferEscapeRegex(&buf, "^%s", prefix);
+ if (infix)
+ virBufferEscapeRegex(&buf, "%s", infix);
+ virBufferAddLit(&buf, "/(target/)?([^/]+\\.)|(domain-[^/]+/)|([0-9]+-[^/]+/)");
+ virBufferEscapeRegex(&buf, "%s$", target);
+
+ regexp = virBufferContentAndReset(&buf);
+
+ return virStringMatch(path, regexp);
+}
+
+
/*
* Clear auto generated unix socket paths:
*
*
* This function clears the path for migration as well, so we need to clear
* the path even if we are not storing it in the XML.
+ *
+ * Please note, as of libvirt 9.7.0 the channelTargetDir is no longer derived
+ * from cfg->libDir but rather cfg->stateDir.
*/
static void
qemuDomainChrDefDropDefaultPath(virDomainChrDef *chr,
cfg = virQEMUDriverGetConfig(driver);
- virBufferEscapeRegex(&buf, "^%s", cfg->channelTargetDir);
- virBufferAddLit(&buf, "/(target/)?([^/]+\\.)|(domain-[^/]+/)|([0-9]+-[^/]+/)");
- virBufferEscapeRegex(&buf, "%s$", chr->target.name);
+ if (qemuDomainChrMatchDefaultPath(cfg->channelTargetDir,
+ NULL,
+ chr->target.name,
+ chr->source->data.nix.path)) {
+ VIR_FREE(chr->source->data.nix.path);
+ return;
+ }
- regexp = virBufferContentAndReset(&buf);
+ /* Previously, channelTargetDir was derived from cfg->libdir, or
+ * cfg->configBaseDir even. Try them too. */
+ if (qemuDomainChrMatchDefaultPath(cfg->libDir,
+ "/channel",
+ chr->target.name,
+ chr->source->data.nix.path)) {
+ VIR_FREE(chr->source->data.nix.path);
+ return;
+ }
- if (virStringMatch(chr->source->data.nix.path, regexp))
+ if (qemuDomainChrMatchDefaultPath(cfg->configBaseDir,
+ "/qemu/channel",
+ chr->target.name,
+ chr->source->data.nix.path)) {
VIR_FREE(chr->source->data.nix.path);
+ return;
+ }
}
<channel type='unix'>
- <source mode='bind' path='/var/lib/libvirt/qemu/channel/7-hotplug/org.qemu.guest_agent.0'/>
+ <source mode='bind' path='/var/run/libvirt/qemu/channel/7-hotplug/org.qemu.guest_agent.0'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</controller>
<channel type='unix'>
- <source mode='bind' path='/var/lib/libvirt/qemu/channel/7-hotplug/org.qemu.guest_agent.0'/>
+ <source mode='bind' path='/var/run/libvirt/qemu/channel/7-hotplug/org.qemu.guest_agent.0'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</controller>
<channel type='unix'>
- <source mode='bind' path='/var/lib/libvirt/qemu/channel/7-hotplug/org.qemu.guest_agent.0'/>
+ <source mode='bind' path='/var/run/libvirt/qemu/channel/7-hotplug/org.qemu.guest_agent.0'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
<source mode='bind' path='/var/lib/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.4'/>
<target type='virtio' name='org.qemu.guest_agent.4'/>
</channel>
+ <channel type='unix'>
+ <source mode='bind' path='/var/run/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.5'/>
+ <target type='virtio' name='org.qemu.guest_agent.5'/>
+ </channel>
<memballoon model='none'/>
</devices>
</domain>
<target type='virtio' name='org.qemu.guest_agent.4'/>
<address type='virtio-serial' controller='0' bus='0' port='5'/>
</channel>
+ <channel type='unix'>
+ <source mode='bind' path='/var/run/libvirt/qemu/channel/1-QEMUGuest1/org.qemu.guest_agent.5'/>
+ <target type='virtio' name='org.qemu.guest_agent.5'/>
+ <address type='virtio-serial' controller='0' bus='0' port='6'/>
+ </channel>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<audio id='1' type='none'/>
<target type='virtio' name='org.qemu.guest_agent.4'/>
<address type='virtio-serial' controller='0' bus='0' port='5'/>
</channel>
+ <channel type='unix'>
+ <target type='virtio' name='org.qemu.guest_agent.5'/>
+ <address type='virtio-serial' controller='0' bus='0' port='6'/>
+ </channel>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<audio id='1' type='none'/>
VIR_FREE(cfg->libDir);
cfg->libDir = g_strdup("/var/lib/libvirt/qemu");
VIR_FREE(cfg->channelTargetDir);
- cfg->channelTargetDir = g_strdup("/var/lib/libvirt/qemu/channel");
+ cfg->channelTargetDir = g_strdup("/var/run/libvirt/qemu/channel");
VIR_FREE(cfg->memoryBackingDir);
cfg->memoryBackingDir = g_strdup("/var/lib/libvirt/qemu/ram");
VIR_FREE(cfg->nvramDir);