static char * ip6_array_to_addr_prefix (GValueArray *values) { GValue *prefix_val; char *ret = NULL; GString *ip6_str; char buf[INET6_ADDRSTRLEN + 1]; gboolean is_unspec = FALSE; /* address */ if (ip6_array_to_addr (values, 0, buf, sizeof (buf), NULL)) { /* Enough space for the address, '/', and the prefix */ ip6_str = g_string_sized_new ((INET6_ADDRSTRLEN * 2) + 5); /* prefix */ g_string_append (ip6_str, buf); prefix_val = g_value_array_get_nth (values, 1); g_string_append_printf (ip6_str, "/%u", g_value_get_uint (prefix_val)); if (ip6_array_to_addr (values, 2, buf, sizeof (buf), &is_unspec)) { if (!is_unspec) g_string_append_printf (ip6_str, ",%s", buf); } ret = ip6_str->str; g_string_free (ip6_str, FALSE); } return ret; }
static void ip6_route_writer (GKeyFile *file, const char *keyfile_dir, const char *uuid, NMSetting *setting, const char *key, const GValue *value) { GPtrArray *array; const char *setting_name = nm_setting_get_name (setting); char *list[3]; int i, j; g_return_if_fail (G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_IP6_ROUTE)); array = (GPtrArray *) g_value_get_boxed (value); if (!array || !array->len) return; for (i = 0, j = 1; i < array->len; i++) { GValueArray *values = g_ptr_array_index (array, i); char *key_name; guint32 int_val; char buf[INET6_ADDRSTRLEN + 1]; gboolean is_unspec = FALSE; memset (list, 0, sizeof (list)); /* Address and prefix */ list[0] = ip6_array_to_addr_prefix (values); if (!list[0]) continue; /* Next Hop */ if (!ip6_array_to_addr (values, 2, buf, sizeof (buf), &is_unspec)) continue; if (is_unspec) continue; list[1] = g_strdup (buf); /* Metric */ value = g_value_array_get_nth (values, 3); int_val = g_value_get_uint (value); list[2] = g_strdup_printf ("%d", int_val); /* Write it out */ key_name = g_strdup_printf ("%s%d", key, j++); g_key_file_set_string_list (file, setting_name, key_name, (const char **) list, 3); g_free (key_name); g_free (list[0]); g_free (list[1]); g_free (list[2]); } }