From 50bb7448e76b65e6eacce811240b25a1119c5f7c Mon Sep 17 00:00:00 2001 From: Druco Date: Mon, 16 Jul 2018 03:36:01 -0700 Subject: [PATCH] Added handling for DNS field. Note: DNS will not work unless 'resolvconf' is installed. --- shared/import-export.c | 2 ++ src/nm-wireguard-service.c | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/shared/import-export.c b/shared/import-export.c index 9d0ecda..42cd5ea 100644 --- a/shared/import-export.c +++ b/shared/import-export.c @@ -1118,6 +1118,7 @@ create_config_string (NMConnection *connection, GError **error) const char *allowed_ips; const char *endpoint; const char *psk; + const char *dns; char *value = NULL; char **ip_list, **ip_iter; GArray *ips; @@ -1143,6 +1144,7 @@ create_config_string (NMConnection *connection, GError **error) allowed_ips = _arg_is_set(nm_setting_vpn_get_data_item(s_vpn, NM_WG_KEY_ALLOWED_IPS)); endpoint = _arg_is_set(nm_setting_vpn_get_data_item(s_vpn, NM_WG_KEY_ENDPOINT)); psk = _arg_is_set(nm_setting_vpn_get_data_item(s_vpn, NM_WG_KEY_PRESHARED_KEY)); + dns = _arg_is_set(nm_setting_vpn_get_data_item(s_vpn, NM_WG_KEY_DNS)); if(!ip4 && !ip6){ g_set_error_literal(error, diff --git a/src/nm-wireguard-service.c b/src/nm-wireguard-service.c index 5efed25..1195b37 100644 --- a/src/nm-wireguard-service.c +++ b/src/nm-wireguard-service.c @@ -94,6 +94,7 @@ typedef struct _Configs{ GVariant *config; GVariant *ip4config; GVariant *ip6config; + GVariant *dns_config; } Configs; typedef struct { @@ -346,13 +347,15 @@ set_config(NMVpnServicePlugin *plugin, NMConnection *connection) { NMSettingVpn *s_vpn = nm_connection_get_setting_vpn(connection); GVariantBuilder builder, ip4builder, ip6builder; - GVariant *config, *ip4config, *ip6config; + GVariantBuilder dns_builder; + GVariant *config, *ip4config, *ip6config, *dns_config; GVariant *val; const char *setting; const gchar *if_name; guint64 subnet = 24; gboolean has_ip4 = FALSE; gboolean has_ip6 = FALSE; + gboolean has_dns = FALSE; Configs *configs = malloc(sizeof(Configs)); memset(configs, 0, sizeof(Configs)); @@ -361,6 +364,7 @@ set_config(NMVpnServicePlugin *plugin, NMConnection *connection) g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT); g_variant_builder_init(&ip4builder, G_VARIANT_TYPE_VARDICT); g_variant_builder_init(&ip6builder, G_VARIANT_TYPE_VARDICT); + g_variant_builder_init(&dns_builder, G_VARIANT_TYPE_VARDICT); // build the configs setting = get_setting(s_vpn, NM_WG_KEY_ADDR_IP4); @@ -387,6 +391,9 @@ set_config(NMVpnServicePlugin *plugin, NMConnection *connection) setting = get_setting(s_vpn, NM_WG_KEY_DNS); if(setting){ // TODO + val = g_variant_new_string(setting); + g_variant_builder_add(&dns_builder, "{ss}", NMV_WG_TAG_DNS, val); + has_dns = TRUE; } setting = get_setting(s_vpn, NM_WG_KEY_ENDPOINT); @@ -447,10 +454,12 @@ set_config(NMVpnServicePlugin *plugin, NMConnection *connection) config = g_variant_builder_end(&builder); ip4config = g_variant_builder_end(&ip4builder); ip6config = g_variant_builder_end(&ip6builder); + dns_config = g_variant_builder_end(&dns_builder); // populate the configs struct and send the configuration asynchronously configs->ip4config = (has_ip4) ? ip4config : NULL; configs->ip6config = (has_ip6) ? ip6config : NULL; + configs->dns_config = (has_dns) ? dns_config : NULL; configs->plugin = plugin; configs->config = config; g_timeout_add(0, send_config, configs);