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