diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index 9671a46f12..3222d7864c 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -674,3 +674,66 @@ testQemuCapsSetGIC(virQEMUCapsPtr qemuCaps, } #endif + + +char * +testQemuGetLatestCapsForArch(const char *dirname, + const char *arch, + const char *suffix) +{ + struct dirent *ent; + DIR *dir = NULL; + int rc; + char *fullsuffix = NULL; + char *tmp = NULL; + unsigned long maxver = 0; + unsigned long ver; + const char *maxname = NULL; + char *ret = NULL; + + if (virAsprintf(&fullsuffix, "%s.%s", arch, suffix) < 0) + goto cleanup; + + if (virDirOpen(&dir, dirname) < 0) + goto cleanup; + + while ((rc = virDirRead(dir, &ent, dirname)) > 0) { + VIR_FREE(tmp); + + if ((rc = VIR_STRDUP(tmp, STRSKIP(ent->d_name, "caps_"))) < 0) + goto cleanup; + + if (rc == 0) + continue; + + if (virFileStripSuffix(tmp, fullsuffix) != 1) + continue; + + if (virParseVersionString(tmp, &ver, false) < 0) { + VIR_TEST_DEBUG("skipping caps file '%s'\n", ent->d_name); + continue; + } + + if (ver > maxver) { + maxname = ent->d_name; + maxver = ver; + } + } + + if (rc < 0) + goto cleanup; + + if (!maxname) { + VIR_TEST_VERBOSE("failed to find capabilities for '%s' in '%s'\n", + arch, dirname); + goto cleanup; + } + + ignore_value(virAsprintf(&ret, "%s/%s", dirname, maxname)); + + cleanup: + VIR_FREE(tmp); + VIR_FREE(fullsuffix); + virDirClose(&dir); + return ret; +} diff --git a/tests/testutilsqemu.h b/tests/testutilsqemu.h index 7ae8324933..efb1baeadd 100644 --- a/tests/testutilsqemu.h +++ b/tests/testutilsqemu.h @@ -39,4 +39,9 @@ int qemuTestCapsCacheInsert(virFileCachePtr cache, int testQemuCapsSetGIC(virQEMUCapsPtr qemuCaps, int gic); + +char *testQemuGetLatestCapsForArch(const char *dirname, + const char *arch, + const char *suffix); + #endif