qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH V5 0/6] HMP: allow parsing for sub command
@ 2013-01-11  9:13 Wenchao Xia
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 1/6] HMP: add QDict to info callback handler Wenchao Xia
                   ` (5 more replies)
  0 siblings, 6 replies; 12+ messages in thread
From: Wenchao Xia @ 2013-01-11  9:13 UTC (permalink / raw)
  To: qemu-devel; +Cc: Wenchao Xia, aliguori, armbru, chenwj, lcapitulino

  These patches enhance HMP to allow it parse 2nd level of commands, such
as info sub command list, which means foldered command with parameter is
possible now.

V2:
  Follow the way supposed by Markus, which make the infrastructure knows
there is possible a 2nd level of command exist, instead of a hack. In this
way extention of command folder level is easy.
  Moved function declaration and better doc according to comments.
  Removed the patch about info snapshots, which will goto another serial.
V3:
  Split out code moving patch.
V4:
  Removed change of qmp_find_cmd().
  Removed name change of monitor_parse_command().
v5:
  Eliminate 'info' in mhandler for that it have same format with 'cmd' and info
is not a special case but a sub-command now.
  Split out patch that checking for space before check for sub-command.
  Better comments for monitor_parse_command().
  Add parameter start for better error tips in sub-command case.
  Add comments about how sub_table and mhandler interact.
  Better commit message and tips that "info <unknowns>" show error now.

Wenchao Xia (6):
  HMP: add QDict to info callback handler
  HMP: delete info handler
  HMP: add infrastructure for sub command
  HMP: filter out space before check of sub-command
  HMP: move define of mon_cmds
  HMP: add sub command table to info

 hmp-commands.hx         |    3 +-
 hmp.c                   |   36 ++++----
 hmp.h                   |   36 ++++----
 hw/i8259.c              |    4 +-
 hw/lm32_pic.c           |    4 +-
 hw/lm32_pic.h           |    4 +-
 hw/loader.c             |    2 +-
 hw/loader.h             |    3 +-
 hw/pc.h                 |    4 +-
 hw/pcmcia.h             |    2 +-
 hw/qdev-monitor.c       |    4 +-
 hw/qdev-monitor.h       |    4 +-
 hw/sun4m.c              |    4 +-
 hw/sun4m.h              |    4 +-
 hw/usb.h                |    2 +-
 hw/usb/bus.c            |    2 +-
 hw/usb/host-bsd.c       |    2 +-
 hw/usb/host-linux.c     |    2 +-
 include/net/net.h       |    2 +-
 include/net/slirp.h     |    2 +-
 include/sysemu/sysemu.h |    4 +-
 monitor.c               |  202 ++++++++++++++++++++++++----------------------
 net/net.c               |    2 +-
 net/slirp.c             |    2 +-
 savevm.c                |    2 +-
 vl.c                    |    2 +-
 26 files changed, 175 insertions(+), 165 deletions(-)

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH V5 1/6] HMP: add QDict to info callback handler
  2013-01-11  9:13 [Qemu-devel] [PATCH V5 0/6] HMP: allow parsing for sub command Wenchao Xia
@ 2013-01-11  9:14 ` Wenchao Xia
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 2/6] HMP: delete info handler Wenchao Xia
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Wenchao Xia @ 2013-01-11  9:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Wenchao Xia, aliguori, armbru, chenwj, lcapitulino

  This patch change all info call back function to take
additional QDict * parameter, which allow those command
take parameter. Now it is set to NULL at default case.

Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
 hmp.c                   |   36 ++++++++++++++++++------------------
 hmp.h                   |   36 ++++++++++++++++++------------------
 hw/i8259.c              |    4 ++--
 hw/lm32_pic.c           |    4 ++--
 hw/lm32_pic.h           |    4 ++--
 hw/loader.c             |    2 +-
 hw/loader.h             |    3 ++-
 hw/pc.h                 |    4 ++--
 hw/pcmcia.h             |    2 +-
 hw/qdev-monitor.c       |    4 ++--
 hw/qdev-monitor.h       |    4 ++--
 hw/sun4m.c              |    4 ++--
 hw/sun4m.h              |    4 ++--
 hw/usb.h                |    2 +-
 hw/usb/bus.c            |    2 +-
 hw/usb/host-bsd.c       |    2 +-
 hw/usb/host-linux.c     |    2 +-
 include/net/net.h       |    2 +-
 include/net/slirp.h     |    2 +-
 include/sysemu/sysemu.h |    4 ++--
 monitor.c               |   32 ++++++++++++++++----------------
 net/net.c               |    2 +-
 net/slirp.c             |    2 +-
 savevm.c                |    2 +-
 vl.c                    |    2 +-
 25 files changed, 84 insertions(+), 83 deletions(-)

diff --git a/hmp.c b/hmp.c
index 9e9e624..2465d9b 100644
--- a/hmp.c
+++ b/hmp.c
@@ -31,7 +31,7 @@ static void hmp_handle_error(Monitor *mon, Error **errp)
     }
 }
 
-void hmp_info_name(Monitor *mon)
+void hmp_info_name(Monitor *mon, const QDict *qdict)
 {
     NameInfo *info;
 
@@ -42,7 +42,7 @@ void hmp_info_name(Monitor *mon)
     qapi_free_NameInfo(info);
 }
 
-void hmp_info_version(Monitor *mon)
+void hmp_info_version(Monitor *mon, const QDict *qdict)
 {
     VersionInfo *info;
 
@@ -55,7 +55,7 @@ void hmp_info_version(Monitor *mon)
     qapi_free_VersionInfo(info);
 }
 
-void hmp_info_kvm(Monitor *mon)
+void hmp_info_kvm(Monitor *mon, const QDict *qdict)
 {
     KvmInfo *info;
 
@@ -70,7 +70,7 @@ void hmp_info_kvm(Monitor *mon)
     qapi_free_KvmInfo(info);
 }
 
-void hmp_info_status(Monitor *mon)
+void hmp_info_status(Monitor *mon, const QDict *qdict)
 {
     StatusInfo *info;
 
@@ -89,7 +89,7 @@ void hmp_info_status(Monitor *mon)
     qapi_free_StatusInfo(info);
 }
 
-void hmp_info_uuid(Monitor *mon)
+void hmp_info_uuid(Monitor *mon, const QDict *qdict)
 {
     UuidInfo *info;
 
@@ -98,7 +98,7 @@ void hmp_info_uuid(Monitor *mon)
     qapi_free_UuidInfo(info);
 }
 
-void hmp_info_chardev(Monitor *mon)
+void hmp_info_chardev(Monitor *mon, const QDict *qdict)
 {
     ChardevInfoList *char_info, *info;
 
@@ -111,7 +111,7 @@ void hmp_info_chardev(Monitor *mon)
     qapi_free_ChardevInfoList(char_info);
 }
 
-void hmp_info_mice(Monitor *mon)
+void hmp_info_mice(Monitor *mon, const QDict *qdict)
 {
     MouseInfoList *mice_list, *mouse;
 
@@ -131,7 +131,7 @@ void hmp_info_mice(Monitor *mon)
     qapi_free_MouseInfoList(mice_list);
 }
 
-void hmp_info_migrate(Monitor *mon)
+void hmp_info_migrate(Monitor *mon, const QDict *qdict)
 {
     MigrationInfo *info;
     MigrationCapabilityStatusList *caps, *cap;
@@ -209,7 +209,7 @@ void hmp_info_migrate(Monitor *mon)
     qapi_free_MigrationCapabilityStatusList(caps);
 }
 
-void hmp_info_migrate_capabilities(Monitor *mon)
+void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict)
 {
     MigrationCapabilityStatusList *caps, *cap;
 
@@ -228,13 +228,13 @@ void hmp_info_migrate_capabilities(Monitor *mon)
     qapi_free_MigrationCapabilityStatusList(caps);
 }
 
-void hmp_info_migrate_cache_size(Monitor *mon)
+void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict)
 {
     monitor_printf(mon, "xbzrel cache size: %" PRId64 " kbytes\n",
                    qmp_query_migrate_cache_size(NULL) >> 10);
 }
 
