From af4ce882d530d4aa9ed26de3423a36e4a156d0a5 Mon Sep 17 00:00:00 2001 From: Luiz Capitulino Date: Wed, 7 Oct 2009 13:41:52 -0300 Subject: [PATCH] monitor: union for command handlers This commits adds a new union member to mon_cmd_t for command handlers and convert monitor_handle_command() and qemu-monitor.hx to use it. This improves type safety. Patchworks-ID: 35337 Signed-off-by: Luiz Capitulino Signed-off-by: Anthony Liguori --- monitor.c | 9 +--- qemu-monitor.hx | 122 ++++++++++++++++++++++++------------------------ 2 files changed, 63 insertions(+), 68 deletions(-) diff --git a/monitor.c b/monitor.c index c0569d5587..2bf82f3c66 100644 --- a/monitor.c +++ b/monitor.c @@ -71,11 +71,11 @@ typedef struct mon_cmd_t { const char *name; const char *args_type; - void *handler; const char *params; const char *help; union { void (*info)(Monitor *mon); + void (*cmd)(Monitor *mon, const QDict *qdict); } mhandler; } mon_cmd_t; @@ -3014,13 +3014,8 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline) cmd = monitor_parse_command(mon, cmdline, qdict); if (cmd) { - void (*handler)(Monitor *mon, const QDict *qdict); - qemu_errors_to_mon(mon); - - handler = cmd->handler; - handler(mon, qdict); - + cmd->mhandler.cmd(mon, qdict); qemu_errors_to_previous(); } diff --git a/qemu-monitor.hx b/qemu-monitor.hx index cdaf5b7e1d..c689a074cb 100644 --- a/qemu-monitor.hx +++ b/qemu-monitor.hx @@ -12,9 +12,9 @@ ETEXI { .name = "help|?", .args_type = "name:s?", - .handler = do_help_cmd, .params = "[cmd]", .help = "show the help", + .mhandler.cmd = do_help_cmd, }, STEXI @@ -25,9 +25,9 @@ ETEXI { .name = "commit", .args_type = "device:B", - .handler = do_commit, .params = "device|all", .help = "commit changes to the disk images (if -snapshot is used) or backing files", + .mhandler.cmd = do_commit, }, STEXI @@ -38,9 +38,9 @@ ETEXI { .name = "info", .args_type = "item:s?", - .handler = do_info, .params = "[subcommand]", .help = "show various information about the system state", + .mhandler.cmd = do_info, }, STEXI @@ -116,9 +116,9 @@ ETEXI { .name = "q|quit", .args_type = "", - .handler = do_quit, .params = "", .help = "quit the emulator", + .mhandler.cmd = do_quit, }, STEXI @@ -129,9 +129,9 @@ ETEXI { .name = "eject", .args_type = "force:-f,filename:B", - .handler = do_eject, .params = "[-f] device", .help = "eject a removable medium (use -f to force it)", + .mhandler.cmd = do_eject, }, STEXI @@ -142,9 +142,9 @@ ETEXI { .name = "change", .args_type = "device:B,target:F,arg:s?", - .handler = do_change, .params = "device filename [format]", .help = "change a removable medium, optional format", + .mhandler.cmd = do_change, }, STEXI @@ -187,9 +187,9 @@ ETEXI { .name = "screendump", .args_type = "filename:F", - .handler = do_screen_dump, .params = "filename", .help = "save screen into PPM image 'filename'", + .mhandler.cmd = do_screen_dump, }, STEXI @@ -200,9 +200,9 @@ ETEXI { .name = "logfile", .args_type = "filename:F", - .handler = do_logfile, .params = "filename", .help = "output logs to 'filename'", + .mhandler.cmd = do_logfile, }, STEXI @@ -213,9 +213,9 @@ ETEXI { .name = "log", .args_type = "items:s", - .handler = do_log, .params = "item1[,...]", .help = "activate logging of the specified items to '/tmp/qemu.log'", + .mhandler.cmd = do_log, }, STEXI @@ -226,9 +226,9 @@ ETEXI { .name = "savevm", .args_type = "name:s?", - .handler = do_savevm, .params = "[tag|id]", .help = "save a VM snapshot. If no tag or id are provided, a new snapshot is created", + .mhandler.cmd = do_savevm, }, STEXI @@ -242,9 +242,9 @@ ETEXI { .name = "loadvm", .args_type = "name:s", - .handler = do_loadvm, .params = "tag|id", .help = "restore a VM snapshot from its tag or id", + .mhandler.cmd = do_loadvm, }, STEXI @@ -256,9 +256,9 @@ ETEXI { .name = "delvm", .args_type = "name:s", - .handler = do_delvm, .params = "tag|id", .help = "delete a VM snapshot from its tag or id", + .mhandler.cmd = do_delvm, }, STEXI @@ -269,9 +269,9 @@ ETEXI { .name = "singlestep", .args_type = "option:s?", - .handler = do_singlestep, .params = "[on|off]", .help = "run emulation in singlestep mode or switch to normal mode", + .mhandler.cmd = do_singlestep, }, STEXI @@ -283,9 +283,9 @@ ETEXI { .name = "stop", .args_type = "", - .handler = do_stop, .params = "", .help = "stop emulation", + .mhandler.cmd = do_stop, }, STEXI @@ -296,9 +296,9 @@ ETEXI { .name = "c|cont", .args_type = "", - .handler = do_cont, .params = "", .help = "resume emulation", + .mhandler.cmd = do_cont, }, STEXI @@ -309,9 +309,9 @@ ETEXI { .name = "gdbserver", .args_type = "device:s?", - .handler = do_gdbserver, .params = "[device]", .help = "start gdbserver on given device (default 'tcp::1234'), stop with 'none'", + .mhandler.cmd = do_gdbserver, }, STEXI @@ -322,9 +322,9 @@ ETEXI { .name = "x", .args_type = "fmt:/,addr:l", - .handler = do_memory_dump, .params = "/fmt addr", .help = "virtual memory dump starting at 'addr'", + .mhandler.cmd = do_memory_dump, }, STEXI @@ -335,9 +335,9 @@ ETEXI { .name = "xp", .args_type = "fmt:/,addr:l", - .handler = do_physical_memory_dump, .params = "/fmt addr", .help = "physical memory dump starting at 'addr'", + .mhandler.cmd = do_physical_memory_dump, }, STEXI @@ -401,9 +401,9 @@ ETEXI { .name = "p|print", .args_type = "fmt:/,val:l", - .handler = do_print, .params = "/fmt expr", .help = "print expression value (use $reg for CPU register access)", + .mhandler.cmd = do_print, }, STEXI @@ -416,9 +416,9 @@ ETEXI { .name = "i", .args_type = "fmt:/,addr:i,index:i.", - .handler = do_ioport_read, .params = "/fmt addr", .help = "I/O port read", + .mhandler.cmd = do_ioport_read, }, STEXI @@ -428,9 +428,9 @@ ETEXI { .name = "o", .args_type = "fmt:/,addr:i,val:i", - .handler = do_ioport_write, .params = "/fmt addr value", .help = "I/O port write", + .mhandler.cmd = do_ioport_write, }, STEXI @@ -440,9 +440,9 @@ ETEXI { .name = "sendkey", .args_type = "string:s,hold_time:i?", - .handler = do_sendkey, .params = "keys [hold_ms]", .help = "send keys to the VM (e.g. 'sendkey ctrl-alt-f1', default hold time=100 ms)", + .mhandler.cmd = do_sendkey, }, STEXI @@ -462,9 +462,9 @@ ETEXI { .name = "system_reset", .args_type = "", - .handler = do_system_reset, .params = "", .help = "reset the system", + .mhandler.cmd = do_system_reset, }, STEXI @@ -476,9 +476,9 @@ ETEXI { .name = "system_powerdown", .args_type = "", - .handler = do_system_powerdown, .params = "", .help = "send system power down event", + .mhandler.cmd = do_system_powerdown, }, STEXI @@ -490,9 +490,9 @@ ETEXI { .name = "sum", .args_type = "start:i,size:i", - .handler = do_sum, .params = "addr size", .help = "compute the checksum of a memory region", + .mhandler.cmd = do_sum, }, STEXI @@ -504,9 +504,9 @@ ETEXI { .name = "usb_add", .args_type = "devname:s", - .handler = do_usb_add, .params = "device", .help = "add USB device (e.g. 'host:bus.addr' or 'host:vendor_id:product_id')", + .mhandler.cmd = do_usb_add, }, STEXI @@ -519,9 +519,9 @@ ETEXI { .name = "usb_del", .args_type = "devname:s", - .handler = do_usb_del, .params = "device", .help = "remove USB device 'bus.addr'", + .mhandler.cmd = do_usb_del, }, STEXI @@ -535,9 +535,9 @@ ETEXI { .name = "device_add", .args_type = "config:s", - .handler = do_device_add, .params = "device", .help = "add device, like -device on the command line", + .mhandler.cmd = do_device_add, }, STEXI @@ -549,9 +549,9 @@ ETEXI { .name = "device_del", .args_type = "id:s", - .handler = do_device_del, .params = "device", .help = "remove device", + .mhandler.cmd = do_device_del, }, STEXI @@ -563,9 +563,9 @@ ETEXI { .name = "cpu", .args_type = "index:i", - .handler = do_cpu_set, .params = "index", .help = "set the default CPU", + .mhandler.cmd = do_cpu_set, }, STEXI @@ -575,9 +575,9 @@ ETEXI { .name = "mouse_move", .args_type = "dx_str:s,dy_str:s,dz_str:s?", - .handler = do_mouse_move, .params = "dx dy [dz]", .help = "send mouse move events", + .mhandler.cmd = do_mouse_move, }, STEXI @@ -589,9 +589,9 @@ ETEXI { .name = "mouse_button", .args_type = "button_state:i", - .handler = do_mouse_button, .params = "state", .help = "change mouse button state (1=L, 2=M, 4=R)", + .mhandler.cmd = do_mouse_button, }, STEXI @@ -602,9 +602,9 @@ ETEXI { .name = "mouse_set", .args_type = "index:i", - .handler = do_mouse_set, .params = "index", .help = "set which mouse device receives events", + .mhandler.cmd = do_mouse_set, }, STEXI @@ -620,9 +620,9 @@ ETEXI { .name = "wavcapture", .args_type = "path:F,freq:i?,bits:i?,nchannels:i?", - .handler = do_wav_capture, .params = "path [frequency [bits [channels]]]", .help = "capture audio to a wave file (default frequency=44100 bits=16 channels=2)", + .mhandler.cmd = do_wav_capture, }, #endif STEXI @@ -642,9 +642,9 @@ ETEXI { .name = "stopcapture", .args_type = "n:i", - .handler = do_stop_capture, .params = "capture index", .help = "stop capture", + .mhandler.cmd = do_stop_capture, }, #endif STEXI @@ -658,9 +658,9 @@ ETEXI { .name = "memsave", .args_type = "val:l,size:i,filename:s", - .handler = do_memory_save, .params = "addr size file", .help = "save to disk virtual memory dump starting at 'addr' of size 'size'", + .mhandler.cmd = do_memory_save, }, STEXI @@ -671,9 +671,9 @@ ETEXI { .name = "pmemsave", .args_type = "val:l,size:i,filename:s", - .handler = do_physical_memory_save, .params = "addr size file", .help = "save to disk physical memory dump starting at 'addr' of size 'size'", + .mhandler.cmd = do_physical_memory_save, }, STEXI @@ -684,9 +684,9 @@ ETEXI { .name = "boot_set", .args_type = "bootdevice:s", - .handler = do_boot_set, .params = "bootdevice", .help = "define new values for the boot device list", + .mhandler.cmd = do_boot_set, }, STEXI @@ -703,9 +703,9 @@ ETEXI { .name = "nmi", .args_type = "cpu_index:i", - .handler = do_inject_nmi, .params = "cpu", .help = "inject an NMI on the given CPU", + .mhandler.cmd = do_inject_nmi, }, #endif STEXI @@ -716,9 +716,9 @@ ETEXI { .name = "migrate", .args_type = "detach:-d,uri:s", - .handler = do_migrate, .params = "[-d] uri", .help = "migrate to URI (using -d to not wait for completion)", + .mhandler.cmd = do_migrate, }, STEXI @@ -729,9 +729,9 @@ ETEXI { .name = "migrate_cancel", .args_type = "", - .handler = do_migrate_cancel, .params = "", .help = "cancel the current VM migration", + .mhandler.cmd = do_migrate_cancel, }, STEXI @@ -742,9 +742,9 @@ ETEXI { .name = "migrate_set_speed", .args_type = "value:s", - .handler = do_migrate_set_speed, .params = "value", .help = "set maximum speed (in bytes) for migrations", + .mhandler.cmd = do_migrate_set_speed, }, STEXI @@ -755,9 +755,9 @@ ETEXI { .name = "migrate_set_downtime", .args_type = "value:s", - .handler = do_migrate_set_downtime, .params = "value", .help = "set maximum tolerated downtime (in seconds) for migrations", + .mhandler.cmd = do_migrate_set_downtime, }, STEXI @@ -769,13 +769,13 @@ ETEXI { .name = "drive_add", .args_type = "pci_addr:s,opts:s", - .handler = drive_hot_add, .params = "[[:]:]\n" "[file=file][,if=type][,bus=n]\n" "[,unit=m][,media=d][index=i]\n" "[,cyls=c,heads=h,secs=s[,trans=t]]\n" "[snapshot=on|off][,cache=on|off]", .help = "add drive to PCI storage controller", + .mhandler.cmd = drive_hot_add, }, #endif @@ -788,9 +788,9 @@ ETEXI { .name = "pci_add", .args_type = "pci_addr:s,type:s,opts:s?", - .handler = pci_device_hot_add, .params = "auto|[[:]:] nic|storage [[vlan=n][,macaddr=addr][,model=type]] [file=file][,if=type][,bus=nr]...", .help = "hot-add PCI device", + .mhandler.cmd = pci_device_hot_add, }, #endif @@ -803,9 +803,9 @@ ETEXI { .name = "pci_del", .args_type = "pci_addr:s", - .handler = do_pci_device_hot_remove, .params = "[[:]:]", .help = "hot remove PCI device", + .mhandler.cmd = do_pci_device_hot_remove, }, #endif @@ -817,9 +817,9 @@ ETEXI { .name = "host_net_add", .args_type = "device:s,opts:s?", - .handler = net_host_device_add, .params = "tap|user|socket|vde|dump [options]", .help = "add host VLAN client", + .mhandler.cmd = net_host_device_add, }, STEXI @@ -830,9 +830,9 @@ ETEXI { .name = "host_net_remove", .args_type = "vlan_id:i,device:s", - .handler = net_host_device_remove, .params = "vlan_id name", .help = "remove host VLAN client", + .mhandler.cmd = net_host_device_remove, }, STEXI @@ -844,17 +844,17 @@ ETEXI { .name = "hostfwd_add", .args_type = "arg1:s,arg2:s?,arg3:s?", - .handler = net_slirp_hostfwd_add, .params = "[vlan_id name] [tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport", .help = "redirect TCP or UDP connections from host to guest (requires -net user)", + .mhandler.cmd = net_slirp_hostfwd_add, }, { .name = "hostfwd_remove", .args_type = "arg1:s,arg2:s?,arg3:s?", - .handler = net_slirp_hostfwd_remove, .params = "[vlan_id name] [tcp|udp]:[hostaddr]:hostport", .help = "remove host-to-guest TCP or UDP redirection", + .mhandler.cmd = net_slirp_hostfwd_remove, }, #endif @@ -866,9 +866,9 @@ ETEXI { .name = "balloon", .args_type = "value:i", - .handler = do_balloon, .params = "target", .help = "request VM to change it's memory allocation (in MB)", + .mhandler.cmd = do_balloon, }, STEXI @@ -879,9 +879,9 @@ ETEXI { .name = "set_link", .args_type = "name:s,up_or_down:s", - .handler = do_set_link, .params = "name up|down", .help = "change the link status of a network adapter", + .mhandler.cmd = do_set_link, }, STEXI @@ -892,9 +892,9 @@ ETEXI { .name = "watchdog_action", .args_type = "action:s", - .handler = do_watchdog_action, .params = "[reset|shutdown|poweroff|pause|debug|none]", .help = "change watchdog action", + .mhandler.cmd = do_watchdog_action, }, STEXI @@ -905,9 +905,9 @@ ETEXI { .name = "acl_show", .args_type = "aclname:s", - .handler = do_acl_show, .params = "aclname", .help = "list rules in the access control list", + .mhandler.cmd = do_acl_show, }, STEXI @@ -921,9 +921,9 @@ ETEXI { .name = "acl_policy", .args_type = "aclname:s,policy:s", - .handler = do_acl_policy, .params = "aclname allow|deny", .help = "set default access control list policy", + .mhandler.cmd = do_acl_policy, }, STEXI @@ -936,9 +936,9 @@ ETEXI { .name = "acl_add", .args_type = "aclname:s,match:s,policy:s,index:i?", - .handler = do_acl_add, .params = "aclname match allow|deny [index]", .help = "add a match rule to the access control list", + .mhandler.cmd = do_acl_add, }, STEXI @@ -954,9 +954,9 @@ ETEXI { .name = "acl_remove", .args_type = "aclname:s,match:s", - .handler = do_acl_remove, .params = "aclname match", .help = "remove a match rule from the access control list", + .mhandler.cmd = do_acl_remove, }, STEXI @@ -967,9 +967,9 @@ ETEXI { .name = "acl_reset", .args_type = "aclname:s", - .handler = do_acl_reset, .params = "aclname", .help = "reset the access control list", + .mhandler.cmd = do_acl_reset, }, STEXI @@ -983,9 +983,9 @@ ETEXI { .name = "mce", .args_type = "cpu_index:i,bank:i,status:l,mcg_status:l,addr:l,misc:l", - .handler = do_inject_mce, .params = "cpu bank status mcgstatus addr misc", .help = "inject a MCE on the given CPU", + .mhandler.cmd = do_inject_mce, }, #endif @@ -997,9 +997,9 @@ ETEXI { .name = "getfd", .args_type = "fdname:s", - .handler = do_getfd, .params = "getfd name", .help = "receive a file descriptor via SCM rights and assign it a name", + .mhandler.cmd = do_getfd, }, STEXI @@ -1012,9 +1012,9 @@ ETEXI { .name = "closefd", .args_type = "fdname:s", - .handler = do_closefd, .params = "closefd name", .help = "close a file descriptor previously passed via SCM rights", + .mhandler.cmd = do_closefd, }, STEXI