config: Check if we need to rescan the config file for any changes
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Tue, 5 Jun 2012 08:24:18 +0000 (11:24 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Mon, 11 Jun 2012 10:05:36 +0000 (13:05 +0300)
src/config.c
src/connman.h
src/service.c

index b304645..5363dc3 100644 (file)
@@ -629,9 +629,20 @@ static gboolean inotify_data(GIOChannel *channel, GIOCondition cond,
 
                        config = g_hash_table_lookup(config_table, ident);
                        if (config != NULL) {
+                               int ret;
+
                                g_hash_table_remove_all(config->service_table);
                                load_config(config);
-                               __connman_service_provision_changed(ident);
+                               ret = __connman_service_provision_changed(ident);
+                               if (ret > 0) {
+                                       /*
+                                        * Re-scan the config file for any
+                                        * changes
+                                        */
+                                       g_hash_table_remove_all(config->service_table);
+                                       load_config(config);
+                                       __connman_service_provision_changed(ident);
+                               }
                        }
                }
 
@@ -873,6 +884,7 @@ int __connman_config_provision_service_ident(struct connman_service *service,
 {
        enum connman_service_type type;
        struct connman_config *config;
+       int ret = 0;
 
        DBG("service %p", service);
 
@@ -910,17 +922,19 @@ int __connman_config_provision_service_ident(struct connman_service *service,
                        DBG("found %d ident %s file %s entry %s", found, ident,
                                                                file, entry);
 
-                       if (found == FALSE)
+                       if (found == FALSE) {
                                /*
                                 * The entry+8 will skip "service_" prefix
                                 */
                                g_hash_table_remove(config->service_table,
                                                entry + 8);
+                               ret = 1;
+                       }
                }
 
                g_hash_table_foreach(config->service_table,
                                                provision_service, service);
        }
 
-       return 0;
+       return ret;
 }
index 930dd4e..adfdcea 100644 (file)
@@ -625,7 +625,7 @@ int __connman_service_disconnect_all(void);
 void __connman_service_auto_connect(void);
 gboolean __connman_service_remove(struct connman_service *service);
 
-void __connman_service_provision_changed(const char *ident);
+int __connman_service_provision_changed(const char *ident);
 void __connman_service_set_config(struct connman_service *service,
                                const char *file_id, const char *section);
 
index f9fbe9d..c225af5 100644 (file)
@@ -5500,18 +5500,32 @@ static struct connman_service *lookup_by_identifier(const char *identifier)
        return NULL;
 }
 
+struct provision_user_data {
+       const char *ident;
+       int ret;
+};
+
 static void provision_changed(gpointer value, gpointer user_data)
 {
        struct connman_service *service = value;
-       char *path = user_data;
+       struct provision_user_data *data = user_data;
+       const char *path = data->ident;
+       int ret;
 
-       __connman_config_provision_service_ident(service, path,
+       ret = __connman_config_provision_service_ident(service, path,
                        service->config_file, service->config_entry);
+       if (ret > 0)
+               data->ret = ret;
 }
 
-void __connman_service_provision_changed(const char *ident)
+int __connman_service_provision_changed(const char *ident)
 {
-       g_sequence_foreach(service_list, provision_changed, (void *)ident);
+       struct provision_user_data data = {
+               .ident = ident,
+               .ret = 0
+       };
+
+       g_sequence_foreach(service_list, provision_changed, (void *)&data);
 
        /*
         * Because the provision_changed() might have set some services
@@ -5527,6 +5541,8 @@ void __connman_service_provision_changed(const char *ident)
 
                __connman_connection_update_gateway();
        }
+
+       return data.ret;
 }
 
 void __connman_service_set_config(struct connman_service *service,