QemuOpts: Convert qemu_opt_foreach() to Error
authorMarkus Armbruster <armbru@redhat.com>
Thu, 12 Mar 2015 07:40:25 +0000 (08:40 +0100)
committerMarkus Armbruster <armbru@redhat.com>
Tue, 9 Jun 2015 05:40:23 +0000 (07:40 +0200)
Retain the function value for now, to permit selective conversion of
its callers.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
include/qemu/option.h
net/vhost-user.c
qdev-monitor.c
ui/spice-core.c
util/qemu-config.c
util/qemu-option.c
vl.c

index a3cf4c198123e721b54ea0488a631537dd28c26d..ac0e43b7e515ba1338857cb259a9fedb33a07cd5 100644 (file)
@@ -100,8 +100,11 @@ void qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val,
                        Error **errp);
 void qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val,
                          Error **errp);
-typedef int (*qemu_opt_loopfunc)(const char *name, const char *value, void *opaque);
-int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque);
+typedef int (*qemu_opt_loopfunc)(void *opaque,
+                                 const char *name, const char *value,
+                                 Error **errp);
+int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
+                     Error **errp);
 
 QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id);
 QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
index 167082e76e12160bea6cc1e4cf7624c602650756..7e8a9ec4e8fb95ca5183ac4cfbee9861076372d5 100644 (file)
@@ -157,8 +157,9 @@ static int net_vhost_user_init(NetClientState *peer, const char *device,
     return 0;
 }
 
-static int net_vhost_chardev_opts(const char *name, const char *value,
-                                  void *opaque)
+static int net_vhost_chardev_opts(void *opaque,
+                                  const char *name, const char *value,
+                                  Error **errp)
 {
     VhostUserChardevProps *props = opaque;
 
@@ -189,7 +190,7 @@ static CharDriverState *net_vhost_parse_chardev(const NetdevVhostUserOptions *op
 
     /* inspect chardev opts */
     memset(&props, 0, sizeof(props));
-    if (qemu_opt_foreach(chr->opts, net_vhost_chardev_opts, &props)) {
+    if (qemu_opt_foreach(chr->opts, net_vhost_chardev_opts, &props, NULL)) {
         return NULL;
     }
 
index b7a21505771fd75895a9546c90665895c2072ed7..7dd62dd094be352ddce7b16f60235690b5a52053 100644 (file)
@@ -143,7 +143,8 @@ static void qdev_print_devinfos(bool show_no_user)
     g_slist_free(list);
 }
 
-static int set_property(const char *name, const char *value, void *opaque)
+static int set_property(void *opaque, const char *name, const char *value,
+                        Error **errp)
 {
     Object *obj = opaque;
     Error *err = NULL;
@@ -564,7 +565,7 @@ DeviceState *qdev_device_add(QemuOpts *opts)
     }
 
     /* set properties */
-    if (qemu_opt_foreach(opts, set_property, dev)) {
+    if (qemu_opt_foreach(opts, set_property, dev, NULL)) {
         object_unparent(OBJECT(dev));
         object_unref(OBJECT(dev));
         return NULL;
index 60818d9960faf4f50c8742990c2126e75b7bdb22..a30da3cf9fdc9955e2cd906316a01a41db8d165a 100644 (file)
@@ -583,7 +583,8 @@ int qemu_spice_migrate_info(const char *hostname, int port, int tls_port,
     return ret;
 }
 
-static int add_channel(const char *name, const char *value, void *opaque)
+static int add_channel(void *opaque, const char *name, const char *value,
+                       Error **errp)
 {
     int security = 0;
     int rc;
@@ -782,7 +783,7 @@ void qemu_spice_init(void)
     spice_server_set_playback_compression
         (spice_server, qemu_opt_get_bool(opts, "playback-compression", 1));
 
-    qemu_opt_foreach(opts, add_channel, &tls_port);
+    qemu_opt_foreach(opts, add_channel, &tls_port, NULL);
 
     spice_server_set_name(spice_server, qemu_name);
     spice_server_set_uuid(spice_server, qemu_uuid);
index aff4cb37c08b1470c61485879fe9da3342e10f9e..35adfda496fc341d141ed52ec57e46a00b806d10 100644 (file)
@@ -335,7 +335,8 @@ struct ConfigWriteData {
     FILE *fp;
 };
 
-static int config_write_opt(const char *name, const char *value, void *opaque)
+static int config_write_opt(void *opaque, const char *name, const char *value,
+                            Error **errp)
 {
     struct ConfigWriteData *data = opaque;
 
@@ -353,7 +354,7 @@ static int config_write_opts(void *opaque, QemuOpts *opts, Error **errp)
     } else {
         fprintf(data->fp, "[%s]\n", data->list->name);
     }
-    qemu_opt_foreach(opts, config_write_opt, data);
+    qemu_opt_foreach(opts, config_write_opt, data, NULL);
     fprintf(data->fp, "\n");
     return 0;
 }
index 296e2b3fae838d84e5a6956eaf04307cd558124a..840f5f7a5b92f465684b5796a6e346f9f10634ab 100644 (file)
@@ -597,20 +597,23 @@ void qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val,
 }
 
 /**
- * For each member of @opts, call @func(name, value, @opaque).
+ * For each member of @opts, call @func(@opaque, name, value, @errp).
+ * @func() may store an Error through @errp, but must return non-zero then.
  * When @func() returns non-zero, break the loop and return that value.
  * Return zero when the loop completes.
  */
-int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque)
+int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
+                     Error **errp)
 {
     QemuOpt *opt;
     int rc;
 
     QTAILQ_FOREACH(opt, &opts->head, next) {
-        rc = func(opt->name, opt->str, opaque);
+        rc = func(opaque, opt->name, opt->str, errp);
         if (rc) {
             return rc;
         }
+        assert(!errp || !*errp);
     }
     return 0;
 }
diff --git a/vl.c b/vl.c
index b12e6ffc9768d3ee1915e1eb8f03e710a2463b42..d4b2d03e0e1676c4a48749ffd3ebdcbc0cb9a2b6 100644 (file)
--- a/vl.c
+++ b/vl.c
@@ -2576,8 +2576,9 @@ static void free_and_trace(gpointer mem)
     free(mem);
 }
 
-static int machine_set_property(const char *name, const char *value,
-                                void *opaque)
+static int machine_set_property(void *opaque,
+                                const char *name, const char *value,
+                                Error **errp)
 {
     Object *obj = OBJECT(opaque);
     Error *local_err = NULL;
@@ -4070,8 +4071,8 @@ int main(int argc, char **argv, char **envp)
     }
 
     machine_opts = qemu_get_machine_opts();
-    if (qemu_opt_foreach(machine_opts, machine_set_property,
-                         current_machine)) {
+    if (qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
+                         NULL)) {
         object_unref(OBJECT(current_machine));
         exit(1);
     }