From: Daniel Wagner <daniel.wag...@bmw-carit.de>

---
 plugins/openvpn.c |   45 ++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/plugins/openvpn.c b/plugins/openvpn.c
index 60e75dc..0eaa2cb 100644
--- a/plugins/openvpn.c
+++ b/plugins/openvpn.c
@@ -37,6 +37,7 @@
 #include <connman/log.h>
 #include <connman/task.h>
 #include <connman/dbus.h>
+#include <connman/ipconfig.h>
 
 #include "vpn.h"
 
@@ -92,12 +93,34 @@ static void ov_append_dns_entries(const char *key, const 
char *value,
        g_strfreev(options);
 }
 
+static void ov_set_nameserver(struct connman_provider *provider,
+                               const char *key, const char *value)
+{
+       gchar **options;
+
+       if (g_str_has_prefix(key, "foreign_option_") == FALSE)
+               return;
+
+       options = g_strsplit(value, " ", 3);
+       if (options[0] != NULL &&
+               !strcmp(options[0], "dhcp-option") &&
+                       options[1] != NULL &&
+                       !strcmp(options[1], "DNS") &&
+                               options[2] != NULL) {
+               connman_provider_nameserver_append(provider, options[2]);
+       }
+
+       g_strfreev(options);
+}
+
+
 static int ov_notify(DBusMessage *msg, struct connman_provider *provider)
 {
        DBusMessageIter iter, dict;
        const char *reason, *key, *value;
        const char *domain = NULL;
        char *dns_entries = NULL;
+       struct connman_ipaddress *ipaddress;
 
        dbus_message_iter_init(msg, &iter);
 
@@ -112,6 +135,11 @@ static int ov_notify(DBusMessage *msg, struct 
connman_provider *provider)
        if (strcmp(reason, "up"))
                return VPN_STATE_DISCONNECT;
 
+
+       ipaddress = connman_ipaddress_alloc(CONNMAN_IPCONFIG_TYPE_IPV4);
+       if (ipaddress == NULL)
+               return VPN_STATE_FAILURE;
+
        domain = connman_provider_get_string(provider, "VPN.Domain");
 
        dbus_message_iter_recurse(&iter, &dict);
@@ -126,19 +154,26 @@ static int ov_notify(DBusMessage *msg, struct 
connman_provider *provider)
 
                DBG("%s = %s", key, value);
 
-               if (!strcmp(key, "trusted_ip"))
+               if (!strcmp(key, "trusted_ip")) {
                        connman_provider_set_string(provider, "Gateway", value);
+                       ipaddress->gateway = g_strdup(value);
+               }
 
-               if (!strcmp(key, "ifconfig_local"))
+               if (!strcmp(key, "ifconfig_local")) {
                        connman_provider_set_string(provider, "Address", value);
+                       ipaddress->local = g_strdup(value);
+               }
 
-               if (!strcmp(key, "ifconfig_remote"))
+               if (!strcmp(key, "ifconfig_remote")) {
                        connman_provider_set_string(provider, "Peer", value);
+                       ipaddress->peer = g_strdup(value);
+               }
 
                if (g_str_has_prefix(key, "route_") == TRUE)
                        connman_provider_append_route(provider, key, value);
 
                ov_append_dns_entries(key, value, &dns_entries);
+               ov_set_nameserver(provider, key, value);
 
                dbus_message_iter_next(&dict);
        }
@@ -148,6 +183,10 @@ static int ov_notify(DBusMessage *msg, struct 
connman_provider *provider)
                g_free(dns_entries);
        }
 
+       connman_provider_set_ipaddress(provider, ipaddress);
+
+       connman_ipaddress_free(ipaddress);
+
        return VPN_STATE_CONNECT;
 }
 
-- 
1.7.4

_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to