From 743eb796531e4c8daedd3e1fda1ba9d1293e4a78 Mon Sep 17 00:00:00 2001 From: Tomasz Bursztyka Date: Tue, 2 Oct 2012 12:27:12 +0300 Subject: technology: Link hard rfkill with actual device's state When hardblocking a technology, it should disable the devices which belongs to that technology. When un-hardblocking it should do the same but taking care about user setting (it will enable the devices if only enable_persistent is on). --- src/technology.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'src/technology.c') diff --git a/src/technology.c b/src/technology.c index e9598aa5..24949f25 100644 --- a/src/technology.c +++ b/src/technology.c @@ -577,7 +577,8 @@ static gboolean technology_pending_reply(gpointer user_data) return FALSE; } -static int technology_enable(struct connman_technology *technology) +static int technology_enable(struct connman_technology *technology, + connman_bool_t hardblock) { GSList *list; int err = 0; @@ -595,6 +596,9 @@ static int technology_enable(struct connman_technology *technology) goto done; } + if (hardblock == TRUE && technology->enable_persistent == FALSE) + goto done; + __connman_rfkill_block(technology->type, FALSE); for (list = technology->device_list; list; list = list->next) { @@ -607,7 +611,8 @@ done: return err; } -static int technology_disable(struct connman_technology *technology) +static int technology_disable(struct connman_technology *technology, + connman_bool_t hardblock) { GSList *list; int err = 0; @@ -628,7 +633,8 @@ static int technology_disable(struct connman_technology *technology) if (technology->tethering == TRUE) set_tethering(technology, FALSE); - __connman_rfkill_block(technology->type, TRUE); + if (hardblock == FALSE) + __connman_rfkill_block(technology->type, TRUE); for (list = technology->device_list; list; list = list->next) { struct connman_device *device = list->data; @@ -648,10 +654,10 @@ static DBusMessage *set_powered(struct connman_technology *technology, int err; if (powered == TRUE) { - err = technology_enable(technology); + err = technology_enable(technology, FALSE); persistent = TRUE; } else { - err = technology_disable(technology); + err = technology_disable(technology, FALSE); persistent = FALSE; } @@ -1254,10 +1260,10 @@ int __connman_technology_set_offlinemode(connman_bool_t offlinemode) struct connman_technology *technology = list->data; if (offlinemode) - err = technology_disable(technology); + err = technology_disable(technology, FALSE); if (!offlinemode && technology->enable_persistent) - err = technology_enable(technology); + err = technology_enable(technology, FALSE); } if (err == 0 || err == -EINPROGRESS || err == -EALREADY) { @@ -1314,8 +1320,12 @@ static void technology_apply_hardblock_change(struct connman_technology *technol technology->hardblocked = hardblock; - if (hardblock == TRUE) + if (hardblock == TRUE) { DBG("%s is switched off.", get_name(technology->type)); + technology_disable(technology, TRUE); + } else + technology_enable(technology, TRUE); + } int __connman_technology_add_rfkill(unsigned int index, -- cgit v1.2.3