diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index fe00c6f25b..c35e5c09a3 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -11820,3 +11820,44 @@ qemuDomainDeviceBackendChardevForeach(virDomainDef *def, DOMAIN_DEVICE_ITERATE_MISSING_INFO, &data); } + + +int +qemuDomainRemoveLogs(virQEMUDriver *driver, + const char *name) +{ + g_autoptr(virQEMUDriverConfig) cfg = NULL; + g_autofree char *format = NULL; + g_autofree char *main = NULL; + g_autoptr(DIR) dir = NULL; + struct dirent *entry; + int rc; + + cfg = virQEMUDriverGetConfig(driver); + if (!cfg->stdioLogD) + return 0; + + if (virDirOpen(&dir, cfg->logDir) < 0) + return -1; + + main = g_strdup_printf("%s.log", name); + format = g_strdup_printf("%s.log.%%u", name); + + while ((rc = virDirRead(dir, &entry, cfg->logDir)) > 0) { + unsigned int u; + + if (STREQ(entry->d_name, main) || + sscanf(entry->d_name, format, &u) == 1) { + g_autofree char *path = NULL; + + path = g_strdup_printf("%s/%s", cfg->logDir, entry->d_name); + if (unlink(path) && errno != ENOENT) + VIR_WARN("unlink(%s) error: %s", path, g_strerror(errno)); + } + } + + if (rc < 0) + return -1; + + return 0; +} diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index a41d8308e3..f4d84ca43a 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -1084,3 +1084,7 @@ int qemuDomainDeviceBackendChardevForeach(virDomainDef *def, qemuDomainDeviceBackendChardevForeachCallback cb, void *opaque); + +int +qemuDomainRemoveLogs(virQEMUDriver *driver, + const char *name); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 77012eb527..26647a9ae3 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2072,7 +2072,8 @@ qemuDomainDestroyFlags(virDomainPtr dom, int reason; bool starting; - virCheckFlags(VIR_DOMAIN_DESTROY_GRACEFUL, -1); + virCheckFlags(VIR_DOMAIN_DESTROY_GRACEFUL | + VIR_DOMAIN_DESTROY_REMOVE_LOGS, -1); if (!(vm = qemuDomainObjFromDomain(dom))) return -1; @@ -2112,6 +2113,11 @@ qemuDomainDestroyFlags(virDomainPtr dom, qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED, VIR_ASYNC_JOB_NONE, stopFlags); + + if ((flags & VIR_DOMAIN_DESTROY_REMOVE_LOGS) && + qemuDomainRemoveLogs(driver, vm->def->name) < 0) + VIR_WARN("Failed to remove logs for VM '%s'", vm->def->name); + event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_DESTROYED);