cli: use next_arg() on argument boundary

Shift argc and argc manually between argument ant its value and use
next_arg() between arguments everywhere. Whill be useful to parse global
arguments.
This commit is contained in:
Lubomir Rintel 2017-03-24 14:00:25 +01:00
parent 29af644f9a
commit 16902a2be6
6 changed files with 144 additions and 72 deletions

View file

@ -1753,8 +1753,10 @@ nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, char
c->usage ();
g_simple_async_result_complete_in_idle (simple);
g_object_unref (simple);
} else
call_cmd (nmc, simple, c, argc-1, argv+1);
} else {
next_arg (nmc, &argc, &argv);
call_cmd (nmc, simple, c, argc, argv);
}
} else if (cmd) {
/* Not a known command. */
if (nmc_arg_is_help (cmd) && c->usage) {

View file

@ -1713,11 +1713,13 @@ get_connection (NmCli *nmc, int *argc, char ***argv, int *pos, GError **error)
|| strcmp (**argv, "uuid") == 0
|| strcmp (**argv, "path") == 0) {
selector = **argv;
if (next_arg (argc, argv) != 0) {
if (!*argc) {
g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
_("%s argument is missing"), selector);
return NULL;
}
(*argc)--;
(*argv)++;
}
connections = nm_client_get_connections (nmc->client);
@ -1764,11 +1766,13 @@ do_connections_show (NmCli *nmc, int argc, char **argv)
show_secrets = TRUE;
next_arg (&argc, &argv);
} else if (!order && nmc_arg_is_option (*argv, "order")) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_set_error_literal (&err, NMCLI_ERROR, 0,
_("'--order' argument is missing"));
goto finish;
}
argc--;
argv++;
/* TODO: complete --order */
order = parse_preferred_connection_order (*argv, &err);
if (err)
@ -1856,7 +1860,7 @@ do_connections_show (NmCli *nmc, int argc, char **argv)
|| strcmp (*argv, "path") == 0
|| strcmp (*argv, "apath") == 0) {
selector = *argv;
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
@ -2596,31 +2600,37 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
nmc_complete_strings (*argv, "ifname", "ap", "passwd-file", NULL);
if (strcmp (*argv, "ifname") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
ifname = *argv;
if (argc == 1 && nmc->complete)
nmc_complete_device (nmc->client, ifname, ap != NULL);
}
else if (strcmp (*argv, "ap") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
ap = *argv;
if (argc == 1 && nmc->complete)
nmc_complete_bssid (nmc->client, ifname, ap);
}
else if (strcmp (*argv, "passwd-file") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
nmc->return_value = NMC_RESULT_COMPLETE_FILE;
@ -2630,8 +2640,7 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
g_printerr (_("Unknown parameter: %s\n"), *argv);
}
argc--;
argv++;
next_arg (&argc, &argv);
}
if (nmc->complete)
@ -2787,11 +2796,13 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
|| strcmp (*arg_ptr, "apath") == 0) {
selector = *arg_ptr;
if (next_arg (&arg_num, &arg_ptr) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), selector);
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
argc--;
argv++;
}
connections = nm_client_get_connections (nmc->client);
@ -4501,7 +4512,8 @@ get_value (const char **value, int *argc, char ***argv, const char *option, GErr
else
*value = *argv[0];
next_arg (argc, argv);
(*argc)--;
(*argv)++;
return TRUE;
}
@ -4565,7 +4577,8 @@ nmc_read_connection_properties (NmCli *nmc,
return FALSE;
}
next_arg (argc, argv);
(*argc)--;
(*argv)++;
if (!get_value (&value, argc, argv, option, error))
return FALSE;
@ -4604,7 +4617,8 @@ nmc_read_connection_properties (NmCli *nmc,
if (*argc == 1 && nmc->complete)
complete_property_name (nmc, connection, modifier, option, NULL);
next_arg (argc, argv);
(*argc)--;
(*argv)++;
if (!get_value (&value, argc, argv, option, error))
return FALSE;
@ -4947,13 +4961,15 @@ read_properties:
/* It would be better if "save" was a separate argument and not
* mixed with properties, but there's not much we can do about it now. */
g_clear_error (&error);
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text,
_("Error: value for '%s' argument is required."),
"save");
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
argc--;
argv++;
if (!nmc_string_to_bool (*argv, &save_bool, &error)) {
g_string_printf (nmc->return_text, _("Error: 'save': %s."),
error->message);
@ -8586,12 +8602,14 @@ do_connection_import (NmCli *nmc, int argc, char **argv)
}
if (strcmp (*argv, "type") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
nmc_complete_vpn_service (*argv);
@ -8601,11 +8619,13 @@ do_connection_import (NmCli *nmc, int argc, char **argv)
g_printerr (_("Warning: 'type' already specified, ignoring extra one.\n"));
} else if (strcmp (*argv, "file") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
nmc->return_value = NMC_RESULT_COMPLETE_FILE;
if (!filename)
@ -8618,8 +8638,7 @@ do_connection_import (NmCli *nmc, int argc, char **argv)
goto finish;
}
argc--;
argv++;
next_arg (&argc, &argv);
}
if (nmc->complete)
@ -8721,10 +8740,11 @@ do_connection_export (NmCli *nmc, int argc, char **argv)
if (nmc->complete)
return nmc->return_value;
if (next_arg (&argc, &argv) == 0)
if (argc) {
out_name = *argv;
else if (nmc->ask)
out_name = out_name_ask = nmc_readline (_("Output file name: "));
argc--;
argv++;
}
if (next_arg (argc_ptr, argv_ptr) == 0) {
g_string_printf (nmc->return_text, _("Error: unknown extra argument: '%s'."), *argv);
@ -8732,6 +8752,9 @@ do_connection_export (NmCli *nmc, int argc, char **argv)
goto finish;
}
if (out_name == NULL && nmc->ask)
out_name = out_name_ask = nmc_readline (_("Output file name: "));
type = nm_connection_get_connection_type (connection);
if (g_strcmp0 (type, NM_SETTING_VPN_SETTING_NAME) != 0) {
g_string_printf (nmc->return_text, _("Error: the connection is not VPN."));

View file

@ -1496,8 +1496,7 @@ do_devices_status (NmCli *nmc, int argc, char **argv)
while (argc > 0) {
g_printerr (_("Unknown parameter: %s\n"), *argv);
argc--;
argv++;
next_arg (&argc, &argv);
}
if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0)
@ -2290,8 +2289,7 @@ do_device_set (NmCli *nmc, int argc, char **argv)
gs_free_error GError *error = NULL;
if (argc >= 1 && g_strcmp0 (*argv, "ifname") == 0) {
argc--;
argv++;
next_arg (&argc, &argv);
}
device = get_device (nmc, &argc, &argv, &error);
@ -2313,10 +2311,12 @@ do_device_set (NmCli *nmc, int argc, char **argv)
nmc_complete_strings (*argv, "managed", "autoconnect", NULL);
if (matches (*argv, "managed")) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: '%s' argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
nmc_complete_bool (*argv);
if (!nmc_string_to_bool (*argv, &flag, &error)) {
@ -2328,10 +2328,12 @@ do_device_set (NmCli *nmc, int argc, char **argv)
values[DEV_SET_MANAGED].value = flag;
}
else if (matches (*argv, "autoconnect")) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: '%s' argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
nmc_complete_bool (*argv);
if (!nmc_string_to_bool (*argv, &flag, &error)) {
@ -2632,18 +2634,22 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv)
nmc_complete_strings (*argv, "ifname", "bssid", NULL);
if (strcmp (*argv, "ifname") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
ifname = *argv;
complete_device (devices, ifname, TRUE);
} else if (strcmp (*argv, "bssid") == 0 || strcmp (*argv, "hwaddr") == 0) {
/* hwaddr is deprecated and will be removed later */
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
bssid_user = *argv;
if (argc == 1 && nmc->complete)
complete_aps (devices, NULL, bssid_user, NULL);
@ -2651,8 +2657,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv)
g_printerr (_("Unknown parameter: %s\n"), *argv);
}
argc--;
argv++;
next_arg (&argc, &argv);
}
if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0)
@ -2849,8 +2854,7 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv)
if (argc == 1 && nmc->complete)
complete_aps (devices, NULL, param_user, param_user);
argc--;
argv++;
next_arg (&argc, &argv);
} else {
/* nmc_do_cmd() should not call this with argc=0. */
g_assert (!nmc->complete);
@ -2875,7 +2879,7 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv)
}
if (strcmp (*argv, "ifname") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
@ -2883,11 +2887,13 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv)
ifname = *argv;
complete_device (devices, ifname, TRUE);
} else if (strcmp (*argv, "bssid") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
argc--;
argv++;
bssid = *argv;
if (argc == 1 && nmc->complete)
complete_aps (devices, NULL, bssid, NULL);
@ -2899,18 +2905,22 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv)
goto finish;
}
} else if (strcmp (*argv, "password") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
argc--;
argv++;
password = *argv;
} else if (strcmp (*argv, "wep-key-type") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
nmc_complete_strings (*argv, "key", "phrase", NULL);
if (strcmp (*argv, "key") == 0)
@ -2925,19 +2935,23 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv)
goto finish;
}
} else if (strcmp (*argv, "name") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
argc--;
argv++;
con_name = *argv;
} else if (strcmp (*argv, "private") == 0) {
GError *err_tmp = NULL;
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
nmc_complete_bool (*argv);
if (!nmc_string_to_bool (*argv, &private, &err_tmp)) {
@ -2948,11 +2962,13 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv)
}
} else if (strcmp (*argv, "hidden") == 0) {
GError *err_tmp = NULL;
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
nmc_complete_bool (*argv);
if (!nmc_string_to_bool (*argv, &hidden, &err_tmp)) {
@ -2965,8 +2981,7 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv)
g_printerr (_("Unknown parameter: %s\n"), *argv);
}
argc--;
argv++;
next_arg (&argc, &argv);
}
if (nmc->complete)
@ -3324,34 +3339,42 @@ do_device_wifi_hotspot (NmCli *nmc, int argc, char **argv)
}
if (strcmp (*argv, "ifname") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
ifname = *argv;
if (argc == 1 && nmc->complete)
complete_device (devices, ifname, TRUE);
} else if (strcmp (*argv, "con-name") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
con_name = *argv;
} else if (strcmp (*argv, "ssid") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
ssid = *argv;
if (strlen (ssid) > 32) {
g_string_printf (nmc->return_text, _("Error: ssid is too long."));
return NMC_RESULT_ERROR_USER_INPUT;
}
} else if (strcmp (*argv, "band") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
band = *argv;
if (argc == 1 && nmc->complete)
nmc_complete_strings (band, "a", "bg", NULL);
@ -3361,16 +3384,20 @@ do_device_wifi_hotspot (NmCli *nmc, int argc, char **argv)
return NMC_RESULT_ERROR_USER_INPUT;
}
} else if (strcmp (*argv, "channel") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
channel = *argv;
} else if (strcmp (*argv, "password") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
password = *argv;
/* --show-password is deprecated in favour of global --show-secrets option */
/* Keep it here for backwards compatibility */
@ -3381,8 +3408,7 @@ do_device_wifi_hotspot (NmCli *nmc, int argc, char **argv)
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
next_arg (&argc, &argv);
}
show_password = nmc->show_secrets || show_password;
@ -3539,26 +3565,29 @@ do_device_wifi_rescan (NmCli *nmc, int argc, char **argv)
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
argc--;
argv++;
ifname = *argv;
if (argc == 1 && nmc->complete)
complete_device (devices, ifname, TRUE);
} else if (strcmp (*argv, "ssid") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
argc--;
argv++;
g_ptr_array_add (ssids, *argv);
} else if (!nmc->complete)
g_printerr (_("Unknown parameter: %s\n"), *argv);
argc--;
argv++;
next_arg (&argc, &argv);
}
if (nmc->complete)
@ -3715,10 +3744,12 @@ do_device_lldp_list (NmCli *nmc, int argc, char **argv)
nmc_complete_strings (*argv, "ifname", NULL);
if (strcmp (*argv, "ifname") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
device = get_device (nmc, &argc, &argv, &error);
if (!device) {
@ -3730,8 +3761,7 @@ do_device_lldp_list (NmCli *nmc, int argc, char **argv)
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
next_arg (&argc, &argv);
}
if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0)

