[NetworkManager-openconnect] Handle IPv6 nameservers
- From: David Woodhouse <dwmw2 src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [NetworkManager-openconnect] Handle IPv6 nameservers
- Date: Wed, 25 Sep 2019 11:44:52 +0000 (UTC)
commit de44e42509d85c0ce94492441b5aa70a90d186fb
Author: David Woodhouse <dwmw2 infradead org>
Date: Wed Sep 25 10:09:15 2019 +0200
Handle IPv6 nameservers
OpenConnect provides all nameservers in the same environment varible, which
for legacy reasons (inherited from vpnc) is called $INTERNAL_IP4_DNS.
NetworkManager wants to see them separately, so pick IPv6 vs. Legacy IP
addresses from the list and put them into the appropriate fields.
src/nm-openconnect-service-openconnect-helper.c | 63 ++++++++++++++++---------
1 file changed, 41 insertions(+), 22 deletions(-)
---
diff --git a/src/nm-openconnect-service-openconnect-helper.c b/src/nm-openconnect-service-openconnect-helper.c
index 279230c..148b26e 100644
--- a/src/nm-openconnect-service-openconnect-helper.c
+++ b/src/nm-openconnect-service-openconnect-helper.c
@@ -214,39 +214,60 @@ addr6_to_gvariant (const char *str)
return g_variant_builder_end (&builder);
}
-static GVariant *
-addr6_list_to_gvariant (const char *str)
+static void
+addr46_list_to_gvariant (const char *str, GVariant **legacy, GVariant **ipv6)
{
- GVariantBuilder builder;
+ GVariantBuilder *builder4 = NULL;
+ GVariantBuilder *builder6 = NULL;
char **split;
int i;
/* Empty */
if (!str || strlen (str) < 1)
- return NULL;
+ return;
split = g_strsplit (str, " ", -1);
if (g_strv_length (split) == 0)
- return NULL;
-
- g_variant_builder_init (&builder, G_VARIANT_TYPE ("aay"));
+ return;
for (i = 0; split[i]; i++) {
- GVariant *val = addr6_to_gvariant (split[i]);
+ struct in_addr addr;
+ GVariant *val;
- if (val) {
- g_variant_builder_add_value (&builder, val);
+ if (inet_pton (AF_INET, split[i], &addr) > 0) {
+ if (!builder4)
+ builder4 = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
+ g_variant_builder_add_value (builder4, g_variant_new_uint32 (addr.s_addr));
+ } else if ((val = addr6_to_gvariant (split[i]))) {
+ if (!builder6)
+ builder6 = g_variant_builder_new (G_VARIANT_TYPE ("aay"));
+ g_variant_builder_add_value (builder6, val);
} else {
g_strfreev (split);
- g_variant_unref (g_variant_builder_end (&builder));
- return NULL;
+ if (builder4)
+ g_variant_builder_unref (builder4);
+ if (builder6)
+ g_variant_builder_unref (builder6);
+ return;
}
}
g_strfreev (split);
- return g_variant_builder_end (&builder);
-}
+ if (builder4) {
+ *legacy = g_variant_builder_end (builder4);
+ g_variant_builder_unref (builder4);
+ } else {
+ *legacy = NULL;
+ }
+
+ if (builder6) {
+ *ipv6 = g_variant_builder_end (builder6);
+ g_variant_builder_unref (builder6);
+ } else {
+ *ipv6 = NULL;
+ }
+ }
static GVariant *
split_dns_list_to_gvariant (const char *str)
@@ -447,6 +468,7 @@ main (int argc, char *argv[])
GVariantBuilder builder, ip4builder, ip6builder;
GVariant *ip4config, *ip6config;
GVariant *val;
+ GVariant *legacy_dns = NULL, *ipv6_dns = NULL;
GError *err = NULL;
struct in_addr temp_addr;
char *bus_path;
@@ -583,9 +605,11 @@ main (int argc, char *argv[])
}
/* DNS */
- val = addr4_list_to_gvariant (getenv ("INTERNAL_IP4_DNS"));
- if (val)
- g_variant_builder_add (&ip4builder, "{sv}", NM_VPN_PLUGIN_IP4_CONFIG_DNS, val);
+ addr46_list_to_gvariant (getenv ("INTERNAL_IP4_DNS"), &legacy_dns, &ipv6_dns);
+ if (legacy_dns)
+ g_variant_builder_add (&ip4builder, "{sv}", NM_VPN_PLUGIN_IP4_CONFIG_DNS, legacy_dns);
+ if (ipv6_dns)
+ g_variant_builder_add (&ip6builder, "{sv}", NM_VPN_PLUGIN_IP6_CONFIG_DNS, ipv6_dns);
/* WINS servers */
val = addr4_list_to_gvariant (getenv ("INTERNAL_IP4_NBNS"));
@@ -658,11 +682,6 @@ main (int argc, char *argv[])
g_variant_builder_add (&ip6builder, "{sv}", NM_VPN_PLUGIN_IP6_CONFIG_PREFIX, val);
}
- /* DNS */
- val = addr6_list_to_gvariant (getenv ("INTERNAL_IP6_DNS"));
- if (val)
- g_variant_builder_add (&ip6builder, "{sv}", NM_VPN_PLUGIN_IP6_CONFIG_DNS, val);
-
/* Routes */
val = get_ip6_routes ();
if (val) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]