From cf412a3fd135c0ccf15cea917d38800cce5a4d66 Mon Sep 17 00:00:00 2001 From: Mohamed Abbas Date: Wed, 22 Jun 2011 10:53:04 -0700 Subject: [PATCH] config: Provision service after adding new .config files. For now if new .config files are added connman will create new config and but do not provision existing services. This patch will provision existing service if any config file are added or modified. Fixes bug #4880. --- src/config.c | 22 ++++++++++++++++++++++ src/connman.h | 4 ++++ src/service.c | 13 +++++++++++++ 3 files changed, 39 insertions(+) diff --git a/src/config.c b/src/config.c index 9bfa9ae..90a2180 100644 --- a/src/config.c +++ b/src/config.c @@ -651,6 +651,7 @@ static gboolean inotify_data(GIOChannel *channel, GIOCondition cond, if (config != NULL) { g_hash_table_remove_all(config->service_table); load_config(config); + __connman_service_provision_changed(ident); } } @@ -870,3 +871,24 @@ int __connman_config_provision_service(struct connman_service *service) return 0; } + +int __connman_config_provision_service_ident(struct connman_service *service, + const char *ident) +{ + enum connman_service_type type; + struct connman_config *config; + + DBG("service %p", service); + + /* For now only WiFi services are supported */ + type = connman_service_get_type(service); + if (type != CONNMAN_SERVICE_TYPE_WIFI) + return -ENOSYS; + + config = g_hash_table_lookup(config_table, ident); + if(config != NULL) + g_hash_table_foreach(config->service_table, + provision_service, service); + + return 0; +} diff --git a/src/connman.h b/src/connman.h index b12aa55..fef3ce5 100644 --- a/src/connman.h +++ b/src/connman.h @@ -401,6 +401,8 @@ void __connman_config_cleanup(void); int __connman_config_load_service(GKeyFile *keyfile, const char *group, connman_bool_t persistent); int __connman_config_provision_service(struct connman_service *service); +int __connman_config_provision_service_ident(struct connman_service *service, + const char *ident); #include @@ -508,6 +510,8 @@ int __connman_service_create_and_connect(DBusMessage *msg); int __connman_service_provision(DBusMessage *msg); void __connman_service_auto_connect(void); +void __connman_service_provision_changed(const char *ident); + const char *__connman_service_type2string(enum connman_service_type type); int __connman_service_nameserver_append(struct connman_service *service, diff --git a/src/service.c b/src/service.c index 4b0e725..7c11cfa 100644 --- a/src/service.c +++ b/src/service.c @@ -4235,6 +4235,19 @@ failed: return err; } +static void provision_changed(gpointer value, gpointer user_data) +{ + struct connman_service *service = value; + char *path = user_data; + + __connman_config_provision_service_ident(service, path); +} + +void __connman_service_provision_changed(const char *ident) +{ + g_sequence_foreach(service_list, provision_changed, (void *)ident); +} + int __connman_service_provision(DBusMessage *msg) { GKeyFile *keyfile = NULL; -- 2.7.4