-void hmp_info_cpus(Monitor *mon)
+void hmp_info_cpus(Monitor *mon, const QDict *qdict)
 {
     CpuInfoList *cpu_list, *cpu;
 
@@ -272,7 +272,7 @@ void hmp_info_cpus(Monitor *mon)
     qapi_free_CpuInfoList(cpu_list);
 }
 
-void hmp_info_block(Monitor *mon)
+void hmp_info_block(Monitor *mon, const QDict *qdict)
 {
     BlockInfoList *block_list, *info;
 
@@ -326,7 +326,7 @@ void hmp_info_block(Monitor *mon)
     qapi_free_BlockInfoList(block_list);
 }
 
-void hmp_info_blockstats(Monitor *mon)
+void hmp_info_blockstats(Monitor *mon, const QDict *qdict)
 {
     BlockStatsList *stats_list, *stats;
 
@@ -360,7 +360,7 @@ void hmp_info_blockstats(Monitor *mon)
     qapi_free_BlockStatsList(stats_list);
 }
 
-void hmp_info_vnc(Monitor *mon)
+void hmp_info_vnc(Monitor *mon, const QDict *qdict)
 {
     VncInfo *info;
     Error *err = NULL;
@@ -406,7 +406,7 @@ out:
     qapi_free_VncInfo(info);
 }
 
-void hmp_info_spice(Monitor *mon)
+void hmp_info_spice(Monitor *mon, const QDict *qdict)
 {
     SpiceChannelList *chan;
     SpiceInfo *info;
@@ -453,7 +453,7 @@ out:
     qapi_free_SpiceInfo(info);
 }
 
-void hmp_info_balloon(Monitor *mon)
+void hmp_info_balloon(Monitor *mon, const QDict *qdict)
 {
     BalloonInfo *info;
     Error *err = NULL;
@@ -570,7 +570,7 @@ static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev)
     }
 }
 
-void hmp_info_pci(Monitor *mon)
+void hmp_info_pci(Monitor *mon, const QDict *qdict)
 {
     PciInfoList *info_list, *info;
     Error *err = NULL;
@@ -593,7 +593,7 @@ void hmp_info_pci(Monitor *mon)
     qapi_free_PciInfoList(info_list);
 }
 
-void hmp_info_block_jobs(Monitor *mon)
+void hmp_info_block_jobs(Monitor *mon, const QDict *qdict)
 {
     BlockJobInfoList *list;
     Error *err = NULL;
diff --git a/hmp.h b/hmp.h
index 21f3e05..5cab9c0 100644
--- a/hmp.h
+++ b/hmp.h
@@ -18,24 +18,24 @@
 #include "qapi-types.h"
 #include "qapi/qmp/qdict.h"
 
-void hmp_info_name(Monitor *mon);
-void hmp_info_version(Monitor *mon);
-void hmp_info_kvm(Monitor *mon);
-void hmp_info_status(Monitor *mon);
-void hmp_info_uuid(Monitor *mon);
-void hmp_info_chardev(Monitor *mon);
-void hmp_info_mice(Monitor *mon);
-void hmp_info_migrate(Monitor *mon);
-void hmp_info_migrate_capabilities(Monitor *mon);
-void hmp_info_migrate_cache_size(Monitor *mon);
-void hmp_info_cpus(Monitor *mon);
-void hmp_info_block(Monitor *mon);
-void hmp_info_blockstats(Monitor *mon);
-void hmp_info_vnc(Monitor *mon);
-void hmp_info_spice(Monitor *mon);
-void hmp_info_balloon(Monitor *mon);
-void hmp_info_pci(Monitor *mon);
-void hmp_info_block_jobs(Monitor *mon);
+void hmp_info_name(Monitor *mon, const QDict *qdict);
+void hmp_info_version(Monitor *mon, const QDict *qdict);
+void hmp_info_kvm(Monitor *mon, const QDict *qdict);
+void hmp_info_status(Monitor *mon, const QDict *qdict);
+void hmp_info_uuid(Monitor *mon, const QDict *qdict);
+void hmp_info_chardev(Monitor *mon, const QDict *qdict);
+void hmp_info_mice(Monitor *mon, const QDict *qdict);
+void hmp_info_migrate(Monitor *mon, const QDict *qdict);
+void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict);
+void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict);
+void hmp_info_cpus(Monitor *mon, const QDict *qdict);
+void hmp_info_block(Monitor *mon, const QDict *qdict);
+void hmp_info_blockstats(Monitor *mon, const QDict *qdict);
+void hmp_info_vnc(Monitor *mon, const QDict *qdict);
+void hmp_info_spice(Monitor *mon, const QDict *qdict);
+void hmp_info_balloon(Monitor *mon, const QDict *qdict);
+void hmp_info_pci(Monitor *mon, const QDict *qdict);
+void hmp_info_block_jobs(Monitor *mon, const QDict *qdict);
 void hmp_quit(Monitor *mon, const QDict *qdict);
 void hmp_stop(Monitor *mon, const QDict *qdict);
 void hmp_system_reset(Monitor *mon, const QDict *qdict);
diff --git a/hw/i8259.c b/hw/i8259.c
index 8fc6339..51b4b3c 100644
--- a/hw/i8259.c
+++ b/hw/i8259.c
@@ -407,7 +407,7 @@ static void pic_init(PICCommonState *s)
     qdev_init_gpio_in(&s->dev.qdev, pic_set_irq, 8);
 }
 
-void pic_info(Monitor *mon)
+void pic_info(Monitor *mon, const QDict *qdict)
 {
     int i;
     PICCommonState *s;
@@ -425,7 +425,7 @@ void pic_info(Monitor *mon)
     }
 }
 
