summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2015-06-07 14:00:57 +0200
committerLubomir Rintel <lkundrak@v3.sk>2015-07-02 09:33:58 +0200
commit15149d915f9f0d0c7870a01b6f61723296495116 (patch)
treee24a4c17bbf54ea41d8dc7acdee8b1bfbce4738b
parentdf69bd1625e0d28aac3f910401780f6ae7d09641 (diff)
downloadNetworkManager-15149d915f9f0d0c7870a01b6f61723296495116.tar.gz
cli: refactor: split connection property reader from do_connection_modify()
No functional change. We'll need it for specifying the properties on connection addition.
-rw-r--r--clients/cli/connections.c261
1 files changed, 143 insertions, 118 deletions
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index cafe935f9d..0d0e23e492 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -31,6 +31,7 @@
#include <readline/readline.h>
#include <readline/history.h>
+#include "gsystem-local-alloc.h"
#include "utils.h"
#include "common.h"
#include "settings.h"
@@ -4149,6 +4150,141 @@ is_property_valid (NMSetting *setting, const char *property, GError **error)
}
static gboolean
+read_connection_properties (NMConnection *connection,
+ int argc,
+ char **argv,
+ GError **error)
+{
+ NMSetting *setting;
+ NMSettingConnection *s_con;
+ const char *con_type;
+ const char *s_dot_p;
+ const char *value;
+ char **strv = NULL;
+ const char *setting_name;
+ gboolean append = FALSE;
+ gboolean remove = FALSE;
+ gboolean success = FALSE;
+ GError *local = NULL;
+
+ s_con = nm_connection_get_setting_connection (connection);
+ g_assert (s_con);
+ con_type = nm_setting_connection_get_connection_type (s_con);
+
+ /* Go through arguments and set properties */
+ while (argc) {
+ gs_free char *property_name = NULL;
+
+ s_dot_p = *argv;
+ next_arg (&argc, &argv);
+ value = *argv;
+ next_arg (&argc, &argv);
+
+ if (!s_dot_p) {
+ g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+ _("Error: <setting>.<property> argument is missing."));
+ goto finish;
+ }
+ if (!value) {
+ g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+ _("Error: value for '%s' is missing."), s_dot_p);
+ goto finish;
+ }
+ /* Empty string will reset the value to default */
+ if (value[0] == '\0')
+ value = NULL;
+
+ if (s_dot_p[0] == '+') {
+ s_dot_p++;
+ append = TRUE;
+ } else if (s_dot_p[0] == '-') {
+ s_dot_p++;
+ remove = TRUE;
+ }
+
+ strv = g_strsplit (s_dot_p, ".", 2);
+ if (g_strv_length (strv) != 2) {
+ g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+ _("Error: invalid <setting>.<property> '%s'."), s_dot_p);
+ goto finish;
+ }
+
+ setting_name = check_valid_name (strv[0], get_valid_settings_array (con_type), &local);
+ if (!setting_name) {
+ g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+ _("Error: invalid or not allowed setting '%s': %s."),
+ strv[0], local->message);
+ g_clear_error (&local);
+ goto finish;
+ }
+ setting = nm_connection_get_setting_by_name (connection, setting_name);
+ if (!setting) {
+ setting = nmc_setting_new_for_name (setting_name);
+ if (!setting) {
+ /* This should really not happen */
+ g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_UNKNOWN,
+ _("Error: don't know how to create '%s' setting."),
+ setting_name);
+ goto finish;
+ }
+ nm_connection_add_setting (connection, setting);
+ }
+
+ property_name = is_property_valid (setting, strv[1], &local);
+ if (!property_name) {
+ g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+ _("Error: invalid property '%s': %s."),
+ strv[1], local->message);
+ g_clear_error (&local);
+ goto finish;
+ }
+
+ if (!remove) {
+ /* Set/add value */
+ if (!append)
+ nmc_setting_reset_property (setting, property_name, NULL);
+ if (!nmc_setting_set_property (setting, property_name, value, &local)) {
+ g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+ _("Error: failed to modify %s.%s: %s."),
+ strv[0], strv[1], local->message);
+ g_clear_error (&local);
+ goto finish;
+ }
+ } else {
+ /* Remove value
+ * - either empty: remove whole value
+ * - or specified by index <0-n>: remove item at the index
+ * - or option name: remove item with the option name
+ */
+ if (value) {
+ unsigned long idx;
+ if (nmc_string_to_uint (value, TRUE, 0, G_MAXUINT32, &idx))
+ nmc_setting_remove_property_option (setting, property_name, NULL, idx, &local);
+ else
+ nmc_setting_remove_property_option (setting, property_name, value, 0, &local);
+ if (local) {
+ g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+ _("Error: failed to remove a value from %s.%s: %s."),
+ strv[0], strv[1], local->message);
+ g_clear_error (&local);
+ goto finish;
+ }
+ } else
+ nmc_setting_reset_property (setting, property_name, NULL);
+ }
+
+ g_strfreev (strv);
+ strv = NULL;
+ }
+
+ success = TRUE;
+finish:
+ if (strv)
+ g_strfreev (strv);
+ return success;
+}
+
+static gboolean
complete_connection_by_type (NMConnection *connection,
const char *con_type,
const GPtrArray *all_connections,
@@ -8763,20 +8899,11 @@ do_connection_modify (NmCli *nmc,
{
NMConnection *connection = NULL;
NMRemoteConnection *rc = NULL;
- NMSetting *setting;
- NMSettingConnection *s_con;
- const char *con_type;
const char *name;
const char *selector = NULL;
- const char *s_dot_p;
- const char *value;
- char **strv = NULL;
- const char *setting_name;
- char *property_name = NULL;
- gboolean append = FALSE;
- gboolean remove = FALSE;
GError *error = NULL;
+ nmc->return_value = NMC_RESULT_SUCCESS;
nmc->should_wait = FALSE;
if (argc == 0) {
@@ -8816,9 +8943,6 @@ do_connection_modify (NmCli *nmc,
nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
goto finish;
}
- s_con = nm_connection_get_setting_connection (NM_CONNECTION (rc));
- g_assert (s_con);
- con_type = nm_setting_connection_get_connection_type (s_con);
if (next_arg (&argc, &argv) != 0) {
g_string_printf (nmc->return_text, _("Error: <setting>.<property> argument is missing."));
@@ -8826,116 +8950,17 @@ do_connection_modify (NmCli *nmc,
goto finish;
}
- /* Go through arguments and set properties */
- while (argc) {
- s_dot_p = *argv;
- next_arg (&argc, &argv);
- value = *argv;
- next_arg (&argc, &argv);
-
- if (!s_dot_p) {
- g_string_printf (nmc->return_text, _("Error: <setting>.<property> argument is missing."));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
- if (!value) {
- g_string_printf (nmc->return_text, _("Error: value for '%s' is missing."), s_dot_p);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
- /* Empty string will reset the value to default */
- if (value[0] == '\0')
- value = NULL;
-
- if (s_dot_p[0] == '+') {
- s_dot_p++;
- append = TRUE;
- } else if (s_dot_p[0] == '-') {
- s_dot_p++;
- remove = TRUE;
- }
-
- strv = g_strsplit (s_dot_p, ".", 2);
- if (g_strv_length (strv) != 2) {
- g_string_printf (nmc->return_text, _("Error: invalid <setting>.<property> '%s'."),
- s_dot_p);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
-
- setting_name = check_valid_name (strv[0], get_valid_settings_array (con_type), &error);
- if (!setting_name) {
- g_string_printf (nmc->return_text, _("Error: invalid or not allowed setting '%s': %s."),
- strv[0], error->message);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
- setting = nm_connection_get_setting_by_name (NM_CONNECTION (rc), setting_name);
- if (!setting) {
- setting = nmc_setting_new_for_name (setting_name);
- if (!setting) {
- /* This should really not happen */
- g_string_printf (nmc->return_text,
- "Error: don't know how to create '%s' setting.",
- setting_name);
- nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
- goto finish;
- }
- nm_connection_add_setting (NM_CONNECTION (rc), setting);
- }
-
- property_name = is_property_valid (setting, strv[1], &error);
- if (!property_name) {
- g_string_printf (nmc->return_text, _("Error: invalid property '%s': %s."),
- strv[1], error->message);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
-
- if (!remove) {
- /* Set/add value */
- if (!append)
- nmc_setting_reset_property (setting, property_name, NULL);
- if (!nmc_setting_set_property (setting, property_name, value, &error)) {
- g_string_printf (nmc->return_text, _("Error: failed to modify %s.%s: %s."),
- strv[0], strv[1], error->message);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
- } else {
- /* Remove value
- * - either empty: remove whole value
- * - or specified by index <0-n>: remove item at the index
- * - or option name: remove item with the option name
- */
- if (value) {
- unsigned long idx;
- if (nmc_string_to_uint (value, TRUE, 0, G_MAXUINT32, &idx))
- nmc_setting_remove_property_option (setting, property_name, NULL, idx, &error);
- else
- nmc_setting_remove_property_option (setting, property_name, value, 0, &error);
- if (error) {
- g_string_printf (nmc->return_text, _("Error: failed to remove a value from %s.%s: %s."),
- strv[0], strv[1], error->message);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto finish;
- }
- } else
- nmc_setting_reset_property (setting, property_name, NULL);
- }
-
- g_strfreev (strv);
- strv = NULL;
+ if (!read_connection_properties (NM_CONNECTION (rc), argc, argv, &error)) {
+ g_string_printf (nmc->return_text, _("Error: %s."), error->message);
+ nmc->return_value = error->code;
+ g_clear_error (&error);
+ goto finish;
}
update_connection (!temporary, rc, modify_connection_cb, nmc);
+ nmc->should_wait = TRUE;
finish:
- nmc->should_wait = (nmc->return_value == NMC_RESULT_SUCCESS);
- g_free (property_name);
- if (strv)
- g_strfreev (strv);
- g_clear_error (&error);
return nmc->return_value;
}