On Fri, 2016-02-26 at 10:57 +0100, Marco Maniezzo wrote:
---
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);
There can be more than one services specified in the same configuration
file. With the above all other services will also be disrupted, which is
not nice if another service is connected while trying to remove the
other one from the same file.
+}
+
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;
+ }
+ }
+
All settings added by the user shall be removed. I wonder if the removal
can be combined with refactored parts of service_free(), as the service
is stripped of all extra values there. When adding the service back in a
fresh state, reprovisioning can be impelmented to happen for just this
service, but it may also be easier to do
__connman_service_create_from_network() here.
+ 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,
Let me think about this a while, meanwhile comments are welcome.
Cheers,
Patrik