Merge tui fixes for IPv6 routes and MAC address (bgo #731160)

- fixes crash when editing IPv6 routes
- fixes editing of Cloned MAC address
This commit is contained in:
Jiří Klimeš 2014-06-03 16:13:28 +02:00
commit 7a79a78a1b
3 changed files with 30 additions and 11 deletions

View file

@ -772,7 +772,7 @@ ip6_addresses_to_strv (GBinding *binding,
for (i = 0; i < addrs->len; i++) {
addrbytes = addrs->pdata[i];
if (IP6_ADDRESS_SET (addrbytes))
inet_ntop (AF_INET, addrbytes->data, buf, sizeof (buf));
inet_ntop (AF_INET6, addrbytes->data, buf, sizeof (buf));
else
buf[0] = '\0';
strings[i] = g_strdup (buf);
@ -1002,7 +1002,7 @@ ip6_route_transform_to_next_hop_string (GBinding *binding,
addrbytes = &in6addr_any;
if (IN6_ADDR_SET (addrbytes))
inet_ntop (AF_INET, &addrbytes, buf, sizeof (buf));
inet_ntop (AF_INET6, addrbytes, buf, sizeof (buf));
else
buf[0] = '\0';
g_value_set_string (target_value, buf);
@ -1035,7 +1035,7 @@ ip6_route_transform_from_dest_string (GBinding *binding,
{
NMIP6Route *route;
const char *text;
const struct in6_addr *addrbytes;
struct in6_addr addrbytes;
guint32 prefix;
text = g_value_get_string (source_value);
@ -1047,7 +1047,7 @@ ip6_route_transform_from_dest_string (GBinding *binding,
g_binding_get_source_property (binding), &route,
NULL);
nm_ip6_route_set_dest (route, addrbytes);
nm_ip6_route_set_dest (route, &addrbytes);
nm_ip6_route_set_prefix (route, prefix);
g_value_take_boxed (target_value, route);
@ -1062,21 +1062,21 @@ ip6_route_transform_from_next_hop_string (GBinding *binding,
{
NMIP6Route *route;
const char *text;
const struct in6_addr *addrbytes;
struct in6_addr addrbytes;
text = g_value_get_string (source_value);
if (*text) {
if (!ip_string_parse (text, AF_INET6, &addrbytes, NULL))
return FALSE;
} else
addrbytes = 0;
addrbytes = in6addr_any;
/* Fetch the original property value */
g_object_get (g_binding_get_source (binding),
g_binding_get_source_property (binding), &route,
NULL);
nm_ip6_route_set_next_hop (route, addrbytes);
nm_ip6_route_set_next_hop (route, &addrbytes);
g_value_take_boxed (target_value, route);
return TRUE;

View file

@ -28,6 +28,8 @@
#include "config.h"
#include <string.h>
#include <dbus/dbus-glib.h>
#include <nm-utils.h>
@ -80,7 +82,7 @@ mac_filter (NmtNewtEntry *entry,
{
NmtMacEntryPrivate *priv = NMT_MAC_ENTRY_GET_PRIVATE (entry);
if (position > priv->mac_str_length)
if (position >= priv->mac_str_length)
return FALSE;
return g_ascii_isxdigit (ch) || ch == ':';
@ -114,8 +116,13 @@ mac_validator (NmtNewtEntry *entry,
if (g_ascii_isxdigit (p[0]) && !p[1]) {
char *fixed = g_strdup_printf ("%.*s:%c", (int)(p - text), text, *p);
g_object_set (G_OBJECT (entry), "text", fixed, NULL);
return TRUE;
nmt_newt_entry_set_text (entry, fixed);
g_free (fixed);
/* FIXME: NmtNewtEntry doesn't correctly deal with us calling set_text()
* from inside the validator.
*/
nmt_newt_widget_needs_rebuild (NMT_NEWT_WIDGET (entry));
}
return FALSE;
@ -128,6 +135,17 @@ nmt_mac_entry_init (NmtMacEntry *entry)
nmt_newt_entry_set_validator (NMT_NEWT_ENTRY (entry), mac_validator, NULL);
}
static void
nmt_mac_entry_notify (GObject *object,
GParamSpec *pspec)
{
if (G_OBJECT_CLASS (nmt_mac_entry_parent_class)->notify)
G_OBJECT_CLASS (nmt_mac_entry_parent_class)->notify (object, pspec);
if (pspec->owner_type == NMT_TYPE_NEWT_ENTRY && !strcmp (pspec->name, "text"))
g_object_notify (object, "mac-address");
}
static void
nmt_mac_entry_set_property (GObject *object,
guint prop_id,
@ -189,6 +207,7 @@ nmt_mac_entry_class_init (NmtMacEntryClass *entry_class)
g_type_class_add_private (entry_class, sizeof (NmtMacEntryPrivate));
/* virtual methods */
object_class->notify = nmt_mac_entry_notify;
object_class->set_property = nmt_mac_entry_set_property;
object_class->get_property = nmt_mac_entry_get_property;

View file

@ -206,7 +206,7 @@ nmt_route_entry_set_property (GObject *object,
priv->ip4_route = g_value_dup_boxed (value);
break;
case PROP_IP6_ROUTE:
g_return_if_fail (priv->family == AF_INET);
g_return_if_fail (priv->family == AF_INET6);
if (priv->ip6_route)
nm_ip6_route_unref (priv->ip6_route);
priv->ip6_route = g_value_dup_boxed (value);