about summary refs log tree commit diff
path: root/clients/cli/connections.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2018-05-11 22:08:45 +0200
committerMichael Biebl <biebl@debian.org>2018-05-11 22:08:45 +0200
commitee9c73a923909e23a649407be77e25235d769e25 (patch)
treee21c923621fa278e737da693df9eb60ea31a6067 /clients/cli/connections.c
parentf60117b41d5433be1b4a96d82cd11d0c3dce9b63 (diff)
New upstream version 1.10.8 upstream/1.10.8
Diffstat (limited to 'clients/cli/connections.c')
-rw-r--r--clients/cli/connections.c238
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;