diff options
Diffstat (limited to 'clients/cli/general.c')
-rw-r--r-- | clients/cli/general.c | 61 |
1 files changed, 52 insertions, 9 deletions
diff --git a/clients/cli/general.c b/clients/cli/general.c index 512ec2919..70a40f1ca 100644 --- a/clients/cli/general.c +++ b/clients/cli/general.c @@ -632,6 +632,23 @@ show_general_logging (NmCli *nmc) return TRUE; } +static void +nmc_complete_strings_nocase (const char *prefix, ...) +{ + va_list args; + const char *candidate; + int len; + + len = strlen (prefix); + + va_start (args, prefix); + while ((candidate = va_arg (args, const char *))) { + if (strncasecmp (prefix, candidate, len) == 0) + g_print ("%s\n", candidate); + } + va_end (args); +} + static NMCResultCode do_general_logging (NmCli *nmc, int argc, char **argv) { @@ -652,19 +669,45 @@ do_general_logging (NmCli *nmc, int argc, char **argv) /* arguments provided -> set logging level and domains */ const char *level = NULL; const char *domains = NULL; - nmc_arg_t exp_args[] = { {"level", TRUE, &level, TRUE}, - {"domains", TRUE, &domains, TRUE}, - {NULL} }; - /* TODO: nmc_parse_args needs completion */ + do { + if (argc == 1 && nmc->complete) + nmc_complete_strings (*argv, "level", "domains", NULL); + + if (matches (*argv, "level") == 0) { + if (next_arg (&argc, &argv) != 0) { + g_string_printf (nmc->return_text, _("Error: '%s' argument is missing."), *(argv-1)); + return NMC_RESULT_ERROR_USER_INPUT; + } + if (argc == 1 && nmc->complete) { + nmc_complete_strings_nocase (*argv, "TRACE", "DEBUG", "INFO", "WARN", + "ERR", "OFF", "KEEP", NULL); + } + level = *argv; + } else if (matches (*argv, "domains") == 0) { + if (next_arg (&argc, &argv) != 0) { + g_string_printf (nmc->return_text, _("Error: '%s' argument is missing."), *(argv-1)); + return NMC_RESULT_ERROR_USER_INPUT; + } + if (argc == 1 && nmc->complete) { + nmc_complete_strings_nocase (*argv, "PLATFORM", "RFKILL", "ETHER", "WIFI", "BT", + "MB", "DHCP4", "DHCP6", "PPP", "WIFI_SCAN", "IP4", + "IP6", "AUTOIP4", "DNS", "VPN", "SHARING", "SUPPLICANT", + "AGENTS", "SETTINGS", "SUSPEND", "CORE", "DEVICE", "OLPC", + "INFINIBAND", "FIREWALL", "ADSL", "BOND", "VLAN", "BRIDGE", + "DBUS_PROPS", "TEAM", "CONCHECK", "DCB", "DISPATCH", "AUDIT", + "SYSTEMD", "VPN_PLUGIN", "PROXY", NULL); + } + domains = *argv; + } else { + g_string_printf (nmc->return_text, _("Error: property '%s' is not known."), *argv); + return NMC_RESULT_ERROR_USER_INPUT; + } + } while (next_arg (&argc, &argv) == 0); + if (nmc->complete) return nmc->return_value; - if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, &error)) { - g_string_assign (nmc->return_text, error->message); - return error->code; - } - nm_client_set_logging (nmc->client, level, domains, &error); if (error) { g_string_printf (nmc->return_text, _("Error: failed to set logging: %s"), |