From: Daniel Wagner <[email protected]>
---
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
[email protected]
http://lists.connman.net/listinfo/connman