---
include/provision.h | 1 +
src/config.c | 9 +++++++++
src/service.c | 35 +++++++++++++++++++++++++++++++----
3 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/include/provision.h b/include/provision.h
index 3eb80a8..040f152 100644
--- a/include/provision.h
+++ b/include/provision.h
@@ -42,6 +42,7 @@ struct connman_config_entry {
bool hidden;
};
+void reload_config(const char * ident);
int connman_config_provision_mutable_service(GKeyFile *keyfile);
struct connman_config_entry **connman_config_get_entries(const char *type);
void connman_config_free_entries(struct connman_config_entry **entries);
diff --git a/src/config.c b/src/config.c
index 344b8ce..da95817 100644
--- a/src/config.c
+++ b/src/config.c
@@ -942,6 +942,15 @@ static void config_notify_handler(struct inotify_event *event,
g_hash_table_remove(config_table, ident);
}
+void reload_config(const char * ident)
+{
+ struct inotify_event event;
+
+ event.mask = IN_MODIFY;
+
+ config_notify_handler(&event,ident);
+}
+
int __connman_config_init(void)
{
DBG("");
diff --git a/src/service.c b/src/service.c
index 8e07337..a0475f2 100644
--- a/src/service.c
+++ b/src/service.c
@@ -34,7 +34,7 @@
#include <connman/storage.h>
#include <connman/setting.h>
#include <connman/agent.h>
-
+#include <connman/provision.h>
#include "connman.h"
#define CONNECT_TIMEOUT 120
@@ -4081,11 +4081,15 @@ static DBusMessage *disconnect_service(DBusConnection *conn,
bool __connman_service_remove(struct connman_service *service)
{
+ unsigned int *auto_connect_types;
+ char *ident;
+ int i;
+
if (service->type == CONNMAN_SERVICE_TYPE_ETHERNET ||
service->type == CONNMAN_SERVICE_TYPE_GADGET)
return false;
- if (service->immutable || service->hidden ||
+ if (service->hidden ||
__connman_provider_is_immutable(service->provider))
return false;
@@ -4116,9 +4120,32 @@ bool __connman_service_remove(struct connman_service *service)
__connman_ipconfig_ipv6_reset_privacy(service->ipconfig_ipv6);
- service_save(service);
+ __connman_storage_remove_service(service->identifier);
- return true;
+ if (service->immutable == true && service->config_file)
+ {/* force reprovision of immutable services */
+
+ /* reset autoconnect to default, because it is not currently (connman 1.31)
+ * managed by .config files
+ */
+ auto_connect_types =
connman_setting_get_uint_list("DefaultAutoConnectTechnologies");
+ service->autoconnect = false;
+ for (i = 0; auto_connect_types &&
+ auto_connect_types[i] != 0; i++) {
+ if (service->type == auto_connect_types[i]) {
+ service->autoconnect = true;
+ break;
+ }
+ }
+
+ DBG("reloading service %s", service->config_file);
+
+ ident = g_strdup_printf("%s.config", service->config_file);
+ reload_config(ident);
+ g_free(ident);
+ }
+
+ return(true);
}
static DBusMessage *remove_service(DBusConnection *conn,
--
1.9.1