---
include/provider.h | 5 +++
src/provider.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 83 insertions(+), 10 deletions(-)
diff --git a/include/provider.h b/include/provider.h
index 4d8131a..47b3758 100644
--- a/include/provider.h
+++ b/include/provider.h
@@ -93,6 +93,9 @@ int connman_provider_set_ipaddress(struct connman_provider
*provider,
struct connman_ipaddress *ipaddress);
int connman_provider_set_pac(struct connman_provider *provider,
const char *pac);
+int connman_provider_create_service(struct connman_provider *provider);
+struct connman_provider *connman_provider_get(const char *identifier);
+void connman_provider_put(struct connman_provider *provider);
int connman_provider_set_domain(struct connman_provider *provider,
const char *domain);
int connman_provider_set_nameservers(struct connman_provider *provider,
@@ -119,6 +122,8 @@ struct connman_provider_driver {
int connman_provider_driver_register(struct connman_provider_driver *driver);
void connman_provider_driver_unregister(struct connman_provider_driver
*driver);
+void connman_provider_set_driver(struct connman_provider *provider,
+ struct connman_provider_driver *driver);
#ifdef __cplusplus
}
diff --git a/src/provider.c b/src/provider.c
index 9d7ceb7..da0227f 100644
--- a/src/provider.c
+++ b/src/provider.c
@@ -28,15 +28,12 @@
#include <string.h>
#include <stdlib.h>
#include <gdbus.h>
-#include <gweb/gresolv.h>
#include "connman.h"
-static DBusConnection *connection = NULL;
-
-static GHashTable *provider_hash = NULL;
-
-static GSList *driver_list = NULL;
+static DBusConnection *connection;
+static GHashTable *provider_hash;
+static GSList *driver_list;
struct connman_route {
int family;
@@ -211,7 +208,10 @@ int __connman_provider_remove(const char *path)
if (g_strcmp0(srv_path, path) == 0) {
DBG("Removing VPN %s", provider->identifier);
- provider_unregister(provider);
+ if (provider->driver != NULL &&
+ provider->driver->remove)
+ provider->driver->remove(provider);
+
g_hash_table_remove(provider_hash,
provider->identifier);
return 0;
@@ -245,12 +245,14 @@ static int set_connected(struct connman_provider
*provider,
provider_indicate_state(provider,
CONNMAN_SERVICE_STATE_READY);
+#if 0
+ // XXX:
g_hash_table_foreach(provider->routes, provider_append_routes,
provider);
g_hash_table_foreach(provider->user_routes,
provider_append_routes,
provider);
-
+#endif
} else {
if (ipconfig != NULL) {
provider_indicate_state(provider,
@@ -316,7 +318,7 @@ int connman_provider_indicate_error(struct connman_provider
*provider,
service_error);
}
-static int provider_create_service(struct connman_provider *provider)
+int connman_provider_create_service(struct connman_provider *provider)
{
if (provider->vpn_service != NULL) {
connman_bool_t connected;
@@ -598,8 +600,74 @@ static void provider_offline_mode(connman_bool_t enabled)
DBG("enabled %d", enabled);
if (enabled == TRUE)
- g_hash_table_foreach(provider_hash, provider_remove_all, NULL);
+ g_hash_table_foreach(provider_hash, provider_disconnect_all,
+ NULL);
+
+}
+
+static void destroy_route(gpointer user_data)
+{
+ struct connman_route *route = user_data;
+
+ g_free(route->host);
+ g_free(route->netmask);
+ g_free(route->gateway);
+ g_free(route);
+}
+
+static void provider_initialize(struct connman_provider *provider)
+{
+ DBG("provider %p", provider);
+
+ provider->index = 0;
+ provider->identifier = NULL;
+ provider->user_networks = NULL;
+ provider->routes = g_hash_table_new_full(g_direct_hash, g_direct_equal,
+ NULL, destroy_route);
+ provider->user_routes = g_hash_table_new_full(g_str_hash, g_str_equal,
+ g_free, destroy_route);
+}
+
+static struct connman_provider *provider_new(void)
+{
+ struct connman_provider *provider;
+
+ provider = g_try_new0(struct connman_provider, 1);
+ if (provider == NULL)
+ return NULL;
+ provider->refcount = 1;
+
+ DBG("provider %p", provider);
+ provider_initialize(provider);
+
+ return provider;
+}
+
+struct connman_provider *connman_provider_get(const char *identifier)
+{
+ struct connman_provider *provider;
+
+ provider = g_hash_table_lookup(provider_hash, identifier);
+ if (provider != NULL)
+ return provider;
+
+ provider = provider_new();
+ if (provider == NULL)
+ return NULL;
+
+ DBG("provider %p", provider);
+
+ provider->identifier = g_strdup(identifier);
+
+ g_hash_table_insert(provider_hash, provider->identifier, provider);
+
+ return provider;
+}
+
+void connman_provider_put(struct connman_provider *provider)
+{
+ g_hash_table_remove(provider_hash, provider->identifier);
}
static struct connman_provider *provider_get(int index)
--
1.7.9.5
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman