monitor: Add device_add and device_del completion.

Also fix device_add completion including non-hotpluggable devices.

Signed-off-by: Hani Benhabiles <hani@linux.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
Hani Benhabiles 2014-04-13 16:25:07 +01:00 committed by Luiz Capitulino
parent bfa40f77af
commit 2da1b3abbc
3 changed files with 28 additions and 14 deletions

View file

@ -658,6 +658,7 @@ ETEXI
.help = "add device, like -device on the command line",
.user_print = monitor_user_noop,
.mhandler.cmd_new = do_device_add,
.command_completion = device_add_completion,
},
STEXI
@ -673,6 +674,7 @@ ETEXI
.params = "device",
.help = "remove device",
.mhandler.cmd = hmp_device_del,
.command_completion = device_del_completion,
},
STEXI

2
hmp.h
View file

@ -95,5 +95,7 @@ void hmp_object_add(Monitor *mon, const QDict *qdict);
void hmp_object_del(Monitor *mon, const QDict *qdict);
void object_add_completion(ReadLineState *rs, int nb_args, const char *str);
void object_del_completion(ReadLineState *rs, int nb_args, const char *str);
void device_add_completion(ReadLineState *rs, int nb_args, const char *str);
void device_del_completion(ReadLineState *rs, int nb_args, const char *str);
#endif

View file

@ -4251,11 +4251,15 @@ static const char *next_arg_type(const char *typestr)
return (p != NULL ? ++p : typestr);
}
static void device_add_completion(ReadLineState *rs, const char *str)
void device_add_completion(ReadLineState *rs, int nb_args, const char *str)
{
GSList *list, *elt;
size_t len;
if (nb_args != 2) {
return;
}
len = strlen(str);
readline_set_completion_index(rs, len);
list = elt = object_class_get_list(TYPE_DEVICE, false);
@ -4264,7 +4268,9 @@ static void device_add_completion(ReadLineState *rs, const char *str)
DeviceClass *dc = OBJECT_CLASS_CHECK(DeviceClass, elt->data,
TYPE_DEVICE);
name = object_class_get_name(OBJECT_CLASS(dc));
if (!strncmp(name, str, len)) {
if (!dc->cannot_instantiate_with_device_add_yet
&& !strncmp(name, str, len)) {
readline_add_completion(rs, name);
}
elt = elt->next;
@ -4296,8 +4302,8 @@ void object_add_completion(ReadLineState *rs, int nb_args, const char *str)
g_slist_free(list);
}
static void device_del_completion(ReadLineState *rs, BusState *bus,
const char *str, size_t len)
static void device_del_bus_completion(ReadLineState *rs, BusState *bus,
const char *str, size_t len)
{
BusChild *kid;
@ -4310,11 +4316,24 @@ static void device_del_completion(ReadLineState *rs, BusState *bus,
}
QLIST_FOREACH(dev_child, &dev->child_bus, sibling) {
device_del_completion(rs, dev_child, str, len);
device_del_bus_completion(rs, dev_child, str, len);
}
}
}
void device_del_completion(ReadLineState *rs, int nb_args, const char *str)
{
size_t len;
if (nb_args != 2) {
return;
}
len = strlen(str);
readline_set_completion_index(rs, len);
device_del_bus_completion(rs, sysbus_get_default(), str, len);
}
void object_del_completion(ReadLineState *rs, int nb_args, const char *str)
{
ObjectPropertyInfoList *list, *start;
@ -4405,11 +4424,6 @@ static void monitor_find_completion_by_table(Monitor *mon,
readline_set_completion_index(mon->rs, strlen(str));
bdrv_iterate(block_completion_it, &mbs);
break;
case 'O':
if (!strcmp(cmd->name, "device_add") && nb_args == 2) {
device_add_completion(mon->rs, str);
}
break;
case 's':
case 'S':
if (!strcmp(cmd->name, "sendkey")) {
@ -4423,10 +4437,6 @@ static void monitor_find_completion_by_table(Monitor *mon,
} else if (!strcmp(cmd->name, "help|?")) {
monitor_find_completion_by_table(mon, cmd_table,
&args[1], nb_args - 1);
} else if (!strcmp(cmd->name, "device_del") && nb_args == 2) {
size_t len = strlen(str);
readline_set_completion_index(mon->rs, len);
device_del_completion(mon->rs, sysbus_get_default(), str, len);
}
break;
default: