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", .help = "add device, like -device on the command line",
.user_print = monitor_user_noop, .user_print = monitor_user_noop,
.mhandler.cmd_new = do_device_add, .mhandler.cmd_new = do_device_add,
.command_completion = device_add_completion,
}, },
STEXI STEXI
@ -673,6 +674,7 @@ ETEXI
.params = "device", .params = "device",
.help = "remove device", .help = "remove device",
.mhandler.cmd = hmp_device_del, .mhandler.cmd = hmp_device_del,
.command_completion = device_del_completion,
}, },
STEXI 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 hmp_object_del(Monitor *mon, const QDict *qdict);
void object_add_completion(ReadLineState *rs, int nb_args, const char *str); 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 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 #endif

View File

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