qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] monitor: print help for command errors


From: Bandan Das
Subject: [Qemu-devel] [PATCH] monitor: print help for command errors
Date: Tue, 12 May 2015 17:37:09 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4 (gnu/linux)

Unlike machines, humans will be (mostly) appreciative on seeing
help output when a command fails due to incorrect syntax or input.
By default, print output of help_cmd() to the monitor in such cases.
The only exceptions are if a command does not exist or parsing
failed for some other reason.

Before:
(qemu) drive_add usb_flash_drive
drive_add: string expected
After:
(qemu) drive_add usb_flash_drive
drive_add: string expected
Usage:
drive_add [[<domain>:]<bus>:]<slot>
[file=file][,if=type][,bus=n]
[,unit=m][,media=d][,index=i]
[,cyls=c,heads=h,secs=s[,trans=t]]
[,snapshot=on|off][,cache=on|off]
[,readonly=on|off][,copy-on-read=on|off] -- add drive to PCI storage controller

Signed-off-by: Bandan Das <address@hidden>
---
 monitor.c | 28 +++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/monitor.c b/monitor.c
index b2561e1..37f00d9 100644
--- a/monitor.c
+++ b/monitor.c
@@ -939,7 +939,7 @@ static int qmp_async_cmd_handler(Monitor *mon, const 
mon_cmd_t *cmd,
     return cmd->mhandler.cmd_async(mon, params, qmp_monitor_complete, mon);
 }
 
-static void user_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd,
+static int user_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd,
                                    const QDict *params)
 {
     int ret;
@@ -954,6 +954,8 @@ static void user_async_cmd_handler(Monitor *mon, const 
mon_cmd_t *cmd,
         monitor_resume(mon);
         g_free(cb_data);
     }
+
+    return ret;
 }
 
 static void hmp_info_help(Monitor *mon, const QDict *qdict)
@@ -3698,7 +3700,8 @@ static const mon_cmd_t *monitor_parse_command(Monitor 
*mon,
                                               const char *cmdline,
                                               int start,
                                               mon_cmd_t *table,
-                                              QDict *qdict)
+                                              QDict *qdict,
+                                              int *failed)
 {
     const char *p, *typestr;
     int c;
@@ -3734,7 +3737,7 @@ static const mon_cmd_t *monitor_parse_command(Monitor 
*mon,
             return cmd;
         }
         return monitor_parse_command(mon, cmdline, p - cmdline,
-                                     cmd->sub_table, qdict);
+                                     cmd->sub_table, qdict, failed);
     }
 
     /* parse the parameters */
@@ -4084,8 +4087,9 @@ static const mon_cmd_t *monitor_parse_command(Monitor 
*mon,
     return cmd;
 
 fail:
+    *failed = 1;
     g_free(key);
-    return NULL;
+    return cmd;
 }
 
 void monitor_set_error(Monitor *mon, QError *qerror)
@@ -4114,20 +4118,22 @@ static void handle_user_command(Monitor *mon, const 
char *cmdline)
 {
     QDict *qdict;
     const mon_cmd_t *cmd;
+    int failed = 0;
 
     qdict = qdict_new();
 
-    cmd = monitor_parse_command(mon, cmdline, 0, mon->cmd_table, qdict);
-    if (!cmd)
+    cmd = monitor_parse_command(mon, cmdline, 0, mon->cmd_table,
+                                qdict, &failed);
+    if (!cmd || failed) {
         goto out;
+    }
 
     if (handler_is_async(cmd)) {
-        user_async_cmd_handler(mon, cmd, qdict);
+        failed = user_async_cmd_handler(mon, cmd, qdict);
     } else if (handler_is_qobject(cmd)) {
         QObject *data = NULL;
 
-        /* XXX: ignores the error code */
-        cmd->mhandler.cmd_new(mon, qdict, &data);
+        failed = cmd->mhandler.cmd_new(mon, qdict, &data);
         assert(!monitor_has_error(mon));
         if (data) {
             cmd->user_print(mon, data);
@@ -4138,6 +4144,10 @@ static void handle_user_command(Monitor *mon, const char 
*cmdline)
     }
 
 out:
+    if (failed && cmd) {
+        monitor_printf(mon, "Usage:\n");
+        help_cmd(mon, cmd->name);
+    }
     QDECREF(qdict);
 }
 
-- 
2.1.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]