From 30439c1b81e6e3455d5f01e275f8361ac217461d Mon Sep 17 00:00:00 2001 From: Andrea Bolognani Date: Thu, 7 Mar 2019 15:54:55 +0100 Subject: [PATCH] tests: Introduce testQemuCapsIterate() This function iterates over a directory containing capabilities-related data, extract some useful bits of information from the file name, and calls a user-provided callback. Signed-off-by: Andrea Bolognani Acked-by: Peter Krempa --- tests/testutilsqemu.c | 53 +++++++++++++++++++++++++++++++++++++++++++ tests/testutilsqemu.h | 8 +++++++ 2 files changed, 61 insertions(+) diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index 03a3f86c62..dffe473944 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -865,3 +865,56 @@ testQemuGetLatestCapsForArch(const char *dirname, virDirClose(&dir); return ret; } + + +int +testQemuCapsIterate(const char *dirname, + const char *suffix, + testQemuCapsIterateCallback callback, + void *opaque) +{ + struct dirent *ent; + DIR *dir = NULL; + int rc; + int ret = -1; + + if (!callback) + return 0; + + if (virDirOpen(&dir, dirname) < 0) + goto cleanup; + + while ((rc = virDirRead(dir, &ent, dirname) > 0)) { + char *tmp = ent->d_name; + char *base = NULL; + char *archName = NULL; + + /* Strip the trailing suffix, moving on if it's not present */ + if (!virStringStripSuffix(tmp, suffix)) + continue; + + /* Find the last dot, moving on if none is present */ + if (!(archName = strrchr(tmp, '.'))) + continue; + + /* The base name is everything before the last dot, and + * the architecture name everything after it */ + base = tmp; + archName[0] = '\0'; + archName++; + + /* Run the user-provided callback */ + if (callback(base, archName, opaque) < 0) + goto cleanup; + } + + if (rc < 0) + goto cleanup; + + ret = 0; + + cleanup: + virDirClose(&dir); + + return ret; +} diff --git a/tests/testutilsqemu.h b/tests/testutilsqemu.h index 5ae7f19473..183ce915f1 100644 --- a/tests/testutilsqemu.h +++ b/tests/testutilsqemu.h @@ -63,6 +63,14 @@ char *testQemuGetLatestCapsForArch(const char *dirname, const char *arch, const char *suffix); +typedef int (*testQemuCapsIterateCallback)(const char *base, + const char *archName, + void *opaque); +int testQemuCapsIterate(const char *dirname, + const char *suffix, + testQemuCapsIterateCallback callback, + void *opaque); + # endif #endif /* LIBVIRT_TESTUTILSQEMU_H */ -- GitLab