main: Use 'NetworkInterfaceBlacklist' string everywhere
[framework/connectivity/connman.git] / src / config.c
index 6af979d..5363dc3 100644 (file)
@@ -68,6 +68,7 @@ static int inotify_wd = -1;
 
 static GIOChannel *inotify_channel = NULL;
 static uint inotify_watch = 0;
+static connman_bool_t cleanup = FALSE;
 
 #define INTERNAL_CONFIG_PREFIX           "__internal"
 
@@ -133,6 +134,9 @@ static void unregister_service(gpointer data)
        char *service_id;
        GSList *list;
 
+       if (cleanup == TRUE)
+               goto free_only;
+
        connman_info("Removing service configuration %s",
                                                config_service->ident);
 
@@ -154,6 +158,7 @@ static void unregister_service(gpointer data)
                                                                service_id);
        }
 
+free_only:
        g_free(config_service->ident);
        g_free(config_service->type);
        g_free(config_service->name);
@@ -624,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);
+                               }
                        }
                }
 
@@ -712,10 +728,14 @@ void __connman_config_cleanup(void)
 {
        DBG("");
 
+       cleanup = TRUE;
+
        remove_watch();
 
        g_hash_table_destroy(config_table);
        config_table = NULL;
+
+       cleanup = FALSE;
 }
 
 static char *config_pem_fsid(const char *pem_file)
@@ -864,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);
 
@@ -901,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;
 }