summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2016-10-04 11:59:13 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2016-10-14 11:46:26 +0200
commitce6801d965b7c13c745f4ed0136457e30b84a4e0 (patch)
tree6833ae7c8c98e360f4f914ac34bdb44ff85bb864
parent113b9af52cde11ecabf21ac24aaa2ddfd6ae49c2 (diff)
downloadnetwork-manager-applet-ce6801d965b7c13c745f4ed0136457e30b84a4e0.tar.gz
editor: factor out common tree model helpers
Move some common functions for retrieving tree model values to utils/util.c
-rw-r--r--src/connection-editor/ip4-routes-dialog.c138
-rw-r--r--src/connection-editor/ip6-routes-dialog.c55
-rw-r--r--src/utils/Makefile.am11
-rw-r--r--src/utils/utils.c134
-rw-r--r--src/utils/utils.h24
5 files changed, 190 insertions, 172 deletions
diff --git a/src/connection-editor/ip4-routes-dialog.c b/src/connection-editor/ip4-routes-dialog.c
index c93a444e..edb225ee 100644
--- a/src/connection-editor/ip4-routes-dialog.c
+++ b/src/connection-editor/ip4-routes-dialog.c
@@ -47,120 +47,6 @@ static char *last_edited = NULL; /* cell text */
static char *last_path = NULL; /* row in treeview */
static int last_column = -1; /* column in treeview */
-static gboolean
-get_one_metric (GtkTreeModel *model,
- GtkTreeIter *iter,
- int column,
- gboolean fail_if_missing,
- gint64 *out,
- char **out_raw)
-{
- char *item = NULL;
- gboolean success = FALSE;
- long int tmp_int;
-
- gtk_tree_model_get (model, iter, column, &item, -1);
- if (out_raw)
- *out_raw = item;
- if (!item || !strlen (item)) {
- if (!out_raw)
- g_free (item);
- return fail_if_missing ? FALSE : TRUE;
- }
-
- errno = 0;
- tmp_int = strtol (item, NULL, 10);
- if (errno || tmp_int < 0 || tmp_int > G_MAXUINT32)
- goto out;
-
- *out = (gint64) tmp_int;
- success = TRUE;
-
-out:
- if (!out_raw)
- g_free (item);
- return success;
-}
-
-static gboolean
-get_one_prefix (GtkTreeModel *model,
- GtkTreeIter *iter,
- int column,
- gboolean fail_if_missing,
- guint32 *out,
- char **out_raw)
-{
- char *item = NULL;
- struct in_addr tmp_addr = { 0 };
- gboolean success = FALSE;
- glong tmp_prefix;
-
- gtk_tree_model_get (model, iter, column, &item, -1);
- if (out_raw)
- *out_raw = item;
- if (!item || !strlen (item)) {
- if (!out_raw)
- g_free (item);
- return fail_if_missing ? FALSE : TRUE;
- }
-
- errno = 0;
-
- /* Is it a prefix? */
- if (!strchr (item, '.')) {
- tmp_prefix = strtol (item, NULL, 10);
- if (!errno && tmp_prefix >= 0 && tmp_prefix <= 32) {
- *out = tmp_prefix;
- success = TRUE;
- goto out;
- }
- }
-
- /* Is it a netmask? */
- if (inet_pton (AF_INET, item, &tmp_addr) > 0) {
- *out = nm_utils_ip4_netmask_to_prefix (tmp_addr.s_addr);
- success = TRUE;
- }
-
-out:
- if (!out_raw)
- g_free (item);
- return success;
-}
-
-static gboolean
-get_one_addr (GtkTreeModel *model,
- GtkTreeIter *iter,
- int column,
- gboolean fail_if_missing,
- char **out,
- char **out_raw)
-{
- char *item = NULL;
- struct in_addr tmp_addr = { 0 };
-
- gtk_tree_model_get (model, iter, column, &item, -1);
- if (out_raw)
- *out_raw = item;
- if (!item || !strlen (item)) {
- if (!out_raw)
- g_free (item);
- return fail_if_missing ? FALSE : TRUE;
- }
-
- if (inet_pton (AF_INET, item, &tmp_addr) == 0)
- return FALSE;
-
- if (tmp_addr.s_addr == 0) {
- if (!out_raw)
- g_free (item);
- return fail_if_missing ? FALSE : TRUE;
- }
-
- *out = item;
- return TRUE;
-}
-
static void
validate (GtkWidget *dialog)
{
@@ -186,24 +72,24 @@ validate (GtkWidget *dialog)
gint64 metric = -1;
/* Address */
- if (!get_one_addr (model, &tree_iter, COL_ADDRESS, TRUE, &addr, NULL))
+ if (!utils_tree_model_get_address (model, &tree_iter, COL_ADDRESS, AF_INET, TRUE, &addr, NULL))
goto done;
g_free (addr);
/* Prefix */
- if (!get_one_prefix (model, &tree_iter, COL_PREFIX, TRUE, &prefix, NULL))
+ if (!utils_tree_model_get_ip4_prefix (model, &tree_iter, COL_PREFIX, TRUE, &prefix, NULL))
goto done;
/* Don't allow zero prefix for now - that's not supported in libnm-util */
if (prefix == 0)
goto done;
/* Next hop (optional) */
- if (!get_one_addr (model, &tree_iter, COL_NEXT_HOP, FALSE, &next_hop, NULL))
+ if (!utils_tree_model_get_address (model, &tree_iter, COL_NEXT_HOP, AF_INET, FALSE, &next_hop, NULL))
goto done;
g_free (next_hop);
/* Metric (optional) */
- if (!get_one_metric (model, &tree_iter, COL_METRIC, FALSE, &metric, NULL))
+ if (!utils_tree_model_get_int64 (model, &tree_iter, COL_METRIC, 0, G_MAXUINT32, FALSE, &metric, NULL))
goto done;
iter_valid = gtk_tree_model_iter_next (model, &tree_iter);
@@ -696,14 +582,14 @@ cell_error_data_func (GtkTreeViewColumn *tree_column,
gboolean invalid = FALSE;
if (col == COL_ADDRESS)
- invalid = !get_one_addr (tree_model, iter, COL_ADDRESS, TRUE, &addr, &value);
+ invalid = !utils_tree_model_get_address (tree_model, iter, COL_ADDRESS, AF_INET, TRUE, &addr, &value);
else if (col == COL_PREFIX)
- invalid = !get_one_prefix (tree_model, iter, COL_PREFIX, TRUE, &prefix, &value)
+ invalid = !utils_tree_model_get_ip4_prefix (tree_model, iter, COL_PREFIX, TRUE, &prefix, &value)
|| prefix == 0;
else if (col == COL_NEXT_HOP)
- invalid = !get_one_addr (tree_model, iter, COL_NEXT_HOP, FALSE, &next_hop, &value);
+ invalid = !utils_tree_model_get_address (tree_model, iter, COL_NEXT_HOP, AF_INET, FALSE, &next_hop, &value);
else if (col == COL_METRIC)
- invalid = !get_one_metric (tree_model, iter, COL_METRIC, FALSE, &metric, &value);
+ invalid = !utils_tree_model_get_int64 (tree_model, iter, COL_METRIC, 0, G_MAXUINT32, FALSE, &metric, &value);
else
g_warn_if_reached ();
@@ -934,27 +820,27 @@ ip4_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIPConfig *s_ip4)
NMIPRoute *route;
/* Address */
- if (!get_one_addr (model, &tree_iter, COL_ADDRESS, TRUE, &addr, NULL)) {
+ if (!utils_tree_model_get_address (model, &tree_iter, COL_ADDRESS, AF_INET, TRUE, &addr, NULL)) {
g_warning ("%s: IPv4 address missing or invalid!", __func__);
goto next;
}
/* Prefix */
- if (!get_one_prefix (model, &tree_iter, COL_PREFIX, TRUE, &prefix, NULL)) {
+ if (!utils_tree_model_get_ip4_prefix (model, &tree_iter, COL_PREFIX, TRUE, &prefix, NULL)) {
g_warning ("%s: IPv4 prefix/netmask missing or invalid!", __func__);
g_free (addr);
goto next;
}
/* Next hop (optional) */
- if (!get_one_addr (model, &tree_iter, COL_NEXT_HOP, FALSE, &next_hop, NULL)) {
+ if (!utils_tree_model_get_address (model, &tree_iter, COL_NEXT_HOP, AF_INET, FALSE, &next_hop, NULL)) {
g_warning ("%s: IPv4 next hop invalid!", __func__);
g_free (addr);
goto next;
}
/* Metric (optional) */
- if (!get_one_metric (model, &tree_iter, COL_METRIC, FALSE, &metric, NULL)) {
+ if (!utils_tree_model_get_int64 (model, &tree_iter, COL_METRIC, 0, G_MAXUINT32, FALSE, &metric, NULL)) {
g_warning ("%s: IPv4 metric invalid!", __func__);
g_free (addr);
g_free (next_hop);
diff --git a/src/connection-editor/ip6-routes-dialog.c b/src/connection-editor/ip6-routes-dialog.c
index 8e7325ca..95f81ad5 100644
--- a/src/connection-editor/ip6-routes-dialog.c
+++ b/src/connection-editor/ip6-routes-dialog.c
@@ -86,39 +86,6 @@ out:
return success;
}
-static gboolean
-get_one_addr (GtkTreeModel *model,
- GtkTreeIter *iter,
- int column,
- gboolean fail_if_missing,
- char **out,
- char **out_raw)
-{
- char *item = NULL;
- struct in6_addr tmp_addr;
-
- gtk_tree_model_get (model, iter, column, &item, -1);
- if (out_raw)
- *out_raw = item;
- if (!item || !strlen (item)) {
- if (!out_raw)
- g_free (item);
- return fail_if_missing ? FALSE : TRUE;
- }
-
- if (inet_pton (AF_INET6, item, &tmp_addr) == 0)
- return FALSE;
-
- if (IN6_IS_ADDR_UNSPECIFIED (&tmp_addr)) {
- if (!out_raw)
- g_free (item);
- return fail_if_missing ? FALSE : TRUE;
- }
-
- *out = item;
- return TRUE;
-}
-
static void
validate (GtkWidget *dialog)
{
@@ -143,16 +110,16 @@ validate (GtkWidget *dialog)
gint64 prefix = 0, metric = -1;
/* Address */
- if (!get_one_addr (model, &tree_iter, COL_ADDRESS, TRUE, &dest, NULL))
+ if (!utils_tree_model_get_address (model, &tree_iter, COL_ADDRESS, AF_INET6, TRUE, &dest, NULL))
goto done;
g_free (dest);
/* Prefix */
- if (!get_one_int64 (model, &tree_iter, COL_PREFIX, 1, 128, TRUE, &prefix, NULL))
+ if (!utils_tree_model_get_int64 (model, &tree_iter, COL_PREFIX, 1, 128, TRUE, &prefix, NULL))
goto done;
/* Next hop (optional) */
- if (!get_one_addr (model, &tree_iter, COL_NEXT_HOP, FALSE, &next_hop, NULL))
+ if (!utils_tree_model_get_address (model, &tree_iter, COL_NEXT_HOP, AF_INET6, FALSE, &next_hop, NULL))
goto done;
g_free (next_hop);
@@ -640,13 +607,13 @@ cell_error_data_func (GtkTreeViewColumn *tree_column,
gboolean invalid = FALSE;
if (col == COL_ADDRESS)
- invalid = !get_one_addr (tree_model, iter, COL_ADDRESS, TRUE, &addr, &value);
+ invalid = !utils_tree_model_get_address (tree_model, iter, COL_ADDRESS, AF_INET6, TRUE, &addr, &value);
else if (col == COL_PREFIX)
- invalid = !get_one_int64 (tree_model, iter, COL_PREFIX, 1, 128, TRUE, &prefix, &value);
+ invalid = !utils_tree_model_get_int64 (tree_model, iter, COL_PREFIX, 1, 128, TRUE, &prefix, &value);
else if (col == COL_NEXT_HOP)
- invalid = !get_one_addr (tree_model, iter, COL_NEXT_HOP, FALSE, &next_hop, &value);
+ invalid = !utils_tree_model_get_address (tree_model, iter, COL_NEXT_HOP, AF_INET6, FALSE, &next_hop, &value);
else if (col == COL_METRIC)
- invalid = !get_one_int64 (tree_model, iter, COL_METRIC, 0, G_MAXUINT32, FALSE, &metric, &value);
+ invalid = !utils_tree_model_get_int64 (tree_model, iter, COL_METRIC, 0, G_MAXUINT32, FALSE, &metric, &value);
else
g_warn_if_reached ();
@@ -873,27 +840,27 @@ ip6_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIPConfig *s_ip6)
NMIPRoute *route;
/* Address */
- if (!get_one_addr (model, &tree_iter, COL_ADDRESS, TRUE, &dest, NULL)) {
+ if (!utils_tree_model_get_address (model, &tree_iter, COL_ADDRESS, AF_INET6, TRUE, &dest, NULL)) {
g_warning ("%s: IPv6 address missing or invalid!", __func__);
goto next;
}
/* Prefix */
- if (!get_one_int64 (model, &tree_iter, COL_PREFIX, 1, 128, TRUE, &prefix, NULL)) {
+ if (!utils_tree_model_get_int64 (model, &tree_iter, COL_PREFIX, 1, 128, TRUE, &prefix, NULL)) {
g_warning ("%s: IPv6 prefix missing or invalid!", __func__);
g_free (dest);
goto next;
}
/* Next hop (optional) */
- if (!get_one_addr (model, &tree_iter, COL_NEXT_HOP, FALSE, &next_hop, NULL)) {
+ if (!utils_tree_model_get_address (model, &tree_iter, COL_NEXT_HOP, AF_INET6, FALSE, &next_hop, NULL)) {
g_warning ("%s: IPv6 next hop invalid!", __func__);
g_free (dest);
goto next;
}
/* Metric (optional) */
- if (!get_one_int64 (model, &tree_iter, COL_METRIC, 0, G_MAXUINT32, FALSE, &metric, NULL)) {
+ if (!utils_tree_model_get_int64 (model, &tree_iter, COL_METRIC, 0, G_MAXUINT32, FALSE, &metric, NULL)) {
g_warning ("%s: IPv6 metric invalid!", __func__);
g_free (dest);
g_free (next_hop);
diff --git a/src/utils/Makefile.am b/src/utils/Makefile.am
index aac01556..22d3b0c0 100644
--- a/src/utils/Makefile.am
+++ b/src/utils/Makefile.am
@@ -1,10 +1,16 @@
SUBDIRS= . tests
+shared_files = \
+ $(top_srcdir)/shared/nm-utils/nm-shared-utils.c \
+ $(top_srcdir)/shared/nm-utils/nm-shared-utils.h \
+ $(NULL)
+
noinst_LTLIBRARIES = \
libutils-libnm-glib.la \
libutils-libnm.la
libutils_libnm_glib_la_SOURCES = \
+ $(shared_files) \
utils.c \
utils.h
@@ -12,20 +18,21 @@ libutils_libnm_glib_la_CPPFLAGS = \
-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_LIB_LEGACY \
$(GTK_CFLAGS) \
$(LIBNM_GLIB_CFLAGS) \
- "-I${top_srcdir}/shared/"
+ -I$(top_srcdir)/shared/
libutils_libnm_glib_la_LIBADD = \
$(GTK_LIBS) \
$(LIBNM_GLIB_LIBS)
libutils_libnm_la_SOURCES = \
+ $(shared_files) \
utils.c \
utils.h
libutils_libnm_la_CPPFLAGS = \
$(GTK_CFLAGS) \
$(LIBNM_CFLAGS) \
- "-I${top_srcdir}/shared/"
+ -I$(top_srcdir)/shared/
libutils_libnm_la_LIBADD = \
$(GTK_LIBS) \
diff --git a/src/utils/utils.c b/src/utils/utils.c
index 23e41c36..c3b806e2 100644
--- a/src/utils/utils.c
+++ b/src/utils/utils.c
@@ -25,8 +25,13 @@
#include "utils.h"
#include <string.h>
+#include <errno.h>
+#include <arpa/inet.h>
#include <netinet/ether.h>
+#include "nm-utils.h"
+#include "nm-utils/nm-shared-utils.h"
+
/*
* utils_ether_addr_valid
*
@@ -385,3 +390,132 @@ widget_unset_error (GtkWidget *widget)
gtk_style_context_remove_class (gtk_widget_get_style_context (widget), "error");
}
+
+gboolean
+utils_tree_model_get_int64 (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ int column,
+ gint64 min_value,
+ gint64 max_value,
+ gboolean fail_if_missing,
+ gint64 *out,
+ char **out_raw)
+{
+ char *item = NULL;
+ gboolean success = FALSE;
+ gint64 val;
+
+ g_return_val_if_fail (model, FALSE);
+ g_return_val_if_fail (iter, FALSE);
+
+ gtk_tree_model_get (model, iter, column, &item, -1);
+ if (out_raw)
+ *out_raw = item;
+ if (!item || !strlen (item)) {
+ if (!out_raw)
+ g_free (item);
+ return fail_if_missing ? FALSE : TRUE;
+ }
+
+ val = _nm_utils_ascii_str_to_int64 (item, 10, min_value, max_value, 0);
+ if (errno)
+ goto out;
+
+ *out = val;
+ success = TRUE;
+out:
+ if (!out_raw)
+ g_free (item);
+ return success;
+}
+
+gboolean
+utils_tree_model_get_address (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ int column,
+ int family,
+ gboolean fail_if_missing,
+ char **out,
+ char **out_raw)
+{
+ char *item = NULL;
+ union {
+ struct in_addr addr4;
+ struct in6_addr addr6;
+ } tmp_addr;
+
+ g_return_val_if_fail (model, FALSE);
+ g_return_val_if_fail (iter, FALSE);
+ g_return_val_if_fail (family == AF_INET || family == AF_INET6, FALSE);
+
+ gtk_tree_model_get (model, iter, column, &item, -1);
+ if (out_raw)
+ *out_raw = item;
+ if (!item || !strlen (item)) {
+ if (!out_raw)
+ g_free (item);
+ return fail_if_missing ? FALSE : TRUE;
+ }
+
+ if (inet_pton (family, item, &tmp_addr) == 0)
+ return FALSE;
+
+ if ( (family == AF_INET && tmp_addr.addr4.s_addr == 0)
+ || (family == AF_INET6 && IN6_IS_ADDR_UNSPECIFIED (&tmp_addr.addr6))) {
+ if (!out_raw)
+ g_free (item);
+ return fail_if_missing ? FALSE : TRUE;
+ }
+
+ *out = item;
+ return TRUE;
+}
+
+gboolean
+utils_tree_model_get_ip4_prefix (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ int column,
+ gboolean fail_if_missing,
+ guint32 *out,
+ char **out_raw)
+{
+ char *item = NULL;
+ struct in_addr tmp_addr = { 0 };
+ gboolean success = FALSE;
+ glong tmp_prefix;
+
+ g_return_val_if_fail (model, FALSE);
+ g_return_val_if_fail (iter, FALSE);
+
+ gtk_tree_model_get (model, iter, column, &item, -1);
+ if (out_raw)
+ *out_raw = item;
+ if (!item || !strlen (item)) {
+ if (!out_raw)
+ g_free (item);
+ return fail_if_missing ? FALSE : TRUE;
+ }
+
+ errno = 0;
+
+ /* Is it a prefix? */
+ if (!strchr (item, '.')) {
+ tmp_prefix = strtol (item, NULL, 10);
+ if (!errno && tmp_prefix >= 0 && tmp_prefix <= 32) {
+ *out = tmp_prefix;
+ success = TRUE;
+ goto out;
+ }
+ }
+
+ /* Is it a netmask? */
+ if (inet_pton (AF_INET, item, &tmp_addr) > 0) {
+ *out = nm_utils_ip4_netmask_to_prefix (tmp_addr.s_addr);
+ success = TRUE;
+ }
+
+out:
+ if (!out_raw)
+ g_free (item);
+ return success;
+}
diff --git a/src/utils/utils.h b/src/utils/utils.h
index ab903662..544833a4 100644
--- a/src/utils/utils.h
+++ b/src/utils/utils.h
@@ -84,5 +84,29 @@ void utils_fake_return_key (GdkEventKey *event);
void widget_set_error (GtkWidget *widget);
void widget_unset_error (GtkWidget *widget);
+gboolean utils_tree_model_get_int64 (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ int column,
+ gint64 min_value,
+ gint64 max_value,
+ gboolean fail_if_missing,
+ gint64 *out,
+ char **out_raw);
+
+gboolean utils_tree_model_get_address (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ int column,
+ int family,
+ gboolean fail_if_missing,
+ char **out,
+ char **out_raw);
+
+gboolean utils_tree_model_get_ip4_prefix (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ int column,
+ gboolean fail_if_missing,
+ guint32 *out,
+ char **out_raw);
+
#endif /* UTILS_H */