-void irq_info(Monitor *mon)
+void irq_info(Monitor *mon, const QDict *qdict)
 {
 #ifndef DEBUG_IRQ_COUNT
     monitor_printf(mon, "irq statistic code not compiled.\n");
diff --git a/hw/lm32_pic.c b/hw/lm32_pic.c
index 42d5602..a327425 100644
--- a/hw/lm32_pic.c
+++ b/hw/lm32_pic.c
@@ -39,7 +39,7 @@ struct LM32PicState {
 typedef struct LM32PicState LM32PicState;
 
 static LM32PicState *pic;
-void lm32_do_pic_info(Monitor *mon)
+void lm32_do_pic_info(Monitor *mon, const QDict *qdict)
 {
     if (pic == NULL) {
         return;
@@ -49,7 +49,7 @@ void lm32_do_pic_info(Monitor *mon)
             pic->im, pic->ip, pic->irq_state);
 }
 
-void lm32_irq_info(Monitor *mon)
+void lm32_irq_info(Monitor *mon, const QDict *qdict)
 {
     int i;
     uint32_t count;
diff --git a/hw/lm32_pic.h b/hw/lm32_pic.h
index 14456f3..5556803 100644
--- a/hw/lm32_pic.h
+++ b/hw/lm32_pic.h
@@ -8,7 +8,7 @@ uint32_t lm32_pic_get_im(DeviceState *d);
 void lm32_pic_set_ip(DeviceState *d, uint32_t ip);
 void lm32_pic_set_im(DeviceState *d, uint32_t im);
 
-void lm32_do_pic_info(Monitor *mon);
-void lm32_irq_info(Monitor *mon);
+void lm32_do_pic_info(Monitor *mon, const QDict *qdict);
+void lm32_irq_info(Monitor *mon, const QDict *qdict);
 
 #endif /* QEMU_HW_LM32_PIC_H */
diff --git a/hw/loader.c b/hw/loader.c
index 3f59fcd..995edc3 100644
--- a/hw/loader.c
+++ b/hw/loader.c
@@ -778,7 +778,7 @@ void *rom_ptr(hwaddr addr)
     return rom->data + (addr - rom->addr);
 }
 
-void do_info_roms(Monitor *mon)
+void do_info_roms(Monitor *mon, const QDict *qdict)
 {
     Rom *rom;
 
diff --git a/hw/loader.h b/hw/loader.h
index 26480ad..5e61c95 100644
--- a/hw/loader.h
+++ b/hw/loader.h
@@ -1,5 +1,6 @@
 #ifndef LOADER_H
 #define LOADER_H
+#include "qapi/qmp/qdict.h"
 
 /* loader.c */
 int get_image_size(const char *filename);
@@ -30,7 +31,7 @@ int rom_load_all(void);
 void rom_set_fw(void *f);
 int rom_copy(uint8_t *dest, hwaddr addr, size_t size);
 void *rom_ptr(hwaddr addr);
-void do_info_roms(Monitor *mon);
+void do_info_roms(Monitor *mon, const QDict *qdict);
 
 #define rom_add_file_fixed(_f, _a, _i)          \
     rom_add_file(_f, NULL, _a, _i)
diff --git a/hw/pc.h b/hw/pc.h
index 4134aa9..fbcf43d 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -40,8 +40,8 @@ qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq);
 qemu_irq *kvm_i8259_init(ISABus *bus);
 int pic_read_irq(DeviceState *d);
 int pic_get_output(DeviceState *d);
-void pic_info(Monitor *mon);
-void irq_info(Monitor *mon);
+void pic_info(Monitor *mon, const QDict *qdict);
+void irq_info(Monitor *mon, const QDict *qdict);
 
 /* Global System Interrupts */
 
diff --git a/hw/pcmcia.h b/hw/pcmcia.h
index aac1d77..f916693 100644
--- a/hw/pcmcia.h
+++ b/hw/pcmcia.h
@@ -14,7 +14,7 @@ typedef struct {
 
 void pcmcia_socket_register(PCMCIASocket *socket);
 void pcmcia_socket_unregister(PCMCIASocket *socket);
-void pcmcia_info(Monitor *mon);
+void pcmcia_info(Monitor *mon, const QDict *qdict);
 
 struct PCMCIACardState {
     void *state;
diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c
index b739867..e0f0075 100644
--- a/hw/qdev-monitor.c
+++ b/hw/qdev-monitor.c
@@ -564,13 +564,13 @@ static void qbus_print(Monitor *mon, BusState *bus, int indent)
 }
 #undef qdev_printf
 
-void do_info_qtree(Monitor *mon)
+void do_info_qtree(Monitor *mon, const QDict *qdict)
 {
     if (sysbus_get_default())
         qbus_print(mon, sysbus_get_default(), 0);
 }
 
-void do_info_qdm(Monitor *mon)
+void do_info_qdm(Monitor *mon, const QDict *qdict)
 {
     object_class_foreach(qdev_print_devinfo, TYPE_DEVICE, false, NULL);
 }
diff --git a/hw/qdev-monitor.h b/hw/qdev-monitor.h
index fae1b1e..9ec4850 100644
--- a/hw/qdev-monitor.h
+++ b/hw/qdev-monitor.h
@@ -6,8 +6,8 @@
 
 /*** monitor commands ***/
 
-void do_info_qtree(Monitor *mon);
-void do_info_qdm(Monitor *mon);
+void do_info_qtree(Monitor *mon, const QDict *qdict);
+void do_info_qdm(Monitor *mon, const QDict *qdict);
 int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data);
 int do_device_del(Monitor *mon, const QDict *qdict, QObject **ret_data);
 int qdev_device_help(QemuOpts *opts);
diff --git a/hw/sun4m.c b/hw/sun4m.c
index 0d84b37..db23671 100644
--- a/hw/sun4m.c
+++ b/hw/sun4m.c
@@ -216,13 +216,13 @@ static void nvram_init(M48t59State *nvram, uint8_t *macaddr,
 
 static DeviceState *slavio_intctl;
 
-void sun4m_pic_info(Monitor *mon)
+void sun4m_pic_info(Monitor *mon, const QDict *qdict)
 {
     if (slavio_intctl)
         slavio_pic_info(mon, slavio_intctl);
 }
 
-void sun4m_irq_info(Monitor *mon)
+void sun4m_irq_info(Monitor *mon, const QDict *qdict)
 {
     if (slavio_intctl)
         slavio_irq_info(mon, slavio_intctl);
diff --git a/hw/sun4m.h b/hw/sun4m.h
index 47eb945..0361eee 100644
--- a/hw/sun4m.h
+++ b/hw/sun4m.h
@@ -27,8 +27,8 @@ void slavio_pic_info(Monitor *mon, DeviceState *dev);
 void slavio_irq_info(Monitor *mon, DeviceState *dev);
 
 /* sun4m.c */
-void sun4m_pic_info(Monitor *mon);
-void sun4m_irq_info(Monitor *mon);
+void sun4m_pic_info(Monitor *mon, const QDict *qdict);
+void sun4m_irq_info(Monitor *mon, const QDict *qdict);
 
 /* sparc32_dma.c */
 #include "sparc32_dma.h"
diff --git a/hw/usb.h b/hw/usb.h
index 50c297f..bc42639 100644
--- a/hw/usb.h
+++ b/hw/usb.h
@@ -435,7 +435,7 @@ int set_usb_string(uint8_t *buf, const char *str);
 /* usb-linux.c */
 USBDevice *usb_host_device_open(USBBus *bus, const char *devname);
 int usb_host_device_close(const char *devname);
-void usb_host_info(Monitor *mon);
+void usb_host_info(Monitor *mon, const QDict *qdict);
 
 /* usb-bt.c */
 USBDevice *usb_bt_init(USBBus *bus, HCIInfo *hci);
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index 180d1d7..01b7ac0 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -542,7 +542,7 @@ static char *usb_get_fw_dev_path(DeviceState *qdev)
     return fw_path;
 }
 
-void usb_info(Monitor *mon)
+void usb_info(Monitor *mon, const QDict *qdict)
 {
     USBBus *bus;
     USBDevice *dev;
diff --git a/hw/usb/host-bsd.c b/hw/usb/host-bsd.c
index 340c21a..bed54c6 100644
--- a/hw/usb/host-bsd.c
+++ b/hw/usb/host-bsd.c
@@ -633,7 +633,7 @@ static int usb_host_info_device(void *opaque,
     return 0;
 }
 
-void usb_host_info(Monitor *mon)
+void usb_host_info(Monitor *mon, const QDict *qdict)
 {
     usb_host_scan(mon, usb_host_info_device);
 }
diff --git a/hw/usb/host-linux.c b/hw/usb/host-linux.c
index 669fbd2..cdacc54 100644
--- a/hw/usb/host-linux.c
+++ b/hw/usb/host-linux.c
@@ -1998,7 +1998,7 @@ static void hex2str(int val, char *str, size_t size)
     }
 }
 
-void usb_host_info(Monitor *mon)
+void usb_host_info(Monitor *mon, const QDict *qdict)
 {
     struct USBAutoFilter *f;
     struct USBHostDevice *s;
diff --git a/include/net/net.h b/include/net/net.h
index de42dd7..4a92b6c 100644
--- a/include/net/net.h
+++ b/include/net/net.h
@@ -112,7 +112,7 @@ ssize_t qemu_deliver_packet_iov(NetClientState *sender,
                             void *opaque);
 
 void print_net_client(Monitor *mon, NetClientState *nc);
-void do_info_network(Monitor *mon);
+void do_info_network(Monitor *mon, const QDict *qdict);
 
 /* NIC info */
 
diff --git a/include/net/slirp.h b/include/net/slirp.h
index 54b655c..0502389 100644
--- a/include/net/slirp.h
+++ b/include/net/slirp.h
@@ -40,7 +40,7 @@ int net_slirp_parse_legacy(QemuOptsList *opts_list, const char *optarg, int *ret
 
 int net_slirp_smb(const char *exported_dir);
 
-void do_info_usernet(Monitor *mon);
+void do_info_usernet(Monitor *mon, const QDict *qdict);
 
 #endif
 
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 28a783e..a7fd0be 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -68,7 +68,7 @@ void qemu_add_machine_init_done_notifier(Notifier *notify);
 void do_savevm(Monitor *mon, const QDict *qdict);
 int load_vmstate(const char *name);
 void do_delvm(Monitor *mon, const QDict *qdict);
-void do_info_snapshots(Monitor *mon);
+void do_info_snapshots(Monitor *mon, const QDict *qdict);
 
 void qemu_announce_self(void);
 
@@ -171,7 +171,7 @@ extern CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
 
 void do_usb_add(Monitor *mon, const QDict *qdict);
 void do_usb_del(Monitor *mon, const QDict *qdict);
-void usb_info(Monitor *mon);
+void usb_info(Monitor *mon, const QDict *qdict);
 
 void rtc_change_mon_event(struct tm *tm);
 
diff --git a/monitor.c b/monitor.c
index 9cf419b..c7b3014 100644
--- a/monitor.c
+++ b/monitor.c
@@ -123,7 +123,7 @@ typedef struct mon_cmd_t {
     const char *help;
     void (*user_print)(Monitor *mon, const QObject *data);
     union {
-        void (*info)(Monitor *mon);
+        void (*info)(Monitor *mon, const QDict *qdict);
         void (*cmd)(Monitor *mon, const QDict *qdict);
         int  (*cmd_new)(Monitor *mon, const QDict *params, QObject **ret_data);
         int  (*cmd_async)(Monitor *mon, const QDict *params,
@@ -824,7 +824,7 @@ static void do_info(Monitor *mon, const QDict *qdict)
         goto help;
     }
 
-    cmd->mhandler.info(mon);
+    cmd->mhandler.info(mon, NULL);
     return;
 
 help:
@@ -895,19 +895,19 @@ int monitor_get_cpu_index(void)
     return mon_get_cpu()->cpu_index;
 }
 
-static void do_info_registers(Monitor *mon)
+static void do_info_registers(Monitor *mon, const QDict *qdict)
 {
     CPUArchState *env;
     env = mon_get_cpu();
     cpu_dump_state(env, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU);
 }
 
-static void do_info_jit(Monitor *mon)
+static void do_info_jit(Monitor *mon, const QDict *qdict)
 {
     dump_exec_info((FILE *)mon, monitor_fprintf);
 }
 
-static void do_info_history(Monitor *mon)
+static void do_info_history(Monitor *mon, const QDict *qdict)
 {
     int i;
     const char *str;
@@ -926,7 +926,7 @@ static void do_info_history(Monitor *mon)
 
 #if defined(TARGET_PPC)
 /* XXX: not implemented in other targets */
-static void do_info_cpu_stats(Monitor *mon)
+static void do_info_cpu_stats(Monitor *mon, const QDict *qdict)
 {
     CPUArchState *env;
 
@@ -935,7 +935,7 @@ static void do_info_cpu_stats(Monitor *mon)
 }
 #endif
 
-static void do_trace_print_events(Monitor *mon)
+static void do_trace_print_events(Monitor *mon, const QDict *qdict)
 {
     trace_print_events((FILE *)mon, &monitor_fprintf);
 }
@@ -1487,7 +1487,7 @@ static void tlb_info_64(Monitor *mon, CPUArchState *env)
 }
 #endif
 
-static void tlb_info(Monitor *mon)
+static void tlb_info(Monitor *mon, const QDict *qdict)
 {
     CPUArchState *env;
 
@@ -1710,7 +1710,7 @@ static void mem_info_64(Monitor *mon, CPUArchState *env)
 }
 #endif
 
-static void mem_info(Monitor *mon)
+static void mem_info(Monitor *mon, const QDict *qdict)
 {
     CPUArchState *env;
 
@@ -1749,7 +1749,7 @@ static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
                    tlb->d, tlb->wt);
 }
 
-static void tlb_info(Monitor *mon)
+static void tlb_info(Monitor *mon, const QDict *qdict)
 {
     CPUArchState *env = mon_get_cpu();
     int i;
@@ -1765,7 +1765,7 @@ static void tlb_info(Monitor *mon)
 #endif
 
 #if defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_XTENSA)
-static void tlb_info(Monitor *mon)
+static void tlb_info(Monitor *mon, const QDict *qdict)
 {
     CPUArchState *env1 = mon_get_cpu();
 
@@ -1773,12 +1773,12 @@ static void tlb_info(Monitor *mon)
 }
 #endif
 
-static void do_info_mtree(Monitor *mon)
+static void do_info_mtree(Monitor *mon, const QDict *qdict)
 {
     mtree_info((fprintf_function)monitor_printf, mon);
 }
 
-static void do_info_numa(Monitor *mon)
+static void do_info_numa(Monitor *mon, const QDict *qdict)
 {
     int i;
     CPUArchState *env;
@@ -1802,7 +1802,7 @@ static void do_info_numa(Monitor *mon)
 int64_t qemu_time;
 int64_t dev_time;
 
-static void do_info_profile(Monitor *mon)
+static void do_info_profile(Monitor *mon, const QDict *qdict)
 {
     int64_t total;
     total = qemu_time;
@@ -1816,7 +1816,7 @@ static void do_info_profile(Monitor *mon)
     dev_time = 0;
 }
 #else
-static void do_info_profile(Monitor *mon)
+static void do_info_profile(Monitor *mon, const QDict *qdict)
 {
     monitor_printf(mon, "Internal profiler not compiled\n");
 }
@@ -1825,7 +1825,7 @@ static void do_info_profile(Monitor *mon)
 /* Capture support */
 static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
 
-static void do_info_capture(Monitor *mon)
+static void do_info_capture(Monitor *mon, const QDict *qdict)
 {
     int i;
     CaptureState *s;
diff --git a/net/net.c b/net/net.c
index dbf3e1b..354d292 100644
--- a/net/net.c
+++ b/net/net.c
@@ -852,7 +852,7 @@ void print_net_client(Monitor *mon, NetClientState *nc)
                    NetClientOptionsKind_lookup[nc->info->type], nc->info_str);
 }
 
-void do_info_network(Monitor *mon)
+void do_info_network(Monitor *mon, const QDict *qdict)
 {
     NetClientState *nc, *peer;
     NetClientOptionsKind type;
diff --git a/net/slirp.c b/net/slirp.c
index c14259f..4df550f 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -670,7 +670,7 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str,
     return -1;
 }
 
-void do_info_usernet(Monitor *mon)
+void do_info_usernet(Monitor *mon, const QDict *qdict)
 {
     SlirpState *s;
 
diff --git a/savevm.c b/savevm.c
index 529d60e..021420f 100644
--- a/savevm.c
+++ b/savevm.c
@@ -2333,7 +2333,7 @@ void do_delvm(Monitor *mon, const QDict *qdict)
     }
 }
 
-void do_info_snapshots(Monitor *mon)
+void do_info_snapshots(Monitor *mon, const QDict *qdict)
 {
     BlockDriverState *bs, *bs1;
     QEMUSnapshotInfo *sn_tab, *sn, s, *sn_info = &s;
diff --git a/vl.c b/vl.c
index 79e5122..085e950 100644
--- a/vl.c
+++ b/vl.c
@@ -1263,7 +1263,7 @@ void pcmcia_socket_unregister(PCMCIASocket *socket)
         }
 }
 
-void pcmcia_info(Monitor *mon)
+void pcmcia_info(Monitor *mon, const QDict *qdict)
 {
     struct pcmcia_socket_entry_s *iter;
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH V5 2/6] HMP: delete info handler
  2013-01-11  9:13 [Qemu-devel] [PATCH V5 0/6] HMP: allow parsing for sub command Wenchao Xia
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 1/6] HMP: add QDict to info callback handler Wenchao Xia
@ 2013-01-11  9:14 ` Wenchao Xia
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 3/6] HMP: add infrastructure for sub command Wenchao Xia
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Wenchao Xia @ 2013-01-11  9:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Wenchao Xia, aliguori, armbru, chenwj, lcapitulino

  Now cmd and info handler have same format, so delete info handler.

Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
 monitor.c |   91 ++++++++++++++++++++++++++++++-------------------------------
 1 files changed, 45 insertions(+), 46 deletions(-)

diff --git a/monitor.c b/monitor.c
index c7b3014..359f333 100644
--- a/monitor.c
+++ b/monitor.c
@@ -123,7 +123,6 @@ typedef struct mon_cmd_t {
     const char *help;
     void (*user_print)(Monitor *mon, const QObject *data);
     union {
-        void (*info)(Monitor *mon, const QDict *qdict);
         void (*cmd)(Monitor *mon, const QDict *qdict);
         int  (*cmd_new)(Monitor *mon, const QDict *params, QObject **ret_data);
         int  (*cmd_async)(Monitor *mon, const QDict *params,
@@ -824,7 +823,7 @@ static void do_info(Monitor *mon, const QDict *qdict)
         goto help;
     }
 
-    cmd->mhandler.info(mon, NULL);
+    cmd->mhandler.cmd(mon, NULL);
     return;
 
 help:
@@ -2434,63 +2433,63 @@ static mon_cmd_t info_cmds[] = {
         .args_type  = "",
         .params     = "",
         .help       = "show the version of QEMU",
-        .mhandler.info = hmp_info_version,
+        .mhandler.cmd = hmp_info_version,
     },
     {
         .name       = "network",
         .args_type  = "",
         .params     = "",
         .help       = "show the network state",
-        .mhandler.info = do_info_network,
+        .mhandler.cmd = do_info_network,
     },
     {
         .name       = "chardev",
         .args_type  = "",
         .params     = "",
         .help       = "show the character devices",
-        .mhandler.info = hmp_info_chardev,
+        .mhandler.cmd = hmp_info_chardev,
     },
     {
         .name       = "block",
         .args_type  = "",
         .params     = "",
         .help       = "show the block devices",
-        .mhandler.info = hmp_info_block,
+        .mhandler.cmd = hmp_info_block,
     },
     {
         .name       = "blockstats",
         .args_type  = "",
         .params     = "",
         .help       = "show block device statistics",
-        .mhandler.info = hmp_info_blockstats,
+        .mhandler.cmd = hmp_info_blockstats,
     },
     {
         .name       = "block-jobs",
         .args_type  = "",
         .params     = "",
         .help       = "show progress of ongoing block device operations",
-        .mhandler.info = hmp_info_block_jobs,
+        .mhandler.cmd = hmp_info_block_jobs,
     },
     {
         .name       = "registers",
         .args_type  = "",
         .params     = "",
         .help       = "show the cpu registers",
-        .mhandler.info = do_info_registers,
+        .mhandler.cmd = do_info_registers,
     },
     {
         .name       = "cpus",
         .args_type  = "",
         .params     = "",
         .help       = "show infos for each CPU",
-        .mhandler.info = hmp_info_cpus,
+        .mhandler.cmd = hmp_info_cpus,
     },
     {
         .name       = "history",
         .args_type  = "",
         .params     = "",
         .help       = "show the command line history",
-        .mhandler.info = do_info_history,
+        .mhandler.cmd = do_info_history,
     },
 #if defined(TARGET_I386) || defined(TARGET_PPC) || defined(TARGET_MIPS) || \
     defined(TARGET_LM32) || (defined(TARGET_SPARC) && !defined(TARGET_SPARC64))
@@ -2500,11 +2499,11 @@ static mon_cmd_t info_cmds[] = {
         .params     = "",
         .help       = "show the interrupts statistics (if available)",
 #ifdef TARGET_SPARC
-        .mhandler.info = sun4m_irq_info,
+        .mhandler.cmd = sun4m_irq_info,
 #elif defined(TARGET_LM32)
-        .mhandler.info = lm32_irq_info,
+        .mhandler.cmd = lm32_irq_info,
 #else
-        .mhandler.info = irq_info,
+        .mhandler.cmd = irq_info,
 #endif
     },
     {
@@ -2513,11 +2512,11 @@ static mon_cmd_t info_cmds[] = {
         .params     = "",
         .help       = "show i8259 (PIC) state",
 #ifdef TARGET_SPARC
-        .mhandler.info = sun4m_pic_info,
+        .mhandler.cmd = sun4m_pic_info,
 #elif defined(TARGET_LM32)
-        .mhandler.info = lm32_do_pic_info,
+        .mhandler.cmd = lm32_do_pic_info,
 #else
-        .mhandler.info = pic_info,
+        .mhandler.cmd = pic_info,
 #endif
     },
 #endif
@@ -2526,7 +2525,7 @@ static mon_cmd_t info_cmds[] = {
         .args_type  = "",
         .params     = "",
         .help       = "show PCI info",
-        .mhandler.info = hmp_info_pci,
+        .mhandler.cmd = hmp_info_pci,
     },
 #if defined(TARGET_I386) || defined(TARGET_SH4) || defined(TARGET_SPARC) || \
     defined(TARGET_PPC) || defined(TARGET_XTENSA)
@@ -2535,7 +2534,7 @@ static mon_cmd_t info_cmds[] = {
         .args_type  = "",
         .params     = "",
         .help       = "show virtual to physical memory mappings",
-        .mhandler.info = tlb_info,
+        .mhandler.cmd = tlb_info,
     },
 #endif
 #if defined(TARGET_I386)
@@ -2544,7 +2543,7 @@ static mon_cmd_t info_cmds[] = {
         .args_type  = "",
         .params     = "",
         .help       = "show the active virtual memory mappings",
-        .mhandler.info = mem_info,
+        .mhandler.cmd = mem_info,
     },
 #endif
     {
@@ -2552,91 +2551,91 @@ static mon_cmd_t info_cmds[] = {
         .args_type  = "",
         .params     = "",
         .help       = "show memory tree",
-        .mhandler.info = do_info_mtree,
+        .mhandler.cmd = do_info_mtree,
     },
     {
         .name       = "jit",
         .args_type  = "",
         .params     = "",
         .help       = "show dynamic compiler info",
-        .mhandler.info = do_info_jit,
+        .mhandler.cmd = do_info_jit,
     },
     {
         .name       = "kvm",
         .args_type  = "",
         .params     = "",
         .help       = "show KVM information",
-        .mhandler.info = hmp_info_kvm,
+        .mhandler.cmd = hmp_info_kvm,
     },
     {
         .name       = "numa",
         .args_type  = "",
         .params     = "",
         .help       = "show NUMA information",
-        .mhandler.info = do_info_numa,
+        .mhandler.cmd = do_info_numa,
     },
     {
         .name       = "usb",
         .args_type  = "",
         .params     = "",
         .help       = "show guest USB devices",
-        .mhandler.info = usb_info,
+        .mhandler.cmd = usb_info,
     },
     {
         .name       = "usbhost",
         .args_type  = "",
         .params     = "",
         .help       = "show host USB devices",
-        .mhandler.info = usb_host_info,
+        .mhandler.cmd = usb_host_info,
     },
     {
         .name       = "profile",
         .args_type  = "",
         .params     = "",
         .help       = "show profiling information",
-        .mhandler.info = do_info_profile,
+        .mhandler.cmd = do_info_profile,
     },
     {
         .name       = "capture",
         .args_type  = "",
         .params     = "",
         .help       = "show capture information",
-        .mhandler.info = do_info_capture,
+        .mhandler.cmd = do_info_capture,
     },
     {
         .name       = "snapshots",
         .args_type  = "",
         .params     = "",
         .help       = "show the currently saved VM snapshots",
-        .mhandler.info = do_info_snapshots,
+        .mhandler.cmd = do_info_snapshots,
     },
     {
         .name       = "status",
         .args_type  = "",
         .params     = "",
         .help       = "show the current VM status (running|paused)",
-        .mhandler.info = hmp_info_status,
+        .mhandler.cmd = hmp_info_status,
     },
     {
         .name       = "pcmcia",
         .args_type  = "",
         .params     = "",
         .help       = "show guest PCMCIA status",
-        .mhandler.info = pcmcia_info,
+        .mhandler.cmd = pcmcia_info,
     },
     {
         .name       = "mice",
         .args_type  = "",
         .params     = "",
         .help       = "show which guest mouse is receiving events",
-        .mhandler.info = hmp_info_mice,
+        .mhandler.cmd = hmp_info_mice,
     },
     {
         .name       = "vnc",
         .args_type  = "",
         .params     = "",
         .help       = "show the vnc server status",
-        .mhandler.info = hmp_info_vnc,
+        .mhandler.cmd = hmp_info_vnc,
     },
 #if defined(CONFIG_SPICE)
     {
@@ -2644,7 +2643,7 @@ static mon_cmd_t info_cmds[] = {
         .args_type  = "",
         .params     = "",
         .help       = "show the spice server status",
-        .mhandler.info = hmp_info_spice,
+        .mhandler.cmd = hmp_info_spice,
     },
 #endif
     {
@@ -2652,14 +2651,14 @@ static mon_cmd_t info_cmds[] = {
         .args_type  = "",
         .params     = "",
         .help       = "show the current VM name",
-        .mhandler.info = hmp_info_name,
+        .mhandler.cmd = hmp_info_name,
     },
     {
         .name       = "uuid",
         .args_type  = "",
         .params     = "",
         .help       = "show the current VM UUID",
-        .mhandler.info = hmp_info_uuid,
+        .mhandler.cmd = hmp_info_uuid,
     },
 #if defined(TARGET_PPC)
     {
@@ -2667,7 +2666,7 @@ static mon_cmd_t info_cmds[] = {
         .args_type  = "",
         .params     = "",
         .help       = "show CPU statistics",
-        .mhandler.info = do_info_cpu_stats,
+        .mhandler.cmd = do_info_cpu_stats,
     },
 #endif
 #if defined(CONFIG_SLIRP)
@@ -2676,7 +2675,7 @@ static mon_cmd_t info_cmds[] = {
         .args_type  = "",
         .params     = "",
         .help       = "show user network stack connection states",
-        .mhandler.info = do_info_usernet,
+        .mhandler.cmd = do_info_usernet,
     },
 #endif
     {
@@ -2684,56 +2683,56 @@ static mon_cmd_t info_cmds[] = {
         .args_type  = "",
         .params     = "",
         .help       = "show migration status",
-        .mhandler.info = hmp_info_migrate,
+        .mhandler.cmd = hmp_info_migrate,
     },
     {
         .name       = "migrate_capabilities",
         .args_type  = "",
         .params     = "",
         .help       = "show current migration capabilities",
-        .mhandler.info = hmp_info_migrate_capabilities,
+        .mhandler.cmd = hmp_info_migrate_capabilities,
     },
     {
         .name       = "migrate_cache_size",
         .args_type  = "",
         .params     = "",
         .help       = "show current migration xbzrle cache size",
-        .mhandler.info = hmp_info_migrate_cache_size,
+        .mhandler.cmd = hmp_info_migrate_cache_size,
     },
     {
         .name       = "balloon",
         .args_type  = "",
         .params     = "",
         .help       = "show balloon information",
-        .mhandler.info = hmp_info_balloon,
+        .mhandler.cmd = hmp_info_balloon,
     },
     {
         .name       = "qtree",
         .args_type  = "",
         .params     = "",
         .help       = "show device tree",
-        .mhandler.info = do_info_qtree,
+        .mhandler.cmd = do_info_qtree,
     },
     {
         .name       = "qdm",
         .args_type  = "",
         .params     = "",
         .help       = "show qdev device model list",
-        .mhandler.info = do_info_qdm,
+        .mhandler.cmd = do_info_qdm,
     },
     {
         .name       = "roms",
         .args_type  = "",
         .params     = "",
         .help       = "show roms",
-        .mhandler.info = do_info_roms,
+        .mhandler.cmd = do_info_roms,
     },
     {
         .name       = "trace-events",
         .args_type  = "",
         .params     = "",
         .help       = "show available trace-events & their state",
-        .mhandler.info = do_trace_print_events,
+        .mhandler.cmd = do_trace_print_events,
     },
     {
         .name       = NULL,
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH V5 3/6] HMP: add infrastructure for sub command
  2013-01-11  9:13 [Qemu-devel] [PATCH V5 0/6] HMP: allow parsing for sub command Wenchao Xia
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 1/6] HMP: add QDict to info callback handler Wenchao Xia
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 2/6] HMP: delete info handler Wenchao Xia
@ 2013-01-11  9:14 ` Wenchao Xia
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 4/6] HMP: filter out space before check of sub-command Wenchao Xia
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Wenchao Xia @ 2013-01-11  9:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Wenchao Xia, aliguori, armbru, chenwj, lcapitulino

  This patch make parsing of hmp command aware of that it may
have sub command. Also discard simple encapsulation function
monitor_find_command().

Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
 monitor.c |   48 +++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 37 insertions(+), 11 deletions(-)

diff --git a/monitor.c b/monitor.c
index 359f333..5435dc3 100644
--- a/monitor.c
+++ b/monitor.c
@@ -129,6 +129,11 @@ typedef struct mon_cmd_t {
                           MonitorCompletion *cb, void *opaque);
     } mhandler;
     int flags;
+    /* @sub_table is a list of 2nd level of commands. If it do not exist,
+     * mhandler should be used. If it exist, sub_table[?].mhandler should be
+     * used, and mhandler of 1st level plays the role of help function.
+     */
+    struct mon_cmd_t *sub_table;
 } mon_cmd_t;
 
 /* file descriptors passed via SCM_RIGHTS */
@@ -3533,21 +3538,30 @@ static const mon_cmd_t *search_dispatch_table(const mon_cmd_t *disp_table,
     return NULL;
 }
 
-static const mon_cmd_t *monitor_find_command(const char *cmdname)
-{
-    return search_dispatch_table(mon_cmds, cmdname);
-}
-
 static const mon_cmd_t *qmp_find_cmd(const char *cmdname)
 {
     return search_dispatch_table(qmp_cmds, cmdname);
 }
 
+/*
+ * Parse @cmdline according to command table @table.
+ * If @cmdline is blank, return NULL.
+ * If it can't be parsed, report to @mon, and return NULL.
+ * Else, insert command arguments into @qdict, and return the command.
+ * If sub-command table exist, and if @cmdline contains addtional string for
+ * sub-command, this function will try search sub-command table. if no
+ * addtional string for sub-command exist, this function will return the found
+ * one in @table.
+ * Do not assume the returned command points into @table!  It doesn't
+ * when the command is a sub-command.
+ */
 static const mon_cmd_t *monitor_parse_command(Monitor *mon,
                                               const char *cmdline,
+                                              int start,
+                                              mon_cmd_t *table,
                                               QDict *qdict)
 {
-    const char *p, *typestr;
+    const char *p, *p1, *typestr;
     int c;
     const mon_cmd_t *cmd;
     char cmdname[256];
@@ -3555,20 +3569,32 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
     char *key;
 
 #ifdef DEBUG
-    monitor_printf(mon, "command='%s'\n", cmdline);
+    monitor_printf(mon, "command='%s', start='%d'\n", cmdline, start);
 #endif
 
     /* extract the command name */
-    p = get_command_name(cmdline, cmdname, sizeof(cmdname));
+    p = get_command_name(cmdline + start, cmdname, sizeof(cmdname));
     if (!p)
         return NULL;
 
-    cmd = monitor_find_command(cmdname);
+    cmd = search_dispatch_table(table, cmdname);
     if (!cmd) {
-        monitor_printf(mon, "unknown command: '%s'\n", cmdname);
+        monitor_printf(mon, "unknown command: '%.*s'\n",
+                       (int)(p - cmdline), cmdline);
         return NULL;
     }
 
+    /* search sub command */
+    if (cmd->sub_table != NULL) {
+        p1 = p;
+        /* check if user set additional command */
+        if (*p1 == '\0') {
+            return cmd;
+        }
+        return monitor_parse_command(mon, cmdline, p1 - cmdline,
+                                     cmd->sub_table, qdict);
+    }
+
     /* parse the parameters */
     typestr = cmd->args_type;
     for(;;) {
@@ -3924,7 +3950,7 @@ static void handle_user_command(Monitor *mon, const char *cmdline)
 
     qdict = qdict_new();
 
-    cmd = monitor_parse_command(mon, cmdline, qdict);
+    cmd = monitor_parse_command(mon, cmdline, 0, mon_cmds, qdict);
     if (!cmd)
         goto out;
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH V5 4/6] HMP: filter out space before check of sub-command
  2013-01-11  9:13 [Qemu-devel] [PATCH V5 0/6] HMP: allow parsing for sub command Wenchao Xia
                   ` (2 preceding siblings ...)
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 3/6] HMP: add infrastructure for sub command Wenchao Xia
@ 2013-01-11  9:14 ` Wenchao Xia
  2013-01-11 20:12   ` Luiz Capitulino
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 5/6] HMP: move define of mon_cmds Wenchao Xia
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 6/6] HMP: add sub command table to info Wenchao Xia
  5 siblings, 1 reply; 12+ messages in thread
From: Wenchao Xia @ 2013-01-11  9:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Wenchao Xia, aliguori, armbru, chenwj, lcapitulino

  This fix the case when user input "@command ". Original
it will return NULL for monitor_parse_command(), now
it will return the @command related instance.

Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
 monitor.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/monitor.c b/monitor.c
index 5435dc3..7b752a2 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3588,6 +3588,9 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
     if (cmd->sub_table != NULL) {
         p1 = p;
         /* check if user set additional command */
+        while (qemu_isspace(*p1)) {
+            p1++;
+        }
         if (*p1 == '\0') {
             return cmd;
         }
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH V5 5/6] HMP: move define of mon_cmds
  2013-01-11  9:13 [Qemu-devel] [PATCH V5 0/6] HMP: allow parsing for sub command Wenchao Xia
                   ` (3 preceding siblings ...)
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 4/6] HMP: filter out space before check of sub-command Wenchao Xia
@ 2013-01-11  9:14 ` Wenchao Xia
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 6/6] HMP: add sub command table to info Wenchao Xia
  5 siblings, 0 replies; 12+ messages in thread
From: Wenchao Xia @ 2013-01-11  9:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Wenchao Xia, aliguori, armbru, chenwj, lcapitulino

  Because mon_cmds may use info_cmds, so adjust the declare sequence
of them.

Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
 monitor.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/monitor.c b/monitor.c
index 7b752a2..f6cb659 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2425,12 +2425,6 @@ int monitor_handle_fd_param(Monitor *mon, const char *fdname)
     return fd;
 }
 
-/* mon_cmds and info_cmds would be sorted at runtime */
-static mon_cmd_t mon_cmds[] = {
-#include "hmp-commands.h"
-    { NULL, NULL, },
-};
-
 /* Please update hmp-commands.hx when adding or changing commands */
 static mon_cmd_t info_cmds[] = {
     {
@@ -2744,6 +2738,12 @@ static mon_cmd_t info_cmds[] = {
     },
 };
 
+/* mon_cmds and info_cmds would be sorted at runtime */
+static mon_cmd_t mon_cmds[] = {
+#include "hmp-commands.h"
+    { NULL, NULL, },
+};
+
 static const mon_cmd_t qmp_cmds[] = {
 #include "qmp-commands-old.h"
     { /* NULL */ },
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH V5 6/6] HMP: add sub command table to info
  2013-01-11  9:13 [Qemu-devel] [PATCH V5 0/6] HMP: allow parsing for sub command Wenchao Xia
                   ` (4 preceding siblings ...)
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 5/6] HMP: move define of mon_cmds Wenchao Xia
@ 2013-01-11  9:14 ` Wenchao Xia
  5 siblings, 0 replies; 12+ messages in thread
From: Wenchao Xia @ 2013-01-11  9:14 UTC (permalink / raw)
  To: qemu-devel; +Cc: Wenchao Xia, aliguori, armbru, chenwj, lcapitulino

  Now info command takes a table of sub info commands,
and changed do_info() to do_info_help() to do help funtion
only.
 Note that now "info <unknown-topic>" returns error instead
of list of info topics.

Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
 hmp-commands.hx |    3 ++-
 monitor.c       |   22 +---------------------
 2 files changed, 3 insertions(+), 22 deletions(-)

diff --git a/hmp-commands.hx b/hmp-commands.hx
index 010b8c9..87a411a 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -1489,7 +1489,8 @@ ETEXI
         .args_type  = "item:s?",
         .params     = "[subcommand]",
         .help       = "show various information about the system state",
-        .mhandler.cmd = do_info,
+        .mhandler.cmd = do_info_help,
+        .sub_table = info_cmds,
     },
 
 STEXI
diff --git a/monitor.c b/monitor.c
index f6cb659..d186532 100644
--- a/monitor.c
+++ b/monitor.c
@@ -810,28 +810,8 @@ static void user_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd,
     }
 }
 
-static void do_info(Monitor *mon, const QDict *qdict)
+static void do_info_help(Monitor *mon, const QDict *qdict)
 {
-    const mon_cmd_t *cmd;
-    const char *item = qdict_get_try_str(qdict, "item");
-
-    if (!item) {
-        goto help;
-    }
-
-    for (cmd = info_cmds; cmd->name != NULL; cmd++) {
-        if (compare_cmd(item, cmd->name))
-            break;
-    }
-
-    if (cmd->name == NULL) {
-        goto help;
-    }
-
-    cmd->mhandler.cmd(mon, NULL);
-    return;
-
-help:
     help_cmd(mon, "info");
 }
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH V5 4/6] HMP: filter out space before check of sub-command
  2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 4/6] HMP: filter out space before check of sub-command Wenchao Xia
@ 2013-01-11 20:12   ` Luiz Capitulino
  2013-01-14  2:11     ` Wenchao Xia
  0 siblings, 1 reply; 12+ messages in thread
From: Luiz Capitulino @ 2013-01-11 20:12 UTC (permalink / raw)
  To: Wenchao Xia; +Cc: aliguori, qemu-devel, chenwj, armbru

On Fri, 11 Jan 2013 17:14:03 +0800
Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote:

>   This fix the case when user input "@command ". Original
> it will return NULL for monitor_parse_command(), now
> it will return the @command related instance.
> 
> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
> ---
>  monitor.c |    3 +++
>  1 files changed, 3 insertions(+), 0 deletions(-)
> 
> diff --git a/monitor.c b/monitor.c
> index 5435dc3..7b752a2 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -3588,6 +3588,9 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
>      if (cmd->sub_table != NULL) {
>          p1 = p;
>          /* check if user set additional command */
> +        while (qemu_isspace(*p1)) {
> +            p1++;
> +        }

Is there a reason for this to be in a different patch? I mean, why don't
you squash this into the previous patch?

Actually, I guess that you could skip the spaces after the
search_dispatch_table() call (using p) and drop p1. But please test it
before doing so :)

Otherwise series looks good to me.

>          if (*p1 == '\0') {
>              return cmd;
>          }

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH V5 4/6] HMP: filter out space before check of sub-command
  2013-01-11 20:12   ` Luiz Capitulino
@ 2013-01-14  2:11     ` Wenchao Xia
  2013-01-14 13:46       ` Markus Armbruster
  0 siblings, 1 reply; 12+ messages in thread
From: Wenchao Xia @ 2013-01-14  2:11 UTC (permalink / raw)
  To: Luiz Capitulino; +Cc: aliguori, qemu-devel, chenwj, armbru

于 2013-1-12 4:12, Luiz Capitulino 写道:
> On Fri, 11 Jan 2013 17:14:03 +0800
> Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote:
>
>>    This fix the case when user input "@command ". Original
>> it will return NULL for monitor_parse_command(), now
>> it will return the @command related instance.
>>
>> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
>> ---
>>   monitor.c |    3 +++
>>   1 files changed, 3 insertions(+), 0 deletions(-)
>>
>> diff --git a/monitor.c b/monitor.c
>> index 5435dc3..7b752a2 100644
>> --- a/monitor.c
>> +++ b/monitor.c
>> @@ -3588,6 +3588,9 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
>>       if (cmd->sub_table != NULL) {
>>           p1 = p;
>>           /* check if user set additional command */
>> +        while (qemu_isspace(*p1)) {
>> +            p1++;
>> +        }
>
> Is there a reason for this to be in a different patch? I mean, why don't
> you squash this into the previous patch?
>
   Markus suggest to do it and I think this make things clear. I am OK
to merge it and drop p1.

> Actually, I guess that you could skip the spaces after the
> search_dispatch_table() call (using p) and drop p1. But please test it
> before doing so :)
>
> Otherwise series looks good to me.
>
>>           if (*p1 == '\0') {
>>               return cmd;
>>           }
>


