Unify optionrom cbfs/qemu_cfg rom pulling code.
Make the qemu_cfg optionrom extraction code use an interface more
similar to the cbfs file interface.
Introduce a set of "romfile_" wrappers that select between cbfs and
qemu cfg interface. Use these new wrappers in the optionrom code.
diff --git a/src/paravirt.c b/src/paravirt.c
index 5c77b5c..00ff58c 100644
--- a/src/paravirt.c
+++ b/src/paravirt.c
@@ -306,38 +306,48 @@
return cnt;
}
-u16 qemu_cfg_first_file(QemuCfgFile *entry)
-{
- memset(entry, 0, sizeof(*entry));
- return qemu_cfg_next_file(entry);
-}
+static QemuCfgFile LastFile;
-u16 qemu_cfg_next_file(QemuCfgFile *entry)
+static u32
+__cfg_next_prefix_file(const char *prefix, int prefixlen, u32 prevselect)
{
- u16 last = ntohs(entry->select);
- u32 e,count;
-
if (!qemu_cfg_present)
return 0;
+ u32 count;
qemu_cfg_read_entry(&count, QEMU_CFG_FILE_DIR, sizeof(count));
- for (e = 0; e < ntohl(count); e++) {
- qemu_cfg_read((void*)entry, sizeof(*entry));
- if (ntohs(entry->select) > last) {
- return 1;
- }
+ count = ntohl(count);
+ u32 e;
+ for (e = 0; e < count; e++) {
+ qemu_cfg_read((void*)&LastFile, sizeof(LastFile));
+ u32 select = ntohs(LastFile.select);
+ if (select <= prevselect)
+ continue;
+ if (memcmp(prefix, LastFile.name, prefixlen) == 0)
+ return select;
}
return 0;
}
-u32 qemu_cfg_read_file(QemuCfgFile *entry, void *dst, u32 maxlen)
+u32 qemu_cfg_next_prefix_file(const char *prefix, u32 prevselect)
{
- int len = ntohl(entry->size);
+ return __cfg_next_prefix_file(prefix, strlen(prefix), prevselect);
+}
+u32 qemu_cfg_find_file(const char *name)
+{
+ return __cfg_next_prefix_file(name, strlen(name) + 1, 0);
+}
+
+int qemu_cfg_read_file(u32 select, void *dst, u32 maxlen)
+{
if (!qemu_cfg_present)
- return 0;
+ return -1;
+ if (!select || select != ntohs(LastFile.select))
+ return -1;
+ int len = ntohl(LastFile.size);
if (len > maxlen)
- return 0;
- qemu_cfg_read_entry(dst, ntohs(entry->select), len);
+ return -1;
+ qemu_cfg_read_entry(dst, select, len);
return len;
}