Also, use it instead of using hard-coded values. Signed-off-by: Hani Benhabiles <h...@linux.com> --- Should have been part of the last monitor completion series, but better late then never. :)
hw/watchdog/watchdog.c | 35 +++++++++++++++++++---------------- include/sysemu/watchdog.h | 6 ++++++ monitor.c | 19 ++++++++++++------- 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/hw/watchdog/watchdog.c b/hw/watchdog/watchdog.c index f28161b..3bea6fe 100644 --- a/hw/watchdog/watchdog.c +++ b/hw/watchdog/watchdog.c @@ -39,6 +39,16 @@ static int watchdog_action = WDT_RESET; static QLIST_HEAD(watchdog_list, WatchdogTimerModel) watchdog_list; +struct watchdog_action watchdog_actions[] = { + { "reset", WDT_RESET }, + { "shutdown", WDT_SHUTDOWN }, + { "poweroff", WDT_POWEROFF }, + { "pause", WDT_PAUSE }, + { "debug", WDT_DEBUG }, + { "none", WDT_NONE }, + { NULL, 0 }, +}; + void watchdog_add_model(WatchdogTimerModel *model) { QLIST_INSERT_HEAD(&watchdog_list, model, entry); @@ -83,22 +93,15 @@ int select_watchdog(const char *p) int select_watchdog_action(const char *p) { - if (strcasecmp(p, "reset") == 0) - watchdog_action = WDT_RESET; - else if (strcasecmp(p, "shutdown") == 0) - watchdog_action = WDT_SHUTDOWN; - else if (strcasecmp(p, "poweroff") == 0) - watchdog_action = WDT_POWEROFF; - else if (strcasecmp(p, "pause") == 0) - watchdog_action = WDT_PAUSE; - else if (strcasecmp(p, "debug") == 0) - watchdog_action = WDT_DEBUG; - else if (strcasecmp(p, "none") == 0) - watchdog_action = WDT_NONE; - else - return -1; - - return 0; + int i; + + for (i = 0; watchdog_actions[i].name; i++) { + if (!strcasecmp(p, watchdog_actions[i].name)) { + watchdog_action = watchdog_actions[i].action; + return 0; + } + } + return -1; } static void watchdog_mon_event(const char *action) diff --git a/include/sysemu/watchdog.h b/include/sysemu/watchdog.h index 3e9a970..2bfe2fc 100644 --- a/include/sysemu/watchdog.h +++ b/include/sysemu/watchdog.h @@ -34,6 +34,12 @@ struct WatchdogTimerModel { }; typedef struct WatchdogTimerModel WatchdogTimerModel; +struct watchdog_action { + const char *name; + int action; +}; +extern struct watchdog_action watchdog_actions[]; + /* in hw/watchdog.c */ int select_watchdog(const char *p); int select_watchdog_action(const char *action); diff --git a/monitor.c b/monitor.c index ee9390f..57d23c6 100644 --- a/monitor.c +++ b/monitor.c @@ -4562,16 +4562,21 @@ void netdev_del_completion(ReadLineState *rs, int nb_args, const char *str) void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str) { + int i; + size_t len; + if (nb_args != 2) { return; } - readline_set_completion_index(rs, strlen(str)); - add_completion_option(rs, str, "reset"); - add_completion_option(rs, str, "shutdown"); - add_completion_option(rs, str, "poweroff"); - add_completion_option(rs, str, "pause"); - add_completion_option(rs, str, "debug"); - add_completion_option(rs, str, "none"); + len = strlen(str); + readline_set_completion_index(rs, len); + for (i = 0; watchdog_actions[i].name; i++) { + const char *name = watchdog_actions[i].name; + + if (!strncmp(str, name, len)) { + readline_add_completion(rs, name); + } + } } void migrate_set_capability_completion(ReadLineState *rs, int nb_args, -- 1.8.3.2