QemuOpts: Convert qemu_opts_foreach() to Error

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>
Acked-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Markus Armbruster 2015-03-13 13:35:14 +01:00
parent a4c7367f7d
commit 28d0de7a4f
12 changed files with 72 additions and 54 deletions

View File

@ -219,7 +219,7 @@ struct add_rule_data {
Error **errp;
};
static int add_rule(QemuOpts *opts, void *opaque)
static int add_rule(void *opaque, QemuOpts *opts, Error **errp)
{
struct add_rule_data *d = opaque;
BDRVBlkdebugState *s = d->s;
@ -320,7 +320,7 @@ static int read_config(BDRVBlkdebugState *s, const char *filename,
d.s = s;
d.action = ACTION_INJECT_ERROR;
d.errp = &local_err;
qemu_opts_foreach(&inject_error_opts, add_rule, &d);
qemu_opts_foreach(&inject_error_opts, add_rule, &d, NULL);
if (local_err) {
error_propagate(errp, local_err);
ret = -EINVAL;
@ -328,7 +328,7 @@ static int read_config(BDRVBlkdebugState *s, const char *filename,
}
d.action = ACTION_SET_STATE;
qemu_opts_foreach(&set_state_opts, add_rule, &d);
qemu_opts_foreach(&set_state_opts, add_rule, &d, NULL);
if (local_err) {
error_propagate(errp, local_err);
ret = -EINVAL;

View File

@ -389,7 +389,7 @@ void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd)
nd->instantiated = 1;
}
static int qdev_add_one_global(QemuOpts *opts, void *opaque)
static int qdev_add_one_global(void *opaque, QemuOpts *opts, Error **errp)
{
GlobalProperty *g;
@ -404,5 +404,6 @@ static int qdev_add_one_global(QemuOpts *opts, void *opaque)
void qemu_add_globals(void)
{
qemu_opts_foreach(qemu_find_opts("global"), qdev_add_one_global, NULL);
qemu_opts_foreach(qemu_find_opts("global"),
qdev_add_one_global, NULL, NULL);
}

View File

@ -125,9 +125,9 @@ QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict);
void qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp);
typedef int (*qemu_opts_loopfunc)(QemuOpts *opts, void *opaque);
typedef int (*qemu_opts_loopfunc)(void *opaque, QemuOpts *opts, Error **errp);
int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func,
void *opaque);
void *opaque, Error **errp);
void qemu_opts_print(QemuOpts *opts, const char *sep);
void qemu_opts_print_help(QemuOptsList *list);
void qemu_opts_free(QemuOptsList *list);

View File

@ -370,7 +370,7 @@ char *vnc_display_local_addr(const char *id);
int vnc_display_password(const char *id, const char *password);
int vnc_display_pw_expire(const char *id, time_t expires);
QemuOpts *vnc_parse_func(const char *str);
int vnc_init_func(QemuOpts *opts, void *opaque);
int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp);
#else
static inline int vnc_display_password(const char *id, const char *password)
{

View File

@ -1329,7 +1329,7 @@ void net_check_clients(void)
}
}
static int net_init_client(QemuOpts *opts, void *dummy)
static int net_init_client(void *dummy, QemuOpts *opts, Error **errp)
{
Error *local_err = NULL;
@ -1342,7 +1342,7 @@ static int net_init_client(QemuOpts *opts, void *dummy)
return 0;
}
static int net_init_netdev(QemuOpts *opts, void *dummy)
static int net_init_netdev(void *dummy, QemuOpts *opts, Error **errp)
{
Error *local_err = NULL;
int ret;
@ -1373,11 +1373,12 @@ int net_init_clients(void)
QTAILQ_INIT(&net_clients);
if (qemu_opts_foreach(qemu_find_opts("netdev"), net_init_netdev, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("netdev"),
net_init_netdev, NULL, NULL)) {
return -1;
}
if (qemu_opts_foreach(net, net_init_client, NULL)) {
if (qemu_opts_foreach(net, net_init_client, NULL, NULL)) {
return -1;
}

View File

@ -204,7 +204,7 @@ static CharDriverState *net_vhost_parse_chardev(const NetdevVhostUserOptions *op
return chr;
}
static int net_vhost_check_net(QemuOpts *opts, void *opaque)
static int net_vhost_check_net(void *opaque, QemuOpts *opts, Error **errp)
{
const char *name = opaque;
const char *driver, *netdev;
@ -245,7 +245,7 @@ int net_init_vhost_user(const NetClientOptions *opts, const char *name,
/* verify net frontend */
if (qemu_opts_foreach(qemu_find_opts("device"), net_vhost_check_net,
(char *)name)) {
(char *)name, NULL)) {
return -1;
}

4
numa.c
View File

@ -125,7 +125,7 @@ static void numa_node_parse(NumaNodeOptions *node, QemuOpts *opts, Error **errp)
max_numa_nodeid = MAX(max_numa_nodeid, nodenr + 1);
}
static int parse_numa(QemuOpts *opts, void *opaque)
static int parse_numa(void *opaque, QemuOpts *opts, Error **errp)
{
NumaOptions *object = NULL;
Error *err = NULL;
@ -216,7 +216,7 @@ void parse_numa_opts(MachineClass *mc)
{
int i;
if (qemu_opts_foreach(qemu_find_opts("numa"), parse_numa, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("numa"), parse_numa, NULL, NULL)) {
exit(1);
}

6
tpm.c
View File

@ -182,7 +182,7 @@ static int configure_tpm(QemuOpts *opts)
return 0;
}
static int tpm_init_tpmdev(QemuOpts *opts, void *dummy)
static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
{
return configure_tpm(opts);
}
@ -207,12 +207,12 @@ void tpm_cleanup(void)
*/
int tpm_init(void)
{
if (qemu_opts_foreach(qemu_find_opts("tpmdev"), tpm_init_tpmdev, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("tpmdev"),
tpm_init_tpmdev, NULL, NULL)) {
return -1;
}
atexit(tpm_cleanup);
return 0;
}

View File

@ -3770,7 +3770,7 @@ QemuOpts *vnc_parse_func(const char *str)
return opts;
}
int vnc_init_func(QemuOpts *opts, void *opaque)
int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp)
{
Error *local_err = NULL;
char *id = (char *)qemu_opts_id(opts);

View File

@ -343,7 +343,7 @@ static int config_write_opt(const char *name, const char *value, void *opaque)
return 0;
}
static int config_write_opts(QemuOpts *opts, void *opaque)
static int config_write_opts(void *opaque, QemuOpts *opts, Error **errp)
{
struct ConfigWriteData *data = opaque;
const char *id = qemu_opts_id(opts);
@ -367,7 +367,7 @@ void qemu_config_write(FILE *fp)
fprintf(fp, "# qemu config file\n\n");
for (i = 0; lists[i] != NULL; i++) {
data.list = lists[i];
qemu_opts_foreach(data.list, config_write_opts, &data);
qemu_opts_foreach(data.list, config_write_opts, &data, NULL);
}
}

View File

@ -1047,13 +1047,14 @@ void qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp)
}
/**
* For each member of @list, call @func(member, @opaque).
* For each member of @list, call @func(@opaque, member, @errp).
* Call it with the current location temporarily set to the member's.
* @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_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func,
void *opaque)
void *opaque, Error **errp)
{
Location loc;
QemuOpts *opts;
@ -1062,10 +1063,11 @@ int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func,
loc_push_none(&loc);
QTAILQ_FOREACH(opts, &list->head, next) {
loc_restore(&opts->loc);
rc = func(opts, opaque);
rc = func(opaque, opts, errp);
if (rc) {
return rc;
}
assert(!errp || !*errp);
}
loc_pop(&loc);
return 0;

72
vl.c
View File

@ -515,7 +515,7 @@ static void res_free(void)
}
}
static int default_driver_check(QemuOpts *opts, void *opaque)
static int default_driver_check(void *opaque, QemuOpts *opts, Error **errp)
{
const char *driver = qemu_opt_get(opts, "driver");
int i;
@ -961,7 +961,7 @@ static int bt_parse(const char *opt)
return 1;
}
static int parse_sandbox(QemuOpts *opts, void *opaque)
static int parse_sandbox(void *opaque, QemuOpts *opts, Error **errp)
{
/* FIXME: change this to true for 1.3 */
if (qemu_opt_get_bool(opts, "enable", false)) {
@ -981,7 +981,7 @@ static int parse_sandbox(QemuOpts *opts, void *opaque)
return 0;
}
static int parse_name(QemuOpts *opts, void *opaque)
static int parse_name(void *opaque, QemuOpts *opts, Error **errp)
{
const char *proc_name;
@ -1009,7 +1009,7 @@ bool usb_enabled(void)
}
#ifndef _WIN32
static int parse_add_fd(QemuOpts *opts, void *opaque)
static int parse_add_fd(void *opaque, QemuOpts *opts, Error **errp)
{
int fd, dupfd, flags;
int64_t fdset_id;
@ -1071,7 +1071,7 @@ static int parse_add_fd(QemuOpts *opts, void *opaque)
return 0;
}
static int cleanup_add_fd(QemuOpts *opts, void *opaque)
static int cleanup_add_fd(void *opaque, QemuOpts *opts, Error **errp)
{
int fd;
@ -1092,14 +1092,14 @@ static int cleanup_add_fd(QemuOpts *opts, void *opaque)
#define MTD_OPTS ""
#define SD_OPTS ""
static int drive_init_func(QemuOpts *opts, void *opaque)
static int drive_init_func(void *opaque, QemuOpts *opts, Error **errp)
{
BlockInterfaceType *block_default_type = opaque;
return drive_new(opts, *block_default_type) == NULL;
}
static int drive_enable_snapshot(QemuOpts *opts, void *opaque)
static int drive_enable_snapshot(void *opaque, QemuOpts *opts, Error **errp)
{
if (qemu_opt_get(opts, "snapshot") == NULL) {
qemu_opt_set(opts, "snapshot", "on", &error_abort);
@ -1119,7 +1119,7 @@ static void default_drive(int enable, int snapshot, BlockInterfaceType type,
opts = drive_add(type, index, NULL, optstr);
if (snapshot) {
drive_enable_snapshot(opts, NULL);
drive_enable_snapshot(NULL, opts, NULL);
}
dinfo = drive_new(opts, type);
@ -2127,12 +2127,12 @@ char *qemu_find_file(int type, const char *name)
return NULL;
}
static int device_help_func(QemuOpts *opts, void *opaque)
static int device_help_func(void *opaque, QemuOpts *opts, Error **errp)
{
return qdev_device_help(opts);
}
static int device_init_func(QemuOpts *opts, void *opaque)
static int device_init_func(void *opaque, QemuOpts *opts, Error **errp)
{
DeviceState *dev;
@ -2143,7 +2143,7 @@ static int device_init_func(QemuOpts *opts, void *opaque)
return 0;
}
static int chardev_init_func(QemuOpts *opts, void *opaque)
static int chardev_init_func(void *opaque, QemuOpts *opts, Error **errp)
{
Error *local_err = NULL;
@ -2156,7 +2156,7 @@ static int chardev_init_func(QemuOpts *opts, void *opaque)
}
#ifdef CONFIG_VIRTFS
static int fsdev_init_func(QemuOpts *opts, void *opaque)
static int fsdev_init_func(void *opaque, QemuOpts *opts, Error **errp)
{
int ret;
ret = qemu_fsdev_add(opts);
@ -2165,7 +2165,7 @@ static int fsdev_init_func(QemuOpts *opts, void *opaque)
}
#endif
static int mon_init_func(QemuOpts *opts, void *opaque)
static int mon_init_func(void *opaque, QemuOpts *opts, Error **errp)
{
CharDriverState *chr;
const char *chardev;
@ -2606,7 +2606,7 @@ static int machine_set_property(const char *name, const char *value,
return 0;
}
static int object_create(QemuOpts *opts, void *opaque)
static int object_create(void *opaque, QemuOpts *opts, Error **errp)
{
Error *err = NULL;
char *type = NULL;
@ -3797,20 +3797,24 @@ int main(int argc, char **argv, char **envp)
exit(1);
}
if (qemu_opts_foreach(qemu_find_opts("sandbox"), parse_sandbox, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("sandbox"),
parse_sandbox, NULL, NULL)) {
exit(1);
}
if (qemu_opts_foreach(qemu_find_opts("name"), parse_name, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("name"),
parse_name, NULL, NULL)) {
exit(1);
}
#ifndef _WIN32
if (qemu_opts_foreach(qemu_find_opts("add-fd"), parse_add_fd, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("add-fd"),
parse_add_fd, NULL, NULL)) {
exit(1);
}
if (qemu_opts_foreach(qemu_find_opts("add-fd"), cleanup_add_fd, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("add-fd"),
cleanup_add_fd, NULL, NULL)) {
exit(1);
}
#endif
@ -3897,8 +3901,10 @@ int main(int argc, char **argv, char **envp)
machine_class->default_machine_opts, 0);
}
qemu_opts_foreach(qemu_find_opts("device"), default_driver_check, NULL);
qemu_opts_foreach(qemu_find_opts("global"), default_driver_check, NULL);
qemu_opts_foreach(qemu_find_opts("device"),
default_driver_check, NULL, NULL);
qemu_opts_foreach(qemu_find_opts("global"),
default_driver_check, NULL, NULL);
if (!vga_model && !default_vga) {
vga_interface_type = VGA_DEVICE;
@ -4036,12 +4042,14 @@ int main(int argc, char **argv, char **envp)
socket_init();
if (qemu_opts_foreach(qemu_find_opts("chardev"), chardev_init_func, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("chardev"),
chardev_init_func, NULL, NULL)) {
exit(1);
}
#ifdef CONFIG_VIRTFS
if (qemu_opts_foreach(qemu_find_opts("fsdev"), fsdev_init_func, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("fsdev"),
fsdev_init_func, NULL, NULL)) {
exit(1);
}
#endif
@ -4051,11 +4059,13 @@ int main(int argc, char **argv, char **envp)
exit(1);
}
if (qemu_opts_foreach(qemu_find_opts("device"), device_help_func, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("device"),
device_help_func, NULL, NULL)) {
exit(0);
}
if (qemu_opts_foreach(qemu_find_opts("object"), object_create, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("object"),
object_create, NULL, NULL)) {
exit(1);
}
@ -4189,9 +4199,10 @@ int main(int argc, char **argv, char **envp)
/* open the virtual block devices */
if (snapshot)
qemu_opts_foreach(qemu_find_opts("drive"), drive_enable_snapshot, NULL);
qemu_opts_foreach(qemu_find_opts("drive"),
drive_enable_snapshot, NULL, NULL);
if (qemu_opts_foreach(qemu_find_opts("drive"), drive_init_func,
&machine_class->block_default_type)) {
&machine_class->block_default_type, NULL)) {
exit(1);
}
@ -4202,7 +4213,8 @@ int main(int argc, char **argv, char **envp)
parse_numa_opts(machine_class);
if (qemu_opts_foreach(qemu_find_opts("mon"), mon_init_func, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("mon"),
mon_init_func, NULL, NULL)) {
exit(1);
}
@ -4268,7 +4280,8 @@ int main(int argc, char **argv, char **envp)
}
/* init generic devices */
if (qemu_opts_foreach(qemu_find_opts("device"), device_init_func, NULL)) {
if (qemu_opts_foreach(qemu_find_opts("device"),
device_init_func, NULL, NULL)) {
exit(1);
}
@ -4322,7 +4335,8 @@ int main(int argc, char **argv, char **envp)
#ifdef CONFIG_VNC
/* init remote displays */
qemu_opts_foreach(qemu_find_opts("vnc"), vnc_init_func, NULL);
qemu_opts_foreach(qemu_find_opts("vnc"),
vnc_init_func, NULL, NULL);
if (show_vnc_port) {
char *ret = vnc_display_local_addr("default");
printf("VNC server running on `%s'\n", ret);