View file

@ -655,20 +655,24 @@ do_general_logging (NmCli *nmc, int argc, char **argv)
nmc_complete_strings (*argv, "level", "domains", NULL);
if (matches (*argv, "level")) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: '%s' argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
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")) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: '%s' argument is missing."), *(argv-1));
return NMC_RESULT_ERROR_USER_INPUT;
}
argc--;
argv++;
if (argc == 1 && nmc->complete) {
nmc_complete_strings_nocase (*argv, "PLATFORM", "RFKILL", "ETHER", "WIFI", "BT",
"MB", "DHCP4", "DHCP6", "PPP", "WIFI_SCAN", "IP4",

View file

@ -219,9 +219,9 @@ process_command_line (NmCli *nmc, int argc, char **argv)
if (argc > 1 && nm_streq (argv[1], "--complete-args")) {
nmc->complete = TRUE;
argv[1] = argv[0];
argc--; argv++;
next_arg (&argc, &argv);
}
argc--; argv++;
next_arg (&argc, &argv);
/* parse options */
while (argc) {
@ -239,7 +239,7 @@ process_command_line (NmCli *nmc, int argc, char **argv)
opt++;
/* '--' ends options */
if (opt[1] == '\0') {
argc--; argv++;
next_arg (&argc, &argv);
break;
}
}
@ -272,11 +272,13 @@ process_command_line (NmCli *nmc, int argc, char **argv)
nmc->print_output = NMC_PRINT_PRETTY;
} else if (matches (opt, "-mode")) {
nmc->mode_specified = TRUE;
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: missing argument for '%s' option."), opt);
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
return FALSE;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
nmc_complete_strings (argv[0], "tabular", "multiline", NULL);
if (matches (argv[0], "tabular"))
@ -289,11 +291,13 @@ process_command_line (NmCli *nmc, int argc, char **argv)
return FALSE;
}
} else if (matches (opt, "-colors")) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: missing argument for '%s' option."), opt);
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
return FALSE;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
nmc_complete_strings (argv[0], "yes", "no", "auto", NULL);
if (matches (argv[0], "auto"))
@ -308,11 +312,13 @@ process_command_line (NmCli *nmc, int argc, char **argv)
return FALSE;
}
} else if (matches (opt, "-escape")) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: missing argument for '%s' option."), opt);
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
return FALSE;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
nmc_complete_strings (argv[0], "yes", "no", NULL);
if (matches (argv[0], "yes"))
@ -325,20 +331,24 @@ process_command_line (NmCli *nmc, int argc, char **argv)
return FALSE;
}
} else if (matches (opt, "-fields")) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: fields for '%s' options are missing."), opt);
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
return FALSE;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
complete_fields (argv[0]);
nmc->required_fields = g_strdup (argv[0]);
} else if (matches (opt, "-get-values")) {
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: fields for '%s' options are missing."), opt);
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
return FALSE;
}
argc--;
argv++;
if (argc == 1 && nmc->complete)
complete_fields (argv[0]);
nmc->required_fields = g_strdup (argv[0]);
@ -356,11 +366,13 @@ process_command_line (NmCli *nmc, int argc, char **argv)
nmc->show_secrets = TRUE;
} else if (matches (opt, "-wait")) {
unsigned long timeout;
if (next_arg (&argc, &argv) != 0) {
if (!argc) {
g_string_printf (nmc->return_text, _("Error: missing argument for '%s' option."), opt);
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
return FALSE;
}
argc--;
argv++;
if (!nmc_string_to_uint (argv[0], TRUE, 0, G_MAXINT, &timeout)) {
g_string_printf (nmc->return_text, _("Error: '%s' is not a valid timeout for '%s' option."),
argv[0], opt);
@ -381,8 +393,7 @@ process_command_line (NmCli *nmc, int argc, char **argv)
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
return FALSE;
}
argc--;
argv++;
next_arg (&argc, &argv);
}
/* Now run the requested command */

View file

@ -117,11 +117,13 @@ nmc_parse_args (nmc_arg_t *arg_arr, gboolean last, int *argc, char ***argv, GErr
}
if (p->has_value) {
if (next_arg (argc, argv) != 0) {
if (!argc) {
g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
_("Error: value for '%s' argument is required."), *(*argv-1));
return FALSE;
}
argc--;
argv++;
*(p->value) = **argv;
}
p->found = TRUE;