diff --git a/clients/cli/agent.c b/clients/cli/agent.c index 75a5c283a8..5723024457 100644 --- a/clients/cli/agent.c +++ b/clients/cli/agent.c @@ -122,7 +122,7 @@ secrets_requested (NMSecretAgentSimple *agent, } static NMCResultCode -do_agent_secret (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_agent_secret (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { next_arg (nmc, &argc, &argv, NULL); if (nmc->complete) @@ -164,7 +164,7 @@ polkit_error (gpointer instance, } static NMCResultCode -do_agent_polkit (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_agent_polkit (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { gs_free_error GError *error = NULL; @@ -198,7 +198,7 @@ do_agent_polkit (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) } static NMCResultCode -do_agent_all (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_agent_all (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMCResultCode secret_res; @@ -226,7 +226,7 @@ do_agent_all (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) } NMCResultCode -nmc_command_func_agent (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +nmc_command_func_agent (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { static const NMCCommand cmds[] = { { "secret", do_agent_secret, usage_agent_secret, TRUE, TRUE }, diff --git a/clients/cli/common.c b/clients/cli/common.c index 7229b25f38..dd3b5916eb 100644 --- a/clients/cli/common.c +++ b/clients/cli/common.c @@ -1219,7 +1219,7 @@ typedef struct { } CmdCall; static void -call_cmd (NmCli *nmc, GTask *task, const NMCCommand *cmd, int argc, char **argv); +call_cmd (NmCli *nmc, GTask *task, const NMCCommand *cmd, int argc, const char *const*argv); static void got_client (GObject *source_object, GAsyncResult *res, gpointer user_data) @@ -1245,14 +1245,15 @@ got_client (GObject *source_object, GAsyncResult *res, gpointer user_data) error->message); } else { nmc->client = NM_CLIENT (source_object); - call_cmd (nmc, g_steal_pointer (&task), call->cmd, call->argc, call->argv); + call_cmd (nmc, g_steal_pointer (&task), call->cmd, call->argc, (const char *const*) call->argv); } - g_slice_free (CmdCall, call); + g_strfreev (call->argv); + nm_g_slice_free (call); } static void -call_cmd (NmCli *nmc, GTask *task, const NMCCommand *cmd, int argc, char **argv) +call_cmd (NmCli *nmc, GTask *task, const NMCCommand *cmd, int argc, const char *const*argv) { CmdCall *call; @@ -1272,11 +1273,13 @@ call_cmd (NmCli *nmc, GTask *task, const NMCCommand *cmd, int argc, char **argv) nm_assert (nmc->client == NULL); nmc->should_wait++; - call = g_slice_new0 (CmdCall); - call->cmd = cmd; - call->argc = argc; - call->argv = argv; - call->task = task; + call = g_slice_new (CmdCall); + *call = (CmdCall) { + .cmd = cmd, + .argc = argc, + .argv = nm_utils_strv_dup ((char **) argv, argc, TRUE), + .task = task, + }; nmc_client_new_async (NULL, got_client, call, @@ -1313,7 +1316,7 @@ nmc_complete_help (const char *prefix) * no callback to free the memory in (for simplicity). */ void -nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, char **argv) +nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, const char *const*argv) { const NMCCommand *c; gs_unref_object GTask *task = NULL; @@ -1349,7 +1352,7 @@ nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, char c->usage (); g_task_return_boolean (task, TRUE); } else { - call_cmd (nmc, g_steal_pointer (&task), c, argc, argv); + call_cmd (nmc, g_steal_pointer (&task), c, argc, (const char *const*) argv); } } else if (cmd) { /* Not a known command. */ @@ -1362,7 +1365,7 @@ nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, char } } else if (c->func) { /* No command, run the default handler. */ - call_cmd (nmc, g_steal_pointer (&task), c, argc, argv); + call_cmd (nmc, g_steal_pointer (&task), c, argc, (const char *const*) argv); } else { /* No command and no default handler. */ g_task_return_new_error (task, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, diff --git a/clients/cli/common.h b/clients/cli/common.h index 7bc4d383e3..243a20982b 100644 --- a/clients/cli/common.h +++ b/clients/cli/common.h @@ -62,7 +62,7 @@ int nmc_rl_set_deftext (void); char *nmc_parse_lldp_capabilities (guint value); -void nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, char **argv); +void nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, const char *const*argv); void nmc_complete_strv (const char *prefix, gssize nargs, const char *const*args); diff --git a/clients/cli/connections.c b/clients/cli/connections.c index 47a46a95b1..4bc3e6cf1b 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -1976,7 +1976,7 @@ parse_preferred_connection_order (const char *order, GError **error) static NMConnection * get_connection (NmCli *nmc, int *argc, - char ***argv, + const char *const**argv, const char **out_selector, const char **out_value, GPtrArray **out_result, @@ -2028,7 +2028,7 @@ get_connection (NmCli *nmc, } static NMCResultCode -do_connections_show (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connections_show (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { gs_free_error GError *err = NULL; gs_free char *profile_flds = NULL; @@ -2134,7 +2134,7 @@ do_connections_show (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) * option after the connection ids */ if (!nmc->nmc_config.show_secrets && !nmc->complete) { int argc_cp = argc; - char **argv_cp = argv; + const char *const*argv_cp = argv; do { if (NM_IN_STRSET (*argv_cp, "id", "uuid", "path", "filename", "apath")) { @@ -2855,7 +2855,7 @@ nmc_activate_connection (NmCli *nmc, } static NMCResultCode -do_connection_up (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connection_up (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMConnection *connection = NULL; const char *ifname = NULL; @@ -2863,9 +2863,9 @@ do_connection_up (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) const char *nsp = NULL; const char *pwds = NULL; gs_free_error GError *error = NULL; - char **arg_arr = NULL; + gs_strfreev char **arg_arr = NULL; int arg_num; - char ***argv_ptr; + const char *const**argv_ptr; int *argc_ptr; /* @@ -2888,7 +2888,7 @@ do_connection_up (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) line = nmc_readline (&nmc->nmc_config, PROMPT_CONNECTION); nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num); - argv_ptr = &arg_arr; + argv_ptr = (const char *const**) &arg_arr; argc_ptr = &arg_num; } @@ -3113,13 +3113,13 @@ connection_op_timeout_cb (gpointer user_data) } static NMCResultCode -do_connection_down (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connection_down (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMActiveConnection *active; ConnectionCbInfo *info = NULL; const GPtrArray *active_cons; gs_strfreev char **arg_arr = NULL; - char **arg_ptr; + const char *const*arg_ptr; int arg_num; guint i; gs_unref_ptrarray GPtrArray *found_active_cons = NULL; @@ -3141,7 +3141,7 @@ do_connection_down (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) line = nmc_readline (&nmc->nmc_config, PROMPT_ACTIVE_CONNECTIONS); nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num); - arg_ptr = arg_arr; + arg_ptr = (const char *const*) arg_arr; } if (arg_num == 0) { g_string_printf (nmc->return_text, _("Error: No connection specified.")); @@ -3715,7 +3715,7 @@ prompt_yes_no (gboolean default_yes, char *delim) } static NMSetting * -is_setting_valid (NMConnection *connection, const NMMetaSettingValidPartItem *const*valid_settings_main, const NMMetaSettingValidPartItem *const*valid_settings_slave, char *setting) +is_setting_valid (NMConnection *connection, const NMMetaSettingValidPartItem *const*valid_settings_main, const NMMetaSettingValidPartItem *const*valid_settings_slave, const char *setting) { const char *setting_name; @@ -4726,7 +4726,7 @@ connection_remove_setting (NMConnection *connection, NMSetting *setting, GError } static gboolean -get_value (const char **value, int *argc, char ***argv, const char *option, GError **error) +get_value (const char **value, int *argc, const char *const**argv, const char *option, GError **error) { if (!**argv) { g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, @@ -4749,7 +4749,7 @@ gboolean nmc_process_connection_properties (NmCli *nmc, NMConnection *connection, int *argc, - char ***argv, + const char *const**argv, gboolean allow_setting_removal, GError **error) { @@ -4789,7 +4789,7 @@ nmc_process_connection_properties (NmCli *nmc, && modifier == NM_META_ACCESSOR_MODIFIER_SET && nm_streq (option, "remove")) { NMSetting *ss; - char *setting_name; + const char *setting_name; (*argc)--; (*argv)++; @@ -5349,7 +5349,7 @@ again: } static NMCResultCode -do_connection_add (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connection_add (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { gs_unref_object NMConnection *connection = NULL; NMSettingConnection *s_con; @@ -8355,7 +8355,7 @@ nmc_complete_connection_type (const char *prefix) } static NMCResultCode -do_connection_edit (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connection_edit (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { const GPtrArray *connections; gs_unref_object NMConnection *connection = NULL; @@ -8574,7 +8574,7 @@ modify_connection_cb (GObject *connection, } static NMCResultCode -do_connection_modify (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connection_modify (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMConnection *connection = NULL; NMRemoteConnection *rc = NULL; @@ -8642,7 +8642,7 @@ clone_connection_cb (GObject *client, } static NMCResultCode -do_connection_clone (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connection_clone (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMConnection *connection = NULL; gs_unref_object NMConnection *new_connection = NULL; @@ -8650,9 +8650,9 @@ do_connection_clone (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) gs_free char *new_name_free = NULL; gs_free char *uuid = NULL; gboolean temporary = FALSE; - char **arg_arr = NULL; + gs_strfreev char **arg_arr = NULL; int arg_num; - char ***argv_ptr; + const char *const**argv_ptr; int *argc_ptr; GError *error = NULL; @@ -8673,7 +8673,7 @@ do_connection_clone (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) line = nmc_readline (&nmc->nmc_config, PROMPT_CONNECTION); nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num); - argv_ptr = &arg_arr; + argv_ptr = (const char *const**) &arg_arr; argc_ptr = &arg_num; } @@ -8743,12 +8743,12 @@ delete_cb (GObject *con, GAsyncResult *result, gpointer user_data) } static NMCResultCode -do_connection_delete (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connection_delete (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMConnection *connection; ConnectionCbInfo *info = NULL; gs_strfreev char **arg_arr = NULL; - char **arg_ptr; + const char *const*arg_ptr; guint i; int arg_num; nm_auto_free_gstring GString *invalid_cons = NULL; @@ -8772,7 +8772,7 @@ do_connection_delete (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) line = nmc_readline (&nmc->nmc_config, PROMPT_CONNECTIONS); nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num); - arg_ptr = arg_arr; + arg_ptr = (const char *const*) arg_arr; } if (arg_num == 0) { g_string_printf (nmc->return_text, _("Error: No connection specified.")); @@ -8889,7 +8889,7 @@ connection_removed (NMClient *client, NMRemoteConnection *con, NmCli *nmc) } static NMCResultCode -do_connection_monitor (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connection_monitor (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { GError *error = NULL; guint i; @@ -8938,7 +8938,7 @@ do_connection_monitor (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) } static NMCResultCode -do_connection_reload (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connection_reload (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { gs_unref_variant GVariant *result = NULL; gs_free_error GError *error = NULL; @@ -8964,10 +8964,11 @@ do_connection_reload (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) } static NMCResultCode -do_connection_load (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connection_load (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { GError *error = NULL; - char **filenames, **failures = NULL; + gs_free const char **filenames = NULL; + gs_strfreev char **failures = NULL; int i; next_arg (nmc, &argc, &argv, NULL); @@ -8979,13 +8980,9 @@ do_connection_load (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) if (nmc->complete) return NMC_RESULT_COMPLETE_FILE; - filenames = g_new (char *, argc + 1); - for (i = 0; i < argc; i++) - filenames[i] = argv[i]; - filenames[i] = NULL; + filenames = (const char **) nm_utils_strv_dup ((char **) argv, argc, FALSE); - nm_client_load_connections (nmc->client, filenames, &failures, NULL, &error); - g_free (filenames); + nm_client_load_connections (nmc->client, (char **) filenames, &failures, NULL, &error); if (error) { g_string_printf (nmc->return_text, _("Error: failed to load connection: %s."), nmc_error_get_simple_message (error)); @@ -8996,7 +8993,6 @@ do_connection_load (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) if (failures) { for (i = 0; failures[i]; i++) g_printerr (_("Could not load file '%s'\n"), failures[i]); - g_strfreev (failures); } return nmc->return_value; @@ -9005,7 +9001,7 @@ do_connection_load (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) #define PROMPT_IMPORT_FILE N_("File to import: ") static NMCResultCode -do_connection_import (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connection_import (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { gs_free_error GError *error = NULL; const char *type = NULL, *filename = NULL; @@ -9138,7 +9134,7 @@ do_connection_import (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) } static NMCResultCode -do_connection_export (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_connection_export (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMConnection *connection = NULL; const char *out_name = NULL; @@ -9148,9 +9144,9 @@ do_connection_export (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) NMVpnEditorPlugin *plugin; gs_free_error GError *error = NULL; char tmpfile[] = "/tmp/nmcli-export-temp-XXXXXX"; - char **arg_arr = NULL; + gs_strfreev char **arg_arr = NULL; int arg_num; - char ***argv_ptr; + const char *const**argv_ptr; int *argc_ptr; next_arg (nmc, &argc, &argv, NULL); @@ -9166,7 +9162,7 @@ do_connection_export (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) line = nmc_readline (&nmc->nmc_config, PROMPT_VPN_CONNECTION); nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num); - argv_ptr = &arg_arr; + argv_ptr = (const char *const**) &arg_arr; argc_ptr = &arg_num; } @@ -9341,7 +9337,7 @@ nmcli_con_tab_completion (const char *text, int start, int end) } NMCResultCode -nmc_command_func_connection (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +nmc_command_func_connection (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { static const NMCCommand cmds[] = { { "show", do_connections_show, usage_connection_show, TRUE, TRUE }, diff --git a/clients/cli/connections.h b/clients/cli/connections.h index 65d4ef13b7..79359a1f07 100644 --- a/clients/cli/connections.h +++ b/clients/cli/connections.h @@ -14,7 +14,7 @@ gboolean nmc_process_connection_properties (NmCli *nmc, NMConnection *connection, int *argc, - char ***argv, + const char *const**argv, gboolean allow_remove_setting, GError **error); diff --git a/clients/cli/devices.c b/clients/cli/devices.c index f752c345cc..5a1266e0a1 100644 --- a/clients/cli/devices.c +++ b/clients/cli/devices.c @@ -996,11 +996,11 @@ nmc_complete_device (NMClient *client, const char *prefix, gboolean wifi_only) } static GSList * -get_device_list (NmCli *nmc, int argc, char **argv) +get_device_list (NmCli *nmc, int argc, const char *const*argv) { int arg_num = argc; - char **arg_arr = NULL; - char **arg_ptr = argv; + gs_strfreev char **arg_arr = NULL; + const char *const*arg_ptr = argv; NMDevice **devices; GSList *queue = NULL; NMDevice *device; @@ -1013,7 +1013,7 @@ get_device_list (NmCli *nmc, int argc, char **argv) line = nmc_readline (&nmc->nmc_config, PROMPT_INTERFACES); nmc_string_to_arg_array (line, NULL, FALSE, &arg_arr, &arg_num); - arg_ptr = arg_arr; + arg_ptr = (const char *const*) arg_arr; } if (arg_num == 0) { g_string_printf (nmc->return_text, _("Error: No interface specified.")); @@ -1059,7 +1059,7 @@ error: } static NMDevice * -get_device (NmCli *nmc, int *argc, char ***argv, GError **error) +get_device (NmCli *nmc, int *argc, const char *const**argv, GError **error) { gs_free NMDevice **devices = NULL; gs_free char *ifname_ask = NULL; @@ -1729,7 +1729,7 @@ nmc_device_state_to_color (NMDeviceState state) } static NMCResultCode -do_devices_status (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_devices_status (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { GError *error = NULL; gs_free NMDevice **devices = NULL; @@ -1769,7 +1769,7 @@ do_devices_status (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) } static NMCResultCode -do_device_show (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_show (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { gs_free_error GError *error = NULL; @@ -2037,7 +2037,7 @@ connect_device_cb (GObject *client, GAsyncResult *result, gpointer user_data) } static NMCResultCode -do_device_connect (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_connect (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMDevice *device = NULL; AddAndActivateInfo *info; @@ -2207,7 +2207,7 @@ reapply_device_cb (GObject *object, GAsyncResult *result, gpointer user_data) } static NMCResultCode -do_device_reapply (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_reapply (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMDevice *device; DeviceCbInfo *info = NULL; @@ -2288,6 +2288,8 @@ modify_get_applied_cb (GObject *object, gs_free_error GError *error = NULL; NMConnection *connection; guint64 version_id; + int argc; + const char *const*argv; connection = nm_device_get_applied_connection_finish (device, result, @@ -2304,7 +2306,10 @@ modify_get_applied_cb (GObject *object, return; } - if (!nmc_process_connection_properties (info->nmc, connection, &info->argc, &info->argv, TRUE, &error)) { + argc = info->argc; + argv = (const char *const*) info->argv; + + if (!nmc_process_connection_properties (info->nmc, connection, &argc, &argv, TRUE, &error)) { g_string_assign (nmc->return_text, error->message); nmc->return_value = error->code; g_slice_free (ModifyInfo, info); @@ -2319,7 +2324,7 @@ modify_get_applied_cb (GObject *object, } static NMCResultCode -do_device_modify (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_modify (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMDevice *device = NULL; ModifyInfo *info = NULL; @@ -2341,7 +2346,7 @@ do_device_modify (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) info = g_slice_new0 (ModifyInfo); info->nmc = nmc; info->argc = argc; - info->argv = argv; + info->argv = nm_utils_strv_dup ((char **) argv, argc, TRUE); nm_device_get_applied_connection_async (device, 0, NULL, modify_get_applied_cb, info); @@ -2386,7 +2391,7 @@ disconnect_device_cb (GObject *object, GAsyncResult *result, gpointer user_data) } static NMCResultCode -do_devices_disconnect (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_devices_disconnect (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMDevice *device; DeviceCbInfo *info = NULL; @@ -2458,7 +2463,7 @@ delete_device_cb (GObject *object, GAsyncResult *result, gpointer user_data) } static NMCResultCode -do_devices_delete (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_devices_delete (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMDevice *device; DeviceCbInfo *info = NULL; @@ -2499,7 +2504,7 @@ out: } static NMCResultCode -do_device_set (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_set (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { #define DEV_SET_AUTOCONNECT 0 #define DEV_SET_MANAGED 1 @@ -2658,7 +2663,7 @@ device_removed (NMClient *client, NMDevice *device, NmCli *nmc) } static NMCResultCode -do_devices_monitor (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_devices_monitor (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { if (nmc->complete) return nmc->return_value; @@ -2902,7 +2907,7 @@ typedef struct { NmCli *nmc; NMDevice **devices; const NMMetaAbstractInfo *const *tmpl; - const char *bssid_user; + char *bssid_user; GArray *out_indices; gint64 rescan_cutoff_msec; guint pending; @@ -2959,6 +2964,7 @@ wifi_list_finish (WifiListData *wifi_list_data, g_object_unref (scan_info->devices[i]); g_free (scan_info->devices); g_array_unref (scan_info->out_indices); + g_free (scan_info->bssid_user); nm_g_slice_free (scan_info); nmc->should_wait--; @@ -3028,7 +3034,7 @@ nmc_complete_bssid (NMClient *client, const char *ifname, const char *bssid_pref } static NMCResultCode -do_device_wifi_list (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_wifi_list (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { GError *error = NULL; NMDevice *device = NULL; @@ -3187,7 +3193,7 @@ do_device_wifi_list (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) *scan_info = (ScanInfo) { .out_indices = g_array_ref (out_indices), .tmpl = tmpl, - .bssid_user = bssid_user, + .bssid_user = g_strdup (bssid_user), .nmc = nmc, .rescan_cutoff_msec = rescan_cutoff_msec, }; @@ -3294,7 +3300,7 @@ save_and_activate_connection (NmCli *nmc, } static NMCResultCode -do_device_wifi_connect (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_wifi_connect (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMDevice *device = NULL; NMAccessPoint *ap = NULL; @@ -3935,7 +3941,7 @@ create_hotspot_conn (const GPtrArray *connections, } static NMCResultCode -do_device_wifi_hotspot (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_wifi_hotspot (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { const char *ifname = NULL; const char *con_name = NULL; @@ -4138,15 +4144,14 @@ request_rescan_cb (GObject *object, GAsyncResult *result, gpointer user_data) } static NMCResultCode -do_device_wifi_rescan (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_wifi_rescan (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMDevice *device; const char *ifname = NULL; - GPtrArray *ssids; + gs_unref_ptrarray GPtrArray *ssids = NULL; gs_free NMDevice **devices = NULL; GVariantBuilder builder, array_builder; GVariant *options; - const char *ssid; int i; ssids = g_ptr_array_new (); @@ -4182,7 +4187,7 @@ do_device_wifi_rescan (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; goto finish; } - g_ptr_array_add (ssids, *argv); + g_ptr_array_add (ssids, (gpointer) *argv); } else if (!nmc->complete) { g_string_printf (nmc->return_text, _("Error: invalid extra argument '%s'."), *argv); nmc->return_value = NMC_RESULT_ERROR_USER_INPUT; @@ -4212,7 +4217,8 @@ do_device_wifi_rescan (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aay")); for (i = 0; i < ssids->len; i++) { - ssid = g_ptr_array_index (ssids, i); + const char *ssid = g_ptr_array_index (ssids, i); + g_variant_builder_add (&array_builder, "@ay", g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, ssid, strlen (ssid), 1)); } @@ -4228,7 +4234,6 @@ do_device_wifi_rescan (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) nmc->should_wait++; finish: - g_ptr_array_free (ssids, FALSE); return nmc->return_value; } @@ -4369,7 +4374,7 @@ wifi_show_device (const NmcConfig *nmc_config, NMDevice *device, GError **error) } static NMCResultCode -do_device_wifi_show_password (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_wifi_show_password (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { const char *ifname = NULL; gs_free NMDevice **devices = NULL; @@ -4453,7 +4458,7 @@ static NMCCommand device_wifi_cmds[] = { }; static NMCResultCode -do_device_wifi (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_wifi (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { next_arg (nmc, &argc, &argv, NULL); nmc_do_cmd (nmc, device_wifi_cmds, *argv, argc, argv); @@ -4547,7 +4552,7 @@ show_device_lldp_list (NMDevice *device, NmCli *nmc, const char *fields_str, int } static NMCResultCode -do_device_lldp_list (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_lldp_list (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMDevice *device = NULL; gs_free_error GError *error = NULL; @@ -4618,7 +4623,7 @@ static NMCCommand device_lldp_cmds[] = { }; static NMCResultCode -do_device_lldp (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_device_lldp (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { if (!nmc->mode_specified) nmc->nmc_config_mutable.multiline_output = TRUE; /* multiline mode is default for 'device lldp' */ @@ -4672,7 +4677,7 @@ nmcli_device_tab_completion (const char *text, int start, int end) } NMCResultCode -nmc_command_func_device (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +nmc_command_func_device (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { static const NMCCommand cmds[] = { { "status", do_devices_status, usage_device_status, TRUE, TRUE }, diff --git a/clients/cli/general.c b/clients/cli/general.c index 9b9030aea1..daf69889a2 100644 --- a/clients/cli/general.c +++ b/clients/cli/general.c @@ -490,7 +490,7 @@ show_nm_status (NmCli *nmc, const char *pretty_header_name, const char *print_fl } static NMCResultCode -do_general_status (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_general_status (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { next_arg (nmc, &argc, &argv, NULL); if (nmc->complete) @@ -609,7 +609,7 @@ show_nm_permissions (NmCli *nmc) } static NMCResultCode -do_general_reload (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_general_reload (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { gs_unref_variant GVariant *result = NULL; gs_free_error GError *error = NULL; @@ -673,7 +673,7 @@ do_general_reload (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) } static NMCResultCode -do_general_permissions (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_general_permissions (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { next_arg (nmc, &argc, &argv, NULL); if (nmc->complete) @@ -747,7 +747,7 @@ _set_logging_cb (GObject *object, GAsyncResult *result, gpointer user_data) } static NMCResultCode -do_general_logging (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_general_logging (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { next_arg (nmc, &argc, &argv, NULL); if (argc == 0) { @@ -837,7 +837,7 @@ save_hostname_cb (GObject *object, GAsyncResult *result, gpointer user_data) } static NMCResultCode -do_general_hostname (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_general_hostname (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { next_arg (nmc, &argc, &argv, NULL); if (nmc->complete) @@ -867,7 +867,7 @@ do_general_hostname (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) } NMCResultCode -nmc_command_func_general (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +nmc_command_func_general (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { static const NMCCommand cmds[] = { { "status", do_general_status, usage_general_status, TRUE, TRUE }, @@ -950,7 +950,7 @@ _do_networking_on_off_cb (GObject *object, GAsyncResult *result, gpointer user_d } static NMCResultCode -do_networking_on_off (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_networking_on_off (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { gboolean enable = nm_streq (cmd->cmd, "on"); @@ -977,7 +977,7 @@ do_networking_on_off (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) } static NMCResultCode -do_networking_connectivity (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_networking_connectivity (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { next_arg (nmc, &argc, &argv, NULL); if (nmc->complete) { @@ -1011,7 +1011,7 @@ do_networking_connectivity (const NMCCommand *cmd, NmCli *nmc, int argc, char ** } static NMCResultCode -do_networking_show (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_networking_show (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { next_arg (nmc, &argc, &argv, NULL); if (nmc->complete) @@ -1023,7 +1023,7 @@ do_networking_show (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) } NMCResultCode -nmc_command_func_networking (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +nmc_command_func_networking (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { static const NMCCommand cmds[] = { { "on", do_networking_on_off, usage_networking_on, TRUE, TRUE }, @@ -1038,7 +1038,7 @@ nmc_command_func_networking (const NMCCommand *cmd, NmCli *nmc, int argc, char * } static NMCResultCode -do_radio_all (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_radio_all (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { gboolean enable_flag; @@ -1083,7 +1083,7 @@ _do_radio_wifi_cb (GObject *object, GAsyncResult *result, gpointer user_data) } static NMCResultCode -do_radio_wifi (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_radio_wifi (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { gboolean enable_flag; @@ -1121,7 +1121,7 @@ do_radio_wifi (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) } static NMCResultCode -do_radio_wwan (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +do_radio_wwan (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { gboolean enable_flag; @@ -1148,7 +1148,7 @@ do_radio_wwan (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) } NMCResultCode -nmc_command_func_radio (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +nmc_command_func_radio (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { static const NMCCommand cmds[] = { { "all", do_radio_all, usage_radio_all, TRUE, TRUE }, @@ -1403,7 +1403,7 @@ ac_overview (NmCli *nmc, NMActiveConnection *ac) } NMCResultCode -nmc_command_func_overview (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +nmc_command_func_overview (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { NMDevice **devices; const GPtrArray *p; @@ -1518,7 +1518,7 @@ nmc_command_func_overview (const NMCCommand *cmd, NmCli *nmc, int argc, char **a } NMCResultCode -nmc_command_func_monitor (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv) +nmc_command_func_monitor (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv) { next_arg (nmc, &argc, &argv, NULL); diff --git a/clients/cli/nmcli.c b/clients/cli/nmcli.c index d6bc3e512f..ee5ef0153f 100644 --- a/clients/cli/nmcli.c +++ b/clients/cli/nmcli.c @@ -257,9 +257,20 @@ usage (void) } static gboolean -matches_arg (NmCli *nmc, int *argc, char ***argv, const char *pattern, char **arg) +matches_arg (NmCli *nmc, + int *argc, + const char *const**argv, + const char *pattern, + char **arg) { - char *opt = *argv[0]; + gs_free char *opt_free = NULL; + const char *opt = (*argv)[0]; + gs_free char *arg_tmp = NULL; + const char *s; + + nm_assert (opt); + nm_assert (opt[0] == '-'); + nm_assert (!arg || !*arg); if (nmc->return_value != NMC_RESULT_SUCCESS) { /* Don't process further matches if there has been an error. */ @@ -275,33 +286,31 @@ matches_arg (NmCli *nmc, int *argc, char ***argv, const char *pattern, char **ar if (arg) { /* If there's a "=" separator, replace it with NUL so that matches() * works and consider the part after it to be the arguemnt's value. */ - *arg = strchr (opt, '='); - if (*arg) { - **arg = '\0'; - (*arg)++; + s = strchr (opt, '='); + if (s) { + opt = nm_strndup_a (300, opt, s - opt, &opt_free); + arg_tmp = g_strdup (&s[1]); } } - if (!matches (opt, pattern)) { - if (arg && *arg) { - /* Back off the replacement of "=". */ - (*arg)--; - **arg = '='; - } + if (!matches (opt, pattern)) return FALSE; - } - if (arg && !*arg) { - /* We need a value, but the option didn't contain a "=" part. - * Proceed to the next argument. */ - (*argc)--; - (*argv)++; - 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; + if (arg) { + if (arg_tmp) + *arg = g_steal_pointer (&arg_tmp); + else { + /* We need a value, but the option didn't contain a "=" part. + * Proceed to the next argument. */ + if (*argc <= 1) { + 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)++; + *arg = g_strdup (*argv[0]); } - *arg = *argv[0]; } return TRUE; @@ -687,7 +696,7 @@ set_colors (NmcColorOption color_option, /*************************************************************************************/ static gboolean -process_command_line (NmCli *nmc, int argc, char **argv) +process_command_line (NmCli *nmc, int argc, char **argv_orig) { static const NMCCommand nmcli_cmds[] = { { "general", nmc_command_func_general, NULL, FALSE, FALSE }, @@ -700,23 +709,30 @@ process_command_line (NmCli *nmc, int argc, char **argv) { NULL, nmc_command_func_overview, usage, TRUE, TRUE }, }; NmcColorOption colors = NMC_USE_COLOR_AUTO; - char *base; + const char *base; + const char *const*argv; - base = strrchr (argv[0], '/'); + base = strrchr (argv_orig[0], '/'); if (base == NULL) - base = argv[0]; + base = argv_orig[0]; else base++; - if (argc > 1 && nm_streq (argv[1], "--complete-args")) { + + if ( argc > 1 + && nm_streq (argv_orig[1], "--complete-args")) { nmc->complete = TRUE; - argv[1] = argv[0]; - next_arg (nmc, &argc, &argv, NULL); + argv_orig[1] = argv_orig[0]; + argc--; + argv_orig++; } + + argv = (const char *const*) argv_orig; + next_arg (nmc, &argc, &argv, NULL); /* parse options */ while (argc) { - char *value; + gs_free char *value = NULL; if (argv[0][0] != '-') break; diff --git a/clients/cli/nmcli.h b/clients/cli/nmcli.h index d369714b32..4a0b166ce7 100644 --- a/clients/cli/nmcli.h +++ b/clients/cli/nmcli.h @@ -170,20 +170,20 @@ struct _NMCCommand; typedef struct _NMCCommand { const char *cmd; - NMCResultCode (*func) (const struct _NMCCommand *cmd, NmCli *nmc, int argc, char **argv); + NMCResultCode (*func) (const struct _NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv); void (*usage) (void); bool needs_client; bool needs_nm_running; } NMCCommand; -NMCResultCode nmc_command_func_agent (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv); -NMCResultCode nmc_command_func_general (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv); -NMCResultCode nmc_command_func_networking (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv); -NMCResultCode nmc_command_func_radio (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv); -NMCResultCode nmc_command_func_monitor (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv); -NMCResultCode nmc_command_func_overview (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv); -NMCResultCode nmc_command_func_connection (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv); -NMCResultCode nmc_command_func_device (const NMCCommand *cmd, NmCli *nmc, int argc, char **argv); +NMCResultCode nmc_command_func_agent (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv); +NMCResultCode nmc_command_func_general (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv); +NMCResultCode nmc_command_func_networking (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv); +NMCResultCode nmc_command_func_radio (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv); +NMCResultCode nmc_command_func_monitor (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv); +NMCResultCode nmc_command_func_overview (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv); +NMCResultCode nmc_command_func_connection (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv); +NMCResultCode nmc_command_func_device (const NMCCommand *cmd, NmCli *nmc, int argc, const char *const*argv); /*****************************************************************************/ diff --git a/clients/cli/utils.c b/clients/cli/utils.c index 67d5a742a0..d0d553b9f2 100644 --- a/clients/cli/utils.c +++ b/clients/cli/utils.c @@ -154,7 +154,7 @@ parse_global_arg (NmCli *nmc, const char *arg) * -1 otherwise (no more args). */ int -next_arg (NmCli *nmc, int *argc, char ***argv, ...) +next_arg (NmCli *nmc, int *argc, const char *const**argv, ...) { va_list args; const char *cmd_option; @@ -248,7 +248,7 @@ nmc_arg_is_option (const char *str, const char *opt_name) * Returns: TRUE on success, FALSE on an error and sets 'error' */ gboolean -nmc_parse_args (nmc_arg_t *arg_arr, gboolean last, int *argc, char ***argv, GError **error) +nmc_parse_args (nmc_arg_t *arg_arr, gboolean last, int *argc, const char *const**argv, GError **error) { nmc_arg_t *p; gboolean found; diff --git a/clients/cli/utils.h b/clients/cli/utils.h index 87e93ce082..76f5bae048 100644 --- a/clients/cli/utils.h +++ b/clients/cli/utils.h @@ -19,10 +19,10 @@ typedef struct { } nmc_arg_t; /* === Functions === */ -int next_arg (NmCli *nmc, int *argc, char ***argv, ...); +int next_arg (NmCli *nmc, int *argc, const char *const**argv, ...); gboolean nmc_arg_is_help (const char *arg); gboolean nmc_arg_is_option (const char *arg, const char *opt_name); -gboolean nmc_parse_args (nmc_arg_t *arg_arr, gboolean last, int *argc, char ***argv, GError **error); +gboolean nmc_parse_args (nmc_arg_t *arg_arr, gboolean last, int *argc, const char *const**argv, GError **error); char *ssid_to_hex (const char *str, gsize len); void nmc_terminal_erase_line (void); void nmc_terminal_show_progress (const char *str);