From: Jukka Rissanen Date: Tue, 5 Jun 2012 08:24:06 +0000 (+0300) Subject: config: Remove service if config file is removed X-Git-Tag: 1.2~71 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=39024fee448005d8443bd44b80243d38ff862797;p=platform%2Fupstream%2Fconnman.git config: Remove service if config file is removed If the user removes the config file, we disconnect and then try to remove the corresponding service directory and all known files (settings and data). --- diff --git a/src/config.c b/src/config.c index ba46366..9931621 100644 --- a/src/config.c +++ b/src/config.c @@ -48,6 +48,7 @@ struct connman_config_service { char *private_key_passphrase_type; char *phase2; char *passphrase; + GSList *service_identifiers; }; struct connman_config { @@ -125,26 +126,47 @@ static void unregister_config(gpointer data) static void unregister_service(gpointer data) { - struct connman_config_service *service = data; - - connman_info("Removing service configuration %s", service->ident); - - protected_services = g_slist_remove(protected_services, service); - - g_free(service->ident); - g_free(service->type); - g_free(service->name); - g_free(service->ssid); - g_free(service->eap); - g_free(service->identity); - g_free(service->ca_cert_file); - g_free(service->client_cert_file); - g_free(service->private_key_file); - g_free(service->private_key_passphrase); - g_free(service->private_key_passphrase_type); - g_free(service->phase2); - g_free(service->passphrase); - g_free(service); + struct connman_config_service *config_service = data; + struct connman_service *service; + char *service_id; + GSList *list; + + connman_info("Removing service configuration %s", + config_service->ident); + + protected_services = g_slist_remove(protected_services, + config_service); + + for (list = config_service->service_identifiers; list != NULL; + list = list->next) { + service_id = list->data; + + service = __connman_service_lookup_from_ident(service_id); + if (service != NULL) { + __connman_service_set_immutable(service, FALSE); + __connman_service_remove(service); + } + + if (__connman_storage_remove_service(service_id) == FALSE) + DBG("Could not remove all files for service %s", + service_id); + } + + g_free(config_service->ident); + g_free(config_service->type); + g_free(config_service->name); + g_free(config_service->ssid); + g_free(config_service->eap); + g_free(config_service->identity); + g_free(config_service->ca_cert_file); + g_free(config_service->client_cert_file); + g_free(config_service->private_key_file); + g_free(config_service->private_key_passphrase); + g_free(config_service->private_key_passphrase_type); + g_free(config_service->phase2); + g_free(config_service->passphrase); + g_slist_free_full(config_service->service_identifiers, g_free); + g_free(config_service); } static void check_keys(GKeyFile *keyfile, const char *group, @@ -714,7 +736,7 @@ static void provision_service(gpointer key, gpointer value, gpointer user_data) struct connman_service *service = user_data; struct connman_config_service *config = value; struct connman_network *network; - const void *ssid; + const void *ssid, *service_id; unsigned int ssid_len; /* For now only WiFi service entries are supported */ @@ -739,6 +761,11 @@ static void provision_service(gpointer key, gpointer value, gpointer user_data) if (memcmp(config->ssid, ssid, ssid_len) != 0) return; + service_id = __connman_service_get_ident(service); + config->service_identifiers = + g_slist_prepend(config->service_identifiers, + g_strdup(service_id)); + __connman_service_set_immutable(service, TRUE); __connman_service_set_favorite(service, TRUE);