qdev: Fix exit code for -device ?
Help was shoehorned into device creation, qdev_device_add(). Since help doesn't create a device, it returns NULL, which looks to callers just like failed device creation. Monitor handler do_device_add() doesn't care, but main() exits unsuccessfully. Move help out of device creation, into new qdev_device_help(). Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
4a2594ddd3
commit
ff952ba25d
28
hw/qdev.c
28
hw/qdev.c
|
@ -153,6 +153,24 @@ static int set_property(const char *name, const char *value, void *opaque)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int qdev_device_help(QemuOpts *opts)
|
||||||
|
{
|
||||||
|
const char *driver;
|
||||||
|
DeviceInfo *info;
|
||||||
|
char msg[256];
|
||||||
|
|
||||||
|
driver = qemu_opt_get(opts, "driver");
|
||||||
|
if (driver && !strcmp(driver, "?")) {
|
||||||
|
for (info = device_info_list; info != NULL; info = info->next) {
|
||||||
|
qdev_print_devinfo(info, msg, sizeof(msg));
|
||||||
|
qemu_error("%s\n", msg);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
DeviceState *qdev_device_add(QemuOpts *opts)
|
DeviceState *qdev_device_add(QemuOpts *opts)
|
||||||
{
|
{
|
||||||
const char *driver, *path, *id;
|
const char *driver, *path, *id;
|
||||||
|
@ -165,14 +183,6 @@ DeviceState *qdev_device_add(QemuOpts *opts)
|
||||||
qemu_error("-device: no driver specified\n");
|
qemu_error("-device: no driver specified\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (strcmp(driver, "?") == 0) {
|
|
||||||
char msg[256];
|
|
||||||
for (info = device_info_list; info != NULL; info = info->next) {
|
|
||||||
qdev_print_devinfo(info, msg, sizeof(msg));
|
|
||||||
qemu_error("%s\n", msg);
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* find driver */
|
/* find driver */
|
||||||
info = qdev_find_info(NULL, driver);
|
info = qdev_find_info(NULL, driver);
|
||||||
|
@ -726,7 +736,7 @@ void do_device_add(Monitor *mon, const QDict *qdict)
|
||||||
|
|
||||||
opts = qemu_opts_parse(&qemu_device_opts,
|
opts = qemu_opts_parse(&qemu_device_opts,
|
||||||
qdict_get_str(qdict, "config"), "driver");
|
qdict_get_str(qdict, "config"), "driver");
|
||||||
if (opts)
|
if (opts && !qdev_device_help(opts))
|
||||||
qdev_device_add(opts);
|
qdev_device_add(opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,7 @@ typedef struct GlobalProperty {
|
||||||
/*** Board API. This should go away once we have a machine config file. ***/
|
/*** Board API. This should go away once we have a machine config file. ***/
|
||||||
|
|
||||||
DeviceState *qdev_create(BusState *bus, const char *name);
|
DeviceState *qdev_create(BusState *bus, const char *name);
|
||||||
|
int qdev_device_help(QemuOpts *opts);
|
||||||
DeviceState *qdev_device_add(QemuOpts *opts);
|
DeviceState *qdev_device_add(QemuOpts *opts);
|
||||||
int qdev_init(DeviceState *dev) QEMU_WARN_UNUSED_RESULT;
|
int qdev_init(DeviceState *dev) QEMU_WARN_UNUSED_RESULT;
|
||||||
void qdev_init_nofail(DeviceState *dev);
|
void qdev_init_nofail(DeviceState *dev);
|
||||||
|
|
8
vl.c
8
vl.c
|
@ -4459,6 +4459,11 @@ char *qemu_find_file(int type, const char *name)
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int device_help_func(QemuOpts *opts, void *opaque)
|
||||||
|
{
|
||||||
|
return qdev_device_help(opts);
|
||||||
|
}
|
||||||
|
|
||||||
static int device_init_func(QemuOpts *opts, void *opaque)
|
static int device_init_func(QemuOpts *opts, void *opaque)
|
||||||
{
|
{
|
||||||
DeviceState *dev;
|
DeviceState *dev;
|
||||||
|
@ -5828,6 +5833,9 @@ int main(int argc, char **argv, char **envp)
|
||||||
|
|
||||||
module_call_init(MODULE_INIT_DEVICE);
|
module_call_init(MODULE_INIT_DEVICE);
|
||||||
|
|
||||||
|
if (qemu_opts_foreach(&qemu_device_opts, device_help_func, NULL, 0) != 0)
|
||||||
|
exit(0);
|
||||||
|
|
||||||
if (watchdog) {
|
if (watchdog) {
|
||||||
i = select_watchdog(watchdog);
|
i = select_watchdog(watchdog);
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
|
|
Loading…
Reference in New Issue