aboutgitcodebugslistschat
diff options
context:
space:
mode:
-rw-r--r--qrap.c51
1 files changed, 41 insertions, 10 deletions
diff --git a/qrap.c b/qrap.c
index a9a0fc1..3c6f5b8 100644
--- a/qrap.c
+++ b/qrap.c
@@ -69,6 +69,8 @@ static const struct drop_arg {
* @name: Device ("-device") name to insert
* @template: Prefix for device specification (first part of address)
* @template_post: Suffix for device specification (last part of address)
+ * @template_json: Device prefix for when JSON is used
+ * @template_json_post: Device suffix for when JSON is used
* @first: First usable PCI address
* @last: Last usable PCI address
*/
@@ -77,15 +79,29 @@ static const struct pci_dev {
char *name;
char *template;
char *template_post;
+ char *template_json;
+ char *template_json_post;
int first;
int last;
} pci_devs[] = {
- { "pc-q35", "virtio-net-pci",
- "bus=pci.", ",addr=0x0", 3, /* 2: hotplug bus */ 16 },
- { "pc-", "virtio-net-pci",
- "bus=pci.0,addr=0x", "", 2, /* 1: ISA bridge */ 16 },
- { "s390-ccw", "virtio-net-ccw",
- "devno=fe.0.", "", 1, 16 },
+ {
+ "pc-q35", "virtio-net-pci",
+ "bus=pci.", ",addr=0x0",
+ "\"bus\":\"pci.", ",\"addr\":\"0x0\"",
+ 3, /* 2: hotplug bus */ 16
+ },
+ {
+ "pc-", "virtio-net-pci",
+ "bus=pci.0,addr=0x", "",
+ "\"bus\":\"pci.0\",\"addr=0x", "",
+ 2, /* 1: ISA bridge */ 16
+ },
+ {
+ "s390-ccw", "virtio-net-ccw",
+ "devno=fe.0.", "",
+ "\"devno\":\"fe.0.", "",
+ 1, 16
+ },
{ 0 },
};
@@ -115,7 +131,7 @@ void usage(const char *name)
*/
int main(int argc, char **argv)
{
- int i, s, qemu_argc = 0, addr_map = 0, has_dev = 0, retry_on_reset, rc;
+ int i, s, qemu_argc = 0, addr_map = 0, has_dev = 0, has_json = 0, retry_on_reset, rc;
struct timeval tv = { .tv_sec = 0, .tv_usec = (long)(500 * 1000) };
char *qemu_argv[ARG_MAX], dev_str[ARG_MAX];
struct sockaddr_un addr = {
@@ -227,14 +243,22 @@ int main(int argc, char **argv)
}
if (!strcmp(argv[i], "-device") && i + 1 < argc) {
+ char *template = NULL;
char *p;
has_dev = 1;
if ((p = strstr(argv[i + 1], dev->template))) {
+ template = dev->template;
+ } else if ((p = strstr(argv[i + 1], dev->template_json))) {
+ template = dev->template_json;
+ has_json = 1;
+ }
+
+ if (template) {
long n;
- n = strtol(p + strlen(dev->template), NULL, 16);
+ n = strtol(p + strlen(template), NULL, 16);
if (!errno)
addr_map |= (1 << n);
}
@@ -254,8 +278,15 @@ int main(int argc, char **argv)
if (has_dev) {
qemu_argv[qemu_argc++] = "-device";
- snprintf(dev_str, ARG_MAX, "%s,%s%x%s,netdev=hostnet0,x-txburst=4096",
- dev->name, dev->template, i, dev->template_post);
+ if (!has_json) {
+ snprintf(dev_str, ARG_MAX,
+ "%s,%s%x%s,netdev=hostnet0,x-txburst=4096",
+ dev->name, dev->template, i, dev->template_post);
+ } else {
+ snprintf(dev_str, ARG_MAX,
+ "{\"driver\":\"%s\",%s%x\"%s,\"netdev\":\"hostnet0\",\"x-txburst\":4096}",
+ dev->name, dev->template_json, i, dev->template_json_post);
+ }
qemu_argv[qemu_argc++] = dev_str;
}