static void nmt_route_entry_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { NmtRouteEntryPrivate *priv = NMT_ROUTE_ENTRY_GET_PRIVATE (object); switch (prop_id) { case PROP_FAMILY: priv->family = g_value_get_int (value); break; case PROP_IP_ENTRY_WIDTH: priv->ip_entry_width = g_value_get_int (value); break; case PROP_METRIC_ENTRY_WIDTH: priv->metric_entry_width = g_value_get_int (value); break; case PROP_IP4_ROUTE: g_return_if_fail (priv->family == AF_INET); if (priv->ip4_route) nm_ip4_route_unref (priv->ip4_route); priv->ip4_route = g_value_dup_boxed (value); break; case PROP_IP6_ROUTE: 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); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void _nm_ip6_route_object_array_free (GPtrArray *array) { int i; for (i = 0; i < array->len; i++) nm_ip6_route_unref (g_ptr_array_index (array, i)); g_ptr_array_free (array, TRUE); }
void nm_setting_ip6_config_remove_route (NMSettingIP6Config *setting, guint32 i) { NMSettingIP6ConfigPrivate *priv; GSList *elt; g_return_if_fail (NM_IS_SETTING_IP6_CONFIG (setting)); priv = NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting); elt = g_slist_nth (priv->routes, i); g_return_if_fail (elt != NULL); nm_ip6_route_unref ((NMIP6Route *) elt->data); priv->routes = g_slist_delete_link (priv->routes, elt); }
void nm_ip6_config_replace_route (NMIP6Config *config, guint i, NMIP6Route *new_route) { NMIP6ConfigPrivate *priv; GSList *old; g_return_if_fail (NM_IS_IP6_CONFIG (config)); priv = NM_IP6_CONFIG_GET_PRIVATE (config); old = g_slist_nth (priv->routes, i); g_return_if_fail (old != NULL); nm_ip6_route_unref ((NMIP6Route *) old->data); old->data = nm_ip6_route_dup (new_route); }
static gboolean ui_to_setting (CEPageIP6 *page) { gboolean valid = FALSE; const gchar *method; gboolean ignore_auto_dns; gboolean ignore_auto_routes; gboolean never_default; GList *children, *l; if (!gtk_switch_get_active (page->enabled)) { method = NM_SETTING_IP6_CONFIG_METHOD_IGNORE; } else { switch (gtk_combo_box_get_active (page->method)) { case IP6_METHOD_MANUAL: method = NM_SETTING_IP6_CONFIG_METHOD_MANUAL; break; case IP6_METHOD_LINK_LOCAL: method = NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL; break; case IP6_METHOD_DHCP: method = NM_SETTING_IP6_CONFIG_METHOD_DHCP; break; default: case IP6_METHOD_AUTO: method = NM_SETTING_IP6_CONFIG_METHOD_AUTO; break; } } nm_setting_ip6_config_clear_addresses (page->setting); children = gtk_container_get_children (GTK_CONTAINER (page->address_list)); for (l = children; l; l = l->next) { GtkWidget *row = l->data; GtkEntry *entry; const gchar *text_address; const gchar *text_prefix; const gchar *text_gateway; struct in6_addr tmp_addr; struct in6_addr tmp_gateway; guint32 prefix; gchar *end; NMIP6Address *addr; gboolean have_gateway = FALSE; entry = GTK_ENTRY (g_object_get_data (G_OBJECT (row), "address")); if (!entry) continue; text_address = gtk_entry_get_text (entry); text_prefix = gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (row), "prefix"))); text_gateway = gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (row), "gateway"))); if (!*text_address && !*text_prefix && !*text_gateway) { /* ignore empty rows */ continue; } if (inet_pton (AF_INET6, text_address, &tmp_addr) <= 0) { g_warning ("IPv6 address %s missing or invalid", text_address); goto out; } prefix = strtoul (text_prefix, &end, 10); if (!end || *end || prefix == 0 || prefix > 128) { g_warning ("IPv6 prefix %s is invalid", text_prefix); goto out; } if (text_gateway && *text_gateway) { if (inet_pton (AF_INET6, text_gateway, &tmp_gateway) <= 0) { g_warning ("IPv6 gateway %s is invalid", text_gateway); goto out; } if (!IN6_IS_ADDR_UNSPECIFIED (&tmp_gateway)) have_gateway = TRUE; } addr = nm_ip6_address_new (); nm_ip6_address_set_address (addr, &tmp_addr); nm_ip6_address_set_prefix (addr, prefix); if (have_gateway) nm_ip6_address_set_gateway (addr, &tmp_gateway); nm_setting_ip6_config_add_address (page->setting, addr); } g_list_free (children); nm_setting_ip6_config_clear_dns (page->setting); children = gtk_container_get_children (GTK_CONTAINER (page->dns_list)); for (l = children; l; l = l->next) { GtkWidget *row = l->data; GtkEntry *entry; const gchar *text; struct in6_addr tmp_addr; entry = GTK_ENTRY (g_object_get_data (G_OBJECT (row), "address")); if (!entry) continue; text = gtk_entry_get_text (entry); if (!*text) { /* ignore empty rows */ continue; } if (inet_pton (AF_INET6, text, &tmp_addr) <= 0) { g_warning ("IPv6 dns server %s invalid", text); goto out; } nm_setting_ip6_config_add_dns (page->setting, &tmp_addr); } g_list_free (children); nm_setting_ip6_config_clear_routes (page->setting); children = gtk_container_get_children (GTK_CONTAINER (page->routes_list)); for (l = children; l; l = l->next) { GtkWidget *row = l->data; GtkEntry *entry; const gchar *text_address; const gchar *text_prefix; const gchar *text_gateway; const gchar *text_metric; struct in6_addr dest, gateway; guint32 prefix, metric; gchar *end; NMIP6Route *route; entry = GTK_ENTRY (g_object_get_data (G_OBJECT (row), "address")); if (!entry) continue; text_address = gtk_entry_get_text (entry); text_prefix = gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (row), "prefix"))); text_gateway = gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (row), "gateway"))); text_metric = gtk_entry_get_text (GTK_ENTRY (g_object_get_data (G_OBJECT (row), "metric"))); if (!*text_address && !*text_prefix && !*text_gateway && !*text_metric) { /* ignore empty rows */ continue; } if (inet_pton (AF_INET6, text_address, &dest) <= 0) { g_warning ("IPv6 route address %s invalid", text_address); goto out; } prefix = strtoul (text_prefix, &end, 10); if (!end || *end || prefix == 0 || prefix > 128) { g_warning ("IPv6 route prefix %s invalid", text_prefix); goto out; } if (inet_pton (AF_INET6, text_gateway, &gateway) <= 0) { g_warning ("IPv6 route gateway %s invalid", text_gateway); goto out; } metric = 0; if (*text_metric) { errno = 0; metric = strtoul (text_metric, NULL, 10); if (errno) { g_warning ("IPv6 route metric %s invalid", text_metric); goto out; } } route = nm_ip6_route_new (); nm_ip6_route_set_dest (route, &dest); nm_ip6_route_set_prefix (route, prefix); nm_ip6_route_set_next_hop (route, &gateway); nm_ip6_route_set_metric (route, metric); nm_setting_ip6_config_add_route (page->setting, route); nm_ip6_route_unref (route); } g_list_free (children); ignore_auto_dns = !gtk_switch_get_active (page->auto_dns); ignore_auto_routes = !gtk_switch_get_active (page->auto_routes); never_default = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (page->never_default)); g_object_set (page->setting, NM_SETTING_IP6_CONFIG_METHOD, method, NM_SETTING_IP6_CONFIG_IGNORE_AUTO_DNS, ignore_auto_dns, NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES, ignore_auto_routes, NM_SETTING_IP6_CONFIG_NEVER_DEFAULT, never_default, NULL); valid = TRUE; out: return valid; }
void ip6_routes_dialog_update_setting (GtkWidget *dialog, NMSettingIP6Config *s_ip6) { GtkBuilder *builder; GtkWidget *widget; GtkTreeModel *model; GtkTreeIter tree_iter; gboolean iter_valid; g_return_if_fail (dialog != NULL); g_return_if_fail (s_ip6 != NULL); builder = g_object_get_data (G_OBJECT (dialog), "builder"); g_return_if_fail (builder != NULL); g_return_if_fail (GTK_IS_BUILDER (builder)); widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip6_routes")); model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); iter_valid = gtk_tree_model_get_iter_first (model, &tree_iter); nm_setting_ip6_config_clear_routes (s_ip6); while (iter_valid) { struct in6_addr dest, next_hop; guint prefix = 0, metric = 0; NMIP6Route *route; /* Address */ if (!get_one_addr (model, &tree_iter, COL_ADDRESS, TRUE, &dest)) { g_warning ("%s: IPv6 address missing or invalid!", __func__); goto next; } /* Prefix */ if (!get_one_int (model, &tree_iter, COL_PREFIX, 128, TRUE, &prefix)) { g_warning ("%s: IPv6 prefix missing or invalid!", __func__); goto next; } /* Next hop (optional) */ memset (&next_hop, 0, sizeof (struct in6_addr)); if (!get_one_addr (model, &tree_iter, COL_NEXT_HOP, FALSE, &next_hop)) { g_warning ("%s: IPv6 next hop invalid!", __func__); goto next; } /* Metric (optional) */ if (!get_one_int (model, &tree_iter, COL_METRIC, G_MAXUINT32, FALSE, &metric)) { g_warning ("%s: IPv6 metric invalid!", __func__); goto next; } route = nm_ip6_route_new (); nm_ip6_route_set_dest (route, &dest); nm_ip6_route_set_prefix (route, prefix); nm_ip6_route_set_next_hop (route, &next_hop); nm_ip6_route_set_metric (route, metric); nm_setting_ip6_config_add_route (s_ip6, route); nm_ip6_route_unref (route); next: iter_valid = gtk_tree_model_iter_next (model, &tree_iter); } widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip6_ignore_auto_routes")); g_object_set (s_ip6, NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)), NULL); widget = GTK_WIDGET (gtk_builder_get_object (builder, "ip6_never_default")); g_object_set (s_ip6, NM_SETTING_IP6_CONFIG_NEVER_DEFAULT, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)), NULL); }