diff options
| author | Michael Biebl <biebl@debian.org> | 2018-05-11 22:08:45 +0200 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2018-05-11 22:08:45 +0200 |
| commit | ee9c73a923909e23a649407be77e25235d769e25 (patch) | |
| tree | e21c923621fa278e737da693df9eb60ea31a6067 /clients/cli/connections.c | |
| parent | f60117b41d5433be1b4a96d82cd11d0c3dce9b63 (diff) | |
New upstream version 1.10.8 upstream/1.10.8
Diffstat (limited to 'clients/cli/connections.c')
| -rw-r--r-- | clients/cli/connections.c | 238 |
1 files changed, 113 insertions, 125 deletions
diff --git a/clients/cli/connections.c b/clients/cli/connections.c index 705d3c25..e0f55c53 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -31,6 +31,8 @@ #include <readline/readline.h> #include <readline/history.h> +#include "nm-utils/nm-hash-utils.h" + #include "nm-client-utils.h" #include "nm-vpn-helpers.h" #include "nm-meta-setting-access.h" @@ -503,8 +505,12 @@ usage_connection_export (void) static void quit (void) { - if (nm_clear_g_source (&progress_id)) + if (progress_id) { + g_source_remove (progress_id); + progress_id = 0; nmc_terminal_erase_line (); + } + g_main_loop_quit (loop); } @@ -1122,6 +1128,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) const char *fields_str = NULL; const NMMetaAbstractInfo *const*tmpl; NmcOutputField *arr; + size_t tmpl_len; const char *base_hdr = _("Activate connection details"); gboolean was_output = FALSE; @@ -1175,6 +1182,7 @@ nmc_active_connection_details (NMActiveConnection *acon, NmCli *nmc) /* Add field names */ tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_con_active_details_general; + tmpl_len = sizeof (nmc_fields_con_active_details_general); out_indices = parse_output_fields (group_fld, tmpl, FALSE, NULL, NULL); arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES); @@ -1581,18 +1589,18 @@ get_invisible_active_connections (NmCli *nmc) static GArray * parse_preferred_connection_order (const char *order, GError **error) { - gs_free const char **strv = NULL; - const char *const*iter; + char **strv, **iter; const char *str; GArray *order_arr; NmcSortOrder val; gboolean inverse, unique; int i; - strv = nm_utils_strsplit_set (order, ":"); - if (!strv) { + strv = nmc_strsplit_set (order, ":", -1); + if (!strv || !*strv) { g_set_error (error, NMCLI_ERROR, 0, _("incorrect string '%s' of '--order' option"), order); + g_strfreev (strv); return NULL; } @@ -1634,6 +1642,7 @@ parse_preferred_connection_order (const char *order, GError **error) g_array_append_val (order_arr, val); } + g_strfreev (strv); return order_arr; } @@ -1653,17 +1662,16 @@ get_connection (NmCli *nmc, int *argc, char ***argv, int *pos, GError **error) if (*argc == 1 && nmc->complete) nmc_complete_strings (**argv, "id", "uuid", "path", NULL); - if (NM_IN_STRSET (**argv, "id", "uuid", "path")) { - if (*argc == 1) { - if (!nmc->complete) { - g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, - _("%s argument is missing"), selector); - return NULL; - } - } else { - selector = **argv; - (*argv)++; - (*argc)--; + if ( strcmp (**argv, "id") == 0 + || strcmp (**argv, "uuid") == 0 + || strcmp (**argv, "path") == 0) { + selector = **argv; + (*argc)--; + (*argv)++; + if (!*argc) { + g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, + _("%s argument is missing"), selector); + return NULL; } } @@ -2287,50 +2295,48 @@ activate_connection_cb (GObject *client, GAsyncResult *result, gpointer user_dat static GHashTable * parse_passwords (const char *passwd_file, GError **error) { - gs_unref_hashtable GHashTable *pwds_hash = NULL; - gs_free char *contents = NULL; + GHashTable *pwds_hash; + char *contents = NULL; gsize len = 0; GError *local_err = NULL; - gs_free const char **strv = NULL; - const char *const*iter; + char **lines, **iter; char *pwd_spec, *pwd, *prop; const char *setting; pwds_hash = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_free); if (!passwd_file) - return g_steal_pointer (&pwds_hash); + return pwds_hash; - /* Read the passwords file */ + /* Read the passwords file */ if (!g_file_get_contents (passwd_file, &contents, &len, &local_err)) { g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, _("failed to read passwd-file '%s': %s"), passwd_file, local_err->message); g_error_free (local_err); + g_hash_table_destroy (pwds_hash); return NULL; } - strv = nm_utils_strsplit_set (contents, "\r\n"); - for (iter = strv; *iter; iter++) { - gs_free char *iter_s = g_strdup (*iter); - - pwd = strchr (iter_s, ':'); + lines = nmc_strsplit_set (contents, "\r\n", -1); + for (iter = lines; *iter; iter++) { + pwd = strchr (*iter, ':'); if (!pwd) { g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, _("missing colon in 'password' entry '%s'"), *iter); - return NULL; + goto failure; } *(pwd++) = '\0'; - prop = strchr (iter_s, '.'); + prop = strchr (*iter, '.'); if (!prop) { g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, _("missing dot in 'password' entry '%s'"), *iter); - return NULL; + goto failure; } *(prop++) = '\0'; - setting = iter_s; + setting = *iter; while (g_ascii_isspace (*setting)) setting++; /* Accept wifi-sec or wifi instead of cumbersome '802-11-wireless-security' */ @@ -2339,13 +2345,21 @@ parse_passwords (const char *passwd_file, GError **error) if (nm_setting_lookup_type (setting) == G_TYPE_INVALID) { g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT, _("invalid setting name in 'password' entry '%s'"), setting); - return NULL; + goto failure; } pwd_spec = g_strdup_printf ("%s.%s", setting, prop); g_hash_table_insert (pwds_hash, pwd_spec, g_strdup (pwd)); } - return g_steal_pointer (&pwds_hash); + g_strfreev (lines); + g_free (contents); + return pwds_hash; + +failure: + g_strfreev (lines); + g_free (contents); + g_hash_table_destroy (pwds_hash); + return NULL; } @@ -3325,7 +3339,7 @@ _dynamic_options_set (const NMMetaAbstractInfo *abstract_info, PropertyInfFlags v, v2; if (G_UNLIKELY (!cache)) - cache = g_hash_table_new (nm_direct_hash, NULL); + cache = g_hash_table_new (NULL, NULL); if (g_hash_table_lookup_extended (cache, (gpointer) abstract_info, NULL, &p)) v = GPOINTER_TO_UINT (p); @@ -5875,80 +5889,50 @@ typedef enum { NMC_EDITOR_MAIN_CMD_QUIT, } NmcEditorMainCmd; -static void -_split_cmd (const char *cmd, char **out_arg0, const char **out_argr) -{ - gs_free char *arg0 = NULL; - const char *argr = NULL; - gsize l; - - NM_SET_OUT (out_arg0, NULL); - NM_SET_OUT (out_argr, NULL); - - if (!cmd) - return; - while (NM_IN_SET (cmd[0], ' ', '\t')) - cmd++; - if (!cmd[0]) - return; - - l = strcspn (cmd, " \t"); - arg0 = g_strndup (cmd, l); - cmd += l; - if (cmd[0]) { - while (NM_IN_SET (cmd[0], ' ', '\t')) - cmd++; - if (cmd[0]) - argr = cmd; - } - - NM_SET_OUT (out_arg0, g_steal_pointer (&arg0)); - NM_SET_OUT (out_argr, argr); -} - static NmcEditorMainCmd parse_editor_main_cmd (const char *cmd, char **cmd_arg) { NmcEditorMainCmd editor_cmd = NMC_EDITOR_MAIN_CMD_UNKNOWN; - gs_free char *cmd_arg0 = NULL; - const char *cmd_argr; + char **vec; - _split_cmd (cmd, &cmd_arg0, &cmd_argr); - if (!cmd_arg0) - goto fail; + vec = nmc_strsplit_set (cmd, " \t", 2); + if (g_strv_length (vec) < 1) { + if (cmd_arg) + *cmd_arg = NULL; + return NMC_EDITOR_MAIN_CMD_UNKNOWN; + } - if (matches (cmd_arg0, "goto")) + if (matches (vec[0], "goto")) editor_cmd = NMC_EDITOR_MAIN_CMD_GOTO; - else if (matches (cmd_arg0, "remove")) + else if (matches (vec[0], "remove")) editor_cmd = NMC_EDITOR_MAIN_CMD_REMOVE; - else if (matches (cmd_arg0, "set")) + else if (matches (vec[0], "set")) editor_cmd = NMC_EDITOR_MAIN_CMD_SET; - else if (matches (cmd_arg0, "describe")) + else if (matches (vec[0], "describe")) editor_cmd = NMC_EDITOR_MAIN_CMD_DESCRIBE; - else if (matches (cmd_arg0, "print")) + else if (matches (vec[0], "print")) editor_cmd = NMC_EDITOR_MAIN_CMD_PRINT; - else if (matches (cmd_arg0, "verify")) + else if (matches (vec[0], "verify")) editor_cmd = NMC_EDITOR_MAIN_CMD_VERIFY; - else if (matches (cmd_arg0, "save")) + else if (matches (vec[0], "save")) editor_cmd = NMC_EDITOR_MAIN_CMD_SAVE; - else if (matches (cmd_arg0, "activate")) + else if (matches (vec[0], "activate")) editor_cmd = NMC_EDITOR_MAIN_CMD_ACTIVATE; - else if (matches (cmd_arg0, "back")) + else if (matches (vec[0], "back")) editor_cmd = NMC_EDITOR_MAIN_CMD_BACK; - else if (matches (cmd_arg0, "help") || strcmp (cmd_arg0, "?") == 0) + else if (matches (vec[0], "help") || strcmp (vec[0], "?") == 0) editor_cmd = NMC_EDITOR_MAIN_CMD_HELP; - else if (matches (cmd_arg0, "quit")) + else if (matches (vec[0], "quit")) editor_cmd = NMC_EDITOR_MAIN_CMD_QUIT; - else if (matches (cmd_arg0, "nmcli")) + else if (matches (vec[0], "nmcli")) editor_cmd = NMC_EDITOR_MAIN_CMD_NMCLI; - else - goto fail; - NM_SET_OUT (cmd_arg, g_strdup (cmd_argr)); + /* set pointer to command argument */ + if (cmd_arg) + *cmd_arg = vec[1] ? g_strstrip (g_strdup (vec[1])) : NULL; + + g_strfreev (vec); return editor_cmd; -fail: - NM_SET_OUT (cmd_arg, NULL); - return NMC_EDITOR_MAIN_CMD_UNKNOWN; } static void @@ -6097,39 +6081,40 @@ static NmcEditorSubCmd parse_editor_sub_cmd (const char *cmd, char **cmd_arg) { NmcEditorSubCmd editor_cmd = NMC_EDITOR_SUB_CMD_UNKNOWN; - gs_free char *cmd_arg0 = NULL; - const char *cmd_argr; + char **vec; - _split_cmd (cmd, &cmd_arg0, &cmd_argr); - if (!cmd_arg0) - goto fail; + vec = nmc_strsplit_set (cmd, " \t", 2); + if (g_strv_length (vec) < 1) { + if (cmd_arg) + *cmd_arg = NULL; + return NMC_EDITOR_SUB_CMD_UNKNOWN; + } - if (matches (cmd_arg0, "set")) + if (matches (vec[0], "set")) editor_cmd = NMC_EDITOR_SUB_CMD_SET; - else if (matches (cmd_arg0, "add")) + else if (matches (vec[0], "add")) editor_cmd = NMC_EDITOR_SUB_CMD_ADD; - else if (matches (cmd_arg0, "change")) + else if (matches (vec[0], "change")) editor_cmd = NMC_EDITOR_SUB_CMD_CHANGE; - else if (matches (cmd_arg0, "remove")) + else if (matches (vec[0], "remove")) editor_cmd = NMC_EDITOR_SUB_CMD_REMOVE; - else if (matches (cmd_arg0, "describe")) + else if (matches (vec[0], "describe")) editor_cmd = NMC_EDITOR_SUB_CMD_DESCRIBE; - else if (matches (cmd_arg0, "print")) + else if (matches (vec[0], "print")) editor_cmd = NMC_EDITOR_SUB_CMD_PRINT; - else if (matches (cmd_arg0, "back")) + else if (matches (vec[0], "back")) editor_cmd = NMC_EDITOR_SUB_CMD_BACK; - else if (matches (cmd_arg0, "help") || strcmp (cmd_arg0, "?") == 0) + else if (matches (vec[0], "help") || strcmp (vec[0], "?") == 0) editor_cmd = NMC_EDITOR_SUB_CMD_HELP; - else if (matches (cmd_arg0, "quit")) + else if (matches (vec[0], "quit")) editor_cmd = NMC_EDITOR_SUB_CMD_QUIT; - else - goto fail; - NM_SET_OUT (cmd_arg, g_strdup (cmd_argr)); + /* set pointer to command argument */ + if (cmd_arg) + *cmd_arg = g_strdup (vec[1]); + + g_strfreev (vec); return editor_cmd; -fail: - NM_SET_OUT (cmd_arg, NULL); - return NMC_EDITOR_SUB_CMD_UNKNOWN; } static void @@ -6665,26 +6650,29 @@ property_edit_submenu (NmCli *nmc, static void split_editor_main_cmd_args (const char *str, char **setting, char **property, char **value) { - gs_free char *cmd_arg0 = NULL; - const char *cmd_argr; - const char *s; + char **args, **items; - NM_SET_OUT (setting, NULL); - NM_SET_OUT (property, NULL); - NM_SET_OUT (value, NULL); - - _split_cmd (str, &cmd_arg0, &cmd_argr); - if (!cmd_arg0) + if (!str) return; - NM_SET_OUT (value, g_strdup (cmd_argr)); - s = strchr (cmd_arg0, '.'); - if (s && s > cmd_arg0) { - NM_SET_OUT (setting, g_strndup (cmd_arg0, s - cmd_arg0)); - NM_SET_OUT (property, g_strdup (&s[1])); - } else { - NM_SET_OUT (property, g_steal_pointer (&cmd_arg0)); + args = nmc_strsplit_set (str, " \t", 2); + if (args[0]) { + items = nmc_strsplit_set (args[0], ".", 2); + if (g_strv_length (items) == 2) { + if (setting) + *setting = g_strdup (items[0]); + if (property) + *property = g_strdup (items[1]); + } else { + if (property) + *property = g_strdup (items[0]); + } + g_strfreev (items); + + if (value && args[1]) + *value = g_strstrip (g_strdup (args[1])); } + g_strfreev (args); } static NMSetting * @@ -6805,7 +6793,7 @@ confirm_connection_saving (NMConnection *local, NMConnection *remote) return confirmed; } -typedef struct { +typedef struct { guint level; char *main_prompt; NMSetting *curr_setting; |