summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2016-07-06 20:49:40 +0200
committerLubomir Rintel <lkundrak@v3.sk>2016-08-01 13:52:36 +0200
commit717db4fe014ecc80eb8bb86757f724448116a662 (patch)
treeac33204841ec85cdd1b3642b0f7ba5dc0a3701a2
parent023791edb0b1dd85d2823e013164d95f3d542fa4 (diff)
downloadNetworkManager-717db4fe014ecc80eb8bb86757f724448116a662.tar.gz
cli/connections: split connection name parsing
Reduces redundant code paths; will make it easier to implement completion in a common one.
-rw-r--r--clients/cli/connections.c334
1 files changed, 127 insertions, 207 deletions
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index fdf446cd64..30ccf0bc79 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -1695,6 +1695,40 @@ parse_preferred_connection_order (const char *order, GError **error)
return order_arr;
}
+static NMConnection *
+get_connection (NmCli *nmc, int *argc, char ***argv, int *pos, GError **error)
+{
+ NMConnection *connection = NULL;
+ const char *selector = NULL;
+
+ if (*argc == 0) {
+ g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+ _("No connection specified"));
+ return NULL;
+ }
+
+ if ( strcmp (**argv, "id") == 0
+ || strcmp (**argv, "uuid") == 0
+ || strcmp (**argv, "path") == 0) {
+ selector = **argv;
+ if (next_arg (argc, argv) != 0) {
+ g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+ _("%s argument is missing"), selector);
+ return NULL;
+ }
+ }
+
+ connection = nmc_find_connection (nmc->connections, selector, **argv, pos);
+ if (!connection) {
+ g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_NOT_FOUND,
+ _("unknown connection '%s'"), **argv);
+ }
+
+ next_arg (argc, argv);
+
+ return connection;
+}
+
static NMCResultCode
do_connections_show (NmCli *nmc, int argc, char **argv)
{
@@ -2532,10 +2566,11 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
const char *ap = NULL;
const char *nsp = NULL;
const char *pwds = NULL;
- GError *error = NULL;
- const char *selector = NULL;
- const char *name = NULL;
- char *line = NULL;
+ gs_free_error GError *error = NULL;
+ char **arg_arr = NULL;
+ int arg_num;
+ char ***argv_ptr = &argv;
+ int *argc_ptr = &argc;
/* Not (yet?) supported */
if (nmc->complete)
@@ -2547,34 +2582,19 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
if (nmc->timeout == -1)
nmc->timeout = 90;
- if (argc == 0) {
- if (nmc->ask) {
- line = nmc_readline (PROMPT_CONNECTION);
- name = line ? line : "";
- }
- } else if (strcmp (*argv, "ifname") != 0) {
- if ( strcmp (*argv, "id") == 0
- || strcmp (*argv, "uuid") == 0
- || strcmp (*argv, "path") == 0) {
-
- selector = *argv;
- if (next_arg (&argc, &argv) != 0) {
- g_string_printf (nmc->return_text, _("Error: %s argument is missing."), selector);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto error;
- }
- name = *argv;
- }
- name = *argv;
- next_arg (&argc, &argv);
+ if (argc == 0 && nmc->ask) {
+ char *line = nmc_readline ("%s: ", PROMPT_CONNECTION);
+ nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num);
+ g_free (line);
+ argv_ptr = &arg_arr;
+ argc_ptr = &arg_num;
}
- if (name) {
- connection = nmc_find_connection (nmc->connections, selector, name, NULL);
+ if (argc > 0 && strcmp (*argv, "ifname") != 0) {
+ connection = get_connection (nmc, argc_ptr, argv_ptr, NULL, &error);
if (!connection) {
- g_string_printf (nmc->return_text, _("Error: Connection '%s' does not exist."), name);
- nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
- goto error;
+ g_string_printf (nmc->return_text, _("Error: %s."), error->message);
+ return error->code;
}
}
@@ -2582,8 +2602,7 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
if (strcmp (*argv, "ifname") == 0) {
if (next_arg (&argc, &argv) != 0) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto error;
+ return NMC_RESULT_ERROR_USER_INPUT;
}
ifname = *argv;
@@ -2591,8 +2610,7 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
else if (strcmp (*argv, "ap") == 0) {
if (next_arg (&argc, &argv) != 0) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto error;
+ return NMC_RESULT_ERROR_USER_INPUT;
}
ap = *argv;
@@ -2600,8 +2618,7 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
else if (strcmp (*argv, "passwd-file") == 0) {
if (next_arg (&argc, &argv) != 0) {
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto error;
+ return NMC_RESULT_ERROR_USER_INPUT;
}
pwds = *argv;
@@ -2624,18 +2641,14 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
if (!nmc_activate_connection (nmc, connection, ifname, ap, nsp, pwds, activate_connection_cb, &error)) {
g_string_printf (nmc->return_text, _("Error: %s."),
error->message);
- nmc->return_value = error->code;
- g_clear_error (&error);
nmc->should_wait--;
- goto error;
+ return error->code;
}
/* Start progress indication */
if (nmc->print_output == NMC_PRINT_PRETTY)
progress_id = g_timeout_add (120, progress_cb, _("preparing"));
-error:
- g_free (line);
return nmc->return_value;
}
@@ -7910,61 +7923,28 @@ do_connection_modify (NmCli *nmc,
{
NMConnection *connection = NULL;
NMRemoteConnection *rc = NULL;
- const char *name;
- const char *selector = NULL;
GError *error = NULL;
gboolean temporary = FALSE;
- if (argc == 0) {
- /*
- * TODO(?) complete "uuid", "path", "id" or connection name.
- * (if we ever will move this here from shell completion script)
- if (nmc->complete) {
- quit ();
- */
- g_string_printf (nmc->return_text, _("Error: No arguments provided."));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
-
- if (nmc_arg_is_option (*argv, "temporary")) {
+ if (argc && nmc_arg_is_option (*argv, "temporary")) {
if (nmc->complete)
goto finish;
temporary = TRUE;
next_arg (&argc, &argv);
}
- if ( strcmp (*argv, "id") == 0
- || strcmp (*argv, "uuid") == 0
- || strcmp (*argv, "path") == 0) {
-
- selector = *argv;
- if (next_arg (&argc, &argv) != 0) {
- /*
- * TODO(?): complete uuid, path or id
- if (nmc->complete) {
- quit ();
- }
- */
- g_string_printf (nmc->return_text, _("Error: %s argument is missing."),
- selector);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
- name = *argv;
- }
- name = *argv;
-
- connection = nmc_find_connection (nmc->connections, selector, name, NULL);
+ connection = get_connection (nmc, &argc, &argv, NULL, &error);
if (!connection) {
- g_string_printf (nmc->return_text, _("Error: Unknown connection '%s'."), name);
- nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+ g_string_printf (nmc->return_text, _("Error: %s."), error->message);
+ nmc->return_value = error->code;
goto finish;
}
+
rc = nm_client_get_connection_by_uuid (nmc->client,
nm_connection_get_uuid (connection));
if (!rc) {
- g_string_printf (nmc->return_text, _("Error: Unknown connection '%s'."), name);
+ g_string_printf (nmc->return_text, _("Error: Unknown connection '%s'."),
+ nm_connection_get_uuid (connection));
nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
goto finish;
}
@@ -8035,74 +8015,51 @@ do_connection_clone (NmCli *nmc, int argc, char **argv)
NMConnection *new_connection = NULL;
NMSettingConnection *s_con;
CloneConnectionInfo *info;
- const char *name;
const char *new_name;
- char *name_ask = NULL;
char *new_name_ask = NULL;
- const char *selector = NULL;
char *uuid;
gboolean temporary = FALSE;
+ char **arg_arr = NULL;
+ int arg_num;
+ char ***argv_ptr = &argv;
+ int *argc_ptr = &argc;
+ GError *error = NULL;
/* Not (yet?) supported */
if (nmc->complete)
return nmc->return_value;
- if (argc == 0) {
- if (nmc->ask) {
- name = name_ask = nmc_readline (PROMPT_CONNECTION);
- new_name = new_name_ask = nmc_readline (_("New connection name: "));
- } else {
- g_string_printf (nmc->return_text, _("Error: No arguments provided."));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
- } else {
- if (nmc_arg_is_option (*argv, "temporary")) {
- temporary = TRUE;
- next_arg (&argc, &argv);
- }
-
- if ( strcmp (*argv, "id") == 0
- || strcmp (*argv, "uuid") == 0
- || strcmp (*argv, "path") == 0) {
-
- selector = *argv;
- if (next_arg (&argc, &argv) != 0) {
- g_string_printf (nmc->return_text, _("Error: %s argument is missing."),
- selector);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
- }
- name = *argv;
- if (next_arg (&argc, &argv) != 0) {
- g_string_printf (nmc->return_text, _("Error: <new name> argument is missing."));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
- new_name = *argv;
- if (next_arg (&argc, &argv) == 0) {
- g_string_printf (nmc->return_text, _("Error: unexpected extra argument '%s'."), *argv);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
+ if (argc == 0 && nmc->ask) {
+ char *line = nmc_readline ("%s: ", PROMPT_CONNECTION);
+ nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num);
+ g_free (line);
+ argv_ptr = &arg_arr;
+ argc_ptr = &arg_num;
+ } else if (nmc_arg_is_option (*argv, "temporary")) {
+ temporary = TRUE;
+ next_arg (&argc, &argv);
}
- if (!name) {
- g_string_printf (nmc->return_text, _("Error: connection ID is missing."));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+ connection = get_connection (nmc, argc_ptr, argv_ptr, NULL, &error);
+ if (!connection) {
+ g_string_printf (nmc->return_text, _("Error: %s."), error->message);
+ nmc->return_value = error->code;
goto finish;
}
- if (!new_name) {
+
+ if (next_arg (&argc, &argv) == 0)
+ new_name = *argv;
+ else if (nmc->ask)
+ new_name = new_name_ask = nmc_readline (_("New connection name: "));
+ else {
g_string_printf (nmc->return_text, _("Error: <new name> argument is missing."));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
- connection = nmc_find_connection (nmc->connections, selector, name, NULL);
- if (!connection) {
- g_string_printf (nmc->return_text, _("Error: Unknown connection '%s'."), name);
- nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+ if (next_arg (argc_ptr, argv_ptr) == 0) {
+ g_string_printf (nmc->return_text, _("Error: unknown extra argument: '%s'."), *argv);
+ nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}
@@ -8138,7 +8095,6 @@ do_connection_clone (NmCli *nmc, int argc, char **argv)
finish:
if (new_connection)
g_object_unref (new_connection);
- g_free (name_ask);
g_free (new_name_ask);
return nmc->return_value;
@@ -8174,6 +8130,7 @@ do_connection_delete (NmCli *nmc, int argc, char **argv)
int arg_num = argc;
GString *invalid_cons = NULL;
int pos = 0;
+ GError *error = NULL;
/* Not (yet?) supported */
if (nmc->complete)
@@ -8184,33 +8141,20 @@ do_connection_delete (NmCli *nmc, int argc, char **argv)
if (argc == 0) {
if (nmc->ask) {
- char *line = nmc_readline (PROMPT_CONNECTIONS);
+ char *line = nmc_readline ("%s: ", PROMPT_CONNECTIONS);
nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num);
g_free (line);
arg_ptr = arg_arr;
}
if (arg_num == 0) {
g_string_printf (nmc->return_text, _("Error: No connection specified."));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+ nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
goto finish;
}
}
while (arg_num > 0) {
- const char *selector = NULL;
-
- if ( strcmp (*arg_ptr, "id") == 0
- || strcmp (*arg_ptr, "uuid") == 0
- || strcmp (*arg_ptr, "path") == 0) {
- selector = *arg_ptr;
- if (next_arg (&arg_num, &arg_ptr) != 0) {
- g_string_printf (nmc->return_text, _("Error: %s argument is missing."), selector);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
- }
-
- connection = nmc_find_connection (nmc->connections, selector, *arg_ptr, &pos);
+ connection = get_connection (nmc, &arg_num, &arg_ptr, &pos, &error);
if (connection) {
/* Check if the connection is unique. */
/* Calling delete for the same connection repeatedly would result in
@@ -8218,9 +8162,14 @@ do_connection_delete (NmCli *nmc, int argc, char **argv)
if (!g_slist_find (queue, connection))
queue = g_slist_prepend (queue, g_object_ref (connection));
} else {
- g_printerr (_("Error: unknown connection '%s'\n"), *arg_ptr);
- g_string_printf (nmc->return_text, _("Error: not all active connections found."));
- nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+ g_printerr (_("Error: %s.\n"), error->message);
+ g_string_printf (nmc->return_text, _("Error: not all connections found."));
+ nmc->return_value = error->code;
+ g_clear_error (&error);
+
+ if (nmc->return_value != NMC_RESULT_ERROR_NOT_FOUND)
+ goto finish;
+
if (!invalid_cons)
invalid_cons = g_string_new (NULL);
g_string_append_printf (invalid_cons, "'%s', ", *arg_ptr);
@@ -8232,7 +8181,7 @@ do_connection_delete (NmCli *nmc, int argc, char **argv)
}
if (!queue) {
- g_string_printf (nmc->return_text, _("Error: no connection provided."));
+ g_string_printf (nmc->return_text, _("Error: No connection specified."));
nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
goto finish;
}
@@ -8311,6 +8260,7 @@ connection_removed (NMClient *client, NMRemoteConnection *con, NmCli *nmc)
static NMCResultCode
do_connection_monitor (NmCli *nmc, int argc, char **argv)
{
+ GError *error = NULL;
/* Not (yet?) supported */
if (nmc->complete)
@@ -8335,25 +8285,13 @@ do_connection_monitor (NmCli *nmc, int argc, char **argv)
int pos = 0;
do {
- const char *selector = NULL;
-
- if ( strcmp (*arg_ptr, "id") == 0
- || strcmp (*arg_ptr, "uuid") == 0
- || strcmp (*arg_ptr, "path") == 0) {
- selector = *arg_ptr;
- if (next_arg (&arg_num, &arg_ptr) != 0) {
- g_string_printf (nmc->return_text, _("Error: %s argument is missing."), selector);
- return NMC_RESULT_ERROR_USER_INPUT;
- }
- }
-
- connection = nmc_find_connection (nmc->connections, selector, *arg_ptr, &pos);
+ connection = get_connection (nmc, &arg_num, &arg_ptr, &pos, &error);
if (connection) {
connection_watch (nmc, connection);
} else {
- g_printerr (_("Error: unknown connection '%s'\n"), *arg_ptr);
+ g_printerr (_("Error: %s.\n"), error->message);
g_string_printf (nmc->return_text, _("Error: not all connections found."));
- return NMC_RESULT_ERROR_NOT_FOUND;
+ return error->code;
}
/* Take next argument (if there's no other connection of the same name) */
@@ -8556,64 +8494,46 @@ static NMCResultCode
do_connection_export (NmCli *nmc, int argc, char **argv)
{
NMConnection *connection = NULL;
- const char *name;
const char *out_name = NULL;
char *name_ask = NULL;
char *out_name_ask = NULL;
const char *path = NULL;
- const char *selector = NULL;
const char *type = NULL;
NMVpnEditorPlugin *plugin;
GError *error = NULL;
char tmpfile[] = "/tmp/nmcli-export-temp-XXXXXX";
+ char **arg_arr = NULL;
+ int arg_num;
+ char ***argv_ptr = &argv;
+ int *argc_ptr = &argc;
/* Not (yet?) supported */
if (nmc->complete)
return nmc->return_value;
- if (argc == 0) {
- if (nmc->ask) {
- name_ask = nmc_readline (PROMPT_VPN_CONNECTION);
- name = name_ask = name_ask ? g_strstrip (name_ask) : NULL;
- out_name = out_name_ask = nmc_readline (_("Output file name: "));
- } else {
- g_string_printf (nmc->return_text, _("Error: No arguments provided."));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
- } else {
- if ( strcmp (*argv, "id") == 0
- || strcmp (*argv, "uuid") == 0
- || strcmp (*argv, "path") == 0) {
-
- selector = *argv;
- if (next_arg (&argc, &argv) != 0) {
- g_string_printf (nmc->return_text, _("Error: %s argument is missing."),
- selector);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
- }
- name = *argv;
- if (next_arg (&argc, &argv) == 0)
- out_name = *argv;
-
- if (next_arg (&argc, &argv) == 0) {
- g_string_printf (nmc->return_text, _("Error: unknown extra argument: '%s'."), *argv);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
+ if (argc == 0 && nmc->ask) {
+ char *line = nmc_readline ("%s: ", PROMPT_VPN_CONNECTION);
+ nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num);
+ g_free (line);
+ argv_ptr = &arg_arr;
+ argc_ptr = &arg_num;
}
- if (!name) {
- g_string_printf (nmc->return_text, _("Error: connection ID is missing."));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+ connection = get_connection (nmc, argc_ptr, argv_ptr, NULL, &error);
+ if (!connection) {
+ g_string_printf (nmc->return_text, _("Error: %s."), error->message);
+ nmc->return_value = error->code;
goto finish;
}
- connection = nmc_find_connection (nmc->connections, selector, name, NULL);
- if (!connection) {
- g_string_printf (nmc->return_text, _("Error: Unknown connection '%s'."), name);
- nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+
+ if (next_arg (&argc, &argv) == 0)
+ out_name = *argv;
+ else if (nmc->ask)
+ out_name = out_name_ask = nmc_readline (_("Output file name: "));
+
+ if (next_arg (argc_ptr, argv_ptr) == 0) {
+ g_string_printf (nmc->return_text, _("Error: unknown extra argument: '%s'."), *argv);
+ nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto finish;
}