-- 
Best Regards

Wenchao Xia

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH V5 4/6] HMP: filter out space before check of sub-command
  2013-01-14  2:11     ` Wenchao Xia
@ 2013-01-14 13:46       ` Markus Armbruster
  2013-01-14 15:33         ` Luiz Capitulino
  2013-01-15  3:06         ` Wenchao Xia
  0 siblings, 2 replies; 12+ messages in thread
From: Markus Armbruster @ 2013-01-14 13:46 UTC (permalink / raw)
  To: Wenchao Xia; +Cc: aliguori, qemu-devel, chenwj, Luiz Capitulino

Wenchao Xia <xiawenc@linux.vnet.ibm.com> writes:

> 于 2013-1-12 4:12, Luiz Capitulino 写道:
>> On Fri, 11 Jan 2013 17:14:03 +0800
>> Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote:
>>
>>>    This fix the case when user input "@command ". Original
>>> it will return NULL for monitor_parse_command(), now
>>> it will return the @command related instance.
>>>
>>> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
>>> ---
>>>   monitor.c |    3 +++
>>>   1 files changed, 3 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/monitor.c b/monitor.c
>>> index 5435dc3..7b752a2 100644
>>> --- a/monitor.c
>>> +++ b/monitor.c
>>> @@ -3588,6 +3588,9 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
>>>       if (cmd->sub_table != NULL) {
>>>           p1 = p;
>>>           /* check if user set additional command */
>>> +        while (qemu_isspace(*p1)) {
>>> +            p1++;
>>> +        }
>>
>> Is there a reason for this to be in a different patch? I mean, why don't
>> you squash this into the previous patch?
>>
>   Markus suggest to do it

Misunderstanding, sorry.  My point was we skip over whitespace twice:
first here, and then again in monitor_parse_command().  Quote:

    The check whether non-space characters follow is awkward.  We need
    it only because we want to handle "@cmdline is blank" differently
    than "it can't be parsed", but monitor_parse_command() returns NULL
    for both cases.

Merely an observation, not a request to do anything about it in this
series:

    If we care, we can try to do better in a follow-up patch.

A possible way to do better is to have a handler for command "", to be
invoked for entirely blank lines.  In table info_cmds, the handler would
be do_info_help.  Then prefix commands don't need their handler anymore
(it's in the sub_table), and sub_table can go into the mhandler union.

We'd need to suppress the "unknown command" error for cmdname "".

If this isn't clear, but you want to understand it, I can write a patch
on top.

>                           and I think this make things clear. I am OK
> to merge it and drop p1.

I'm not sure it makes things clearer.  It makes behavior of "info"
without argument change twice in the series, though, in the preceding
patch, and in this one.  I think I agree with Luiz it's better to squash
the two together again.

[...]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH V5 4/6] HMP: filter out space before check of sub-command
  2013-01-14 13:46       ` Markus Armbruster
@ 2013-01-14 15:33         ` Luiz Capitulino
  2013-01-15  3:06         ` Wenchao Xia
  1 sibling, 0 replies; 12+ messages in thread
From: Luiz Capitulino @ 2013-01-14 15:33 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: aliguori, Wenchao Xia, chenwj, qemu-devel

On Mon, 14 Jan 2013 14:46:35 +0100
Markus Armbruster <armbru@redhat.com> wrote:

> Wenchao Xia <xiawenc@linux.vnet.ibm.com> writes:
> 
> > 于 2013-1-12 4:12, Luiz Capitulino 写道:
> >> On Fri, 11 Jan 2013 17:14:03 +0800
> >> Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote:
> >>
> >>>    This fix the case when user input "@command ". Original
> >>> it will return NULL for monitor_parse_command(), now
> >>> it will return the @command related instance.
> >>>
> >>> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
> >>> ---
> >>>   monitor.c |    3 +++
> >>>   1 files changed, 3 insertions(+), 0 deletions(-)
> >>>
> >>> diff --git a/monitor.c b/monitor.c
> >>> index 5435dc3..7b752a2 100644
> >>> --- a/monitor.c
> >>> +++ b/monitor.c
> >>> @@ -3588,6 +3588,9 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
> >>>       if (cmd->sub_table != NULL) {
> >>>           p1 = p;
> >>>           /* check if user set additional command */
> >>> +        while (qemu_isspace(*p1)) {
> >>> +            p1++;
> >>> +        }
> >>
> >> Is there a reason for this to be in a different patch? I mean, why don't
> >> you squash this into the previous patch?
> >>
> >   Markus suggest to do it
> 
> Misunderstanding, sorry.  My point was we skip over whitespace twice:
> first here, and then again in monitor_parse_command().  Quote:

That was my point in my second paragraph (which cut out).

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH V5 4/6] HMP: filter out space before check of sub-command
  2013-01-14 13:46       ` Markus Armbruster
  2013-01-14 15:33         ` Luiz Capitulino
@ 2013-01-15  3:06         ` Wenchao Xia
  1 sibling, 0 replies; 12+ messages in thread
From: Wenchao Xia @ 2013-01-15  3:06 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: aliguori, qemu-devel, chenwj, Luiz Capitulino

于 2013-1-14 21:46, Markus Armbruster 写道:
> Wenchao Xia <xiawenc@linux.vnet.ibm.com> writes:
>
>> 于 2013-1-12 4:12, Luiz Capitulino 写道:
>>> On Fri, 11 Jan 2013 17:14:03 +0800
>>> Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote:
>>>
>>>>     This fix the case when user input "@command ". Original
>>>> it will return NULL for monitor_parse_command(), now
>>>> it will return the @command related instance.
>>>>
>>>> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
>>>> ---
>>>>    monitor.c |    3 +++
>>>>    1 files changed, 3 insertions(+), 0 deletions(-)
>>>>
>>>> diff --git a/monitor.c b/monitor.c
>>>> index 5435dc3..7b752a2 100644
>>>> --- a/monitor.c
>>>> +++ b/monitor.c
>>>> @@ -3588,6 +3588,9 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
>>>>        if (cmd->sub_table != NULL) {
>>>>            p1 = p;
>>>>            /* check if user set additional command */
>>>> +        while (qemu_isspace(*p1)) {
>>>> +            p1++;
>>>> +        }
>>>
>>> Is there a reason for this to be in a different patch? I mean, why don't
>>> you squash this into the previous patch?
>>>
>>    Markus suggest to do it
>
> Misunderstanding, sorry.  My point was we skip over whitespace twice:
> first here, and then again in monitor_parse_command().  Quote:
>
>      The check whether non-space characters follow is awkward.  We need
>      it only because we want to handle "@cmdline is blank" differently
>      than "it can't be parsed", but monitor_parse_command() returns NULL
>      for both cases.
>
> Merely an observation, not a request to do anything about it in this
> series:
>
>      If we care, we can try to do better in a follow-up patch.
>
> A possible way to do better is to have a handler for command "", to be
> invoked for entirely blank lines.  In table info_cmds, the handler would
> be do_info_help.  Then prefix commands don't need their handler anymore
> (it's in the sub_table), and sub_table can go into the mhandler union.
>
   Thanks for the declaration. Have a handler for command "" seems good,
but need a careful check about the parsing code since '\0' is a key
value. *sub_table plays an extra role of tagging if it have sub-commands
so I think it is better to not folder it into mhandler union.

> We'd need to suppress the "unknown command" error for cmdname "".
>
> If this isn't clear, but you want to understand it, I can write a patch
> on top.
>
>>                            and I think this make things clear. I am OK
>> to merge it and drop p1.
>
> I'm not sure it makes things clearer.  It makes behavior of "info"
> without argument change twice in the series, though, in the preceding
> patch, and in this one.  I think I agree with Luiz it's better to squash
> the two together again.
>
> [...]
>


-- 
Best Regards

Wenchao Xia

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2013-01-15  3:07 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-11  9:13 [Qemu-devel] [PATCH V5 0/6] HMP: allow parsing for sub command Wenchao Xia
2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 1/6] HMP: add QDict to info callback handler Wenchao Xia
2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 2/6] HMP: delete info handler Wenchao Xia
2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 3/6] HMP: add infrastructure for sub command Wenchao Xia
2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 4/6] HMP: filter out space before check of sub-command Wenchao Xia
2013-01-11 20:12   ` Luiz Capitulino
2013-01-14  2:11     ` Wenchao Xia
2013-01-14 13:46       ` Markus Armbruster
2013-01-14 15:33         ` Luiz Capitulino
2013-01-15  3:06         ` Wenchao Xia
2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 5/6] HMP: move define of mon_cmds Wenchao Xia
2013-01-11  9:14 ` [Qemu-devel] [PATCH V5 6/6] HMP: add sub command table to info Wenchao Xia

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).