monitor: Add command_completion callback to mon_cmd_t.
Convert object_add and object_del commands to use the new callback. Signed-off-by: Hani Benhabiles <hani@linux.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
parent
f7bdc41acc
commit
bfa40f77af
|
@ -1254,6 +1254,7 @@ ETEXI
|
||||||
.params = "[qom-type=]type,id=str[,prop=value][,...]",
|
.params = "[qom-type=]type,id=str[,prop=value][,...]",
|
||||||
.help = "create QOM object",
|
.help = "create QOM object",
|
||||||
.mhandler.cmd = hmp_object_add,
|
.mhandler.cmd = hmp_object_add,
|
||||||
|
.command_completion = object_add_completion,
|
||||||
},
|
},
|
||||||
|
|
||||||
STEXI
|
STEXI
|
||||||
|
@ -1268,6 +1269,7 @@ ETEXI
|
||||||
.params = "id",
|
.params = "id",
|
||||||
.help = "destroy QOM object",
|
.help = "destroy QOM object",
|
||||||
.mhandler.cmd = hmp_object_del,
|
.mhandler.cmd = hmp_object_del,
|
||||||
|
.command_completion = object_del_completion,
|
||||||
},
|
},
|
||||||
|
|
||||||
STEXI
|
STEXI
|
||||||
|
|
3
hmp.h
3
hmp.h
|
@ -15,6 +15,7 @@
|
||||||
#define HMP_H
|
#define HMP_H
|
||||||
|
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
|
#include "qemu/readline.h"
|
||||||
#include "qapi-types.h"
|
#include "qapi-types.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
|
|
||||||
|
@ -92,5 +93,7 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_cpu_add(Monitor *mon, const QDict *qdict);
|
void hmp_cpu_add(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_object_add(Monitor *mon, const QDict *qdict);
|
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_del_completion(ReadLineState *rs, int nb_args, const char *str);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
19
monitor.c
19
monitor.c
|
@ -137,6 +137,7 @@ typedef struct mon_cmd_t {
|
||||||
* used, and mhandler of 1st level plays the role of help function.
|
* used, and mhandler of 1st level plays the role of help function.
|
||||||
*/
|
*/
|
||||||
struct mon_cmd_t *sub_table;
|
struct mon_cmd_t *sub_table;
|
||||||
|
void (*command_completion)(ReadLineState *rs, int nb_args, const char *str);
|
||||||
} mon_cmd_t;
|
} mon_cmd_t;
|
||||||
|
|
||||||
/* file descriptors passed via SCM_RIGHTS */
|
/* file descriptors passed via SCM_RIGHTS */
|
||||||
|
@ -4271,11 +4272,15 @@ static void device_add_completion(ReadLineState *rs, const char *str)
|
||||||
g_slist_free(list);
|
g_slist_free(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void object_add_completion(ReadLineState *rs, const char *str)
|
void object_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_USER_CREATABLE, false);
|
list = elt = object_class_get_list(TYPE_USER_CREATABLE, false);
|
||||||
|
@ -4310,11 +4315,14 @@ static void device_del_completion(ReadLineState *rs, BusState *bus,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void object_del_completion(ReadLineState *rs, const char *str)
|
void object_del_completion(ReadLineState *rs, int nb_args, const char *str)
|
||||||
{
|
{
|
||||||
ObjectPropertyInfoList *list, *start;
|
ObjectPropertyInfoList *list, *start;
|
||||||
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);
|
||||||
|
|
||||||
|
@ -4368,6 +4376,9 @@ static void monitor_find_completion_by_table(Monitor *mon,
|
||||||
return monitor_find_completion_by_table(mon, cmd->sub_table,
|
return monitor_find_completion_by_table(mon, cmd->sub_table,
|
||||||
&args[1], nb_args - 1);
|
&args[1], nb_args - 1);
|
||||||
}
|
}
|
||||||
|
if (cmd->command_completion) {
|
||||||
|
return cmd->command_completion(mon->rs, nb_args, args[nb_args - 1]);
|
||||||
|
}
|
||||||
|
|
||||||
ptype = next_arg_type(cmd->args_type);
|
ptype = next_arg_type(cmd->args_type);
|
||||||
for(i = 0; i < nb_args - 2; i++) {
|
for(i = 0; i < nb_args - 2; i++) {
|
||||||
|
@ -4397,8 +4408,6 @@ static void monitor_find_completion_by_table(Monitor *mon,
|
||||||
case 'O':
|
case 'O':
|
||||||
if (!strcmp(cmd->name, "device_add") && nb_args == 2) {
|
if (!strcmp(cmd->name, "device_add") && nb_args == 2) {
|
||||||
device_add_completion(mon->rs, str);
|
device_add_completion(mon->rs, str);
|
||||||
} else if (!strcmp(cmd->name, "object_add") && nb_args == 2) {
|
|
||||||
object_add_completion(mon->rs, str);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
|
@ -4418,8 +4427,6 @@ static void monitor_find_completion_by_table(Monitor *mon,
|
||||||
size_t len = strlen(str);
|
size_t len = strlen(str);
|
||||||
readline_set_completion_index(mon->rs, len);
|
readline_set_completion_index(mon->rs, len);
|
||||||
device_del_completion(mon->rs, sysbus_get_default(), str, len);
|
device_del_completion(mon->rs, sysbus_get_default(), str, len);
|
||||||
} else if (!strcmp(cmd->name, "object_del") && nb_args == 2) {
|
|
||||||
object_del_completion(mon->rs, str);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue