summaryrefslogtreecommitdiff
path: root/src/technology.c
diff options
context:
space:
mode:
authorTomasz Bursztyka <tomasz.bursztyka@linux.intel.com>2012-10-15 15:35:21 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-10-16 15:06:30 +0300
commit47f491badb3abce50e805567974893f1e7af15bc (patch)
tree5bbf437b860eb41b6a8c543c61d516a905ac0600 /src/technology.c
parent287c19dc6093d7b55f52741e1af90a742249a534 (diff)
downloadconnman-47f491badb3abce50e805567974893f1e7af15bc.tar.gz
connman-47f491badb3abce50e805567974893f1e7af15bc.tar.bz2
connman-47f491badb3abce50e805567974893f1e7af15bc.zip
technology: Properly handle rfkill driven state
Diffstat (limited to 'src/technology.c')
-rw-r--r--src/technology.c52
1 files changed, 43 insertions, 9 deletions
diff --git a/src/technology.c b/src/technology.c
index 4ae5b865..44eeb136 100644
--- a/src/technology.c
+++ b/src/technology.c
@@ -1198,6 +1198,9 @@ int __connman_technology_remove_device(struct connman_device *device)
static void powered_changed(struct connman_technology *technology)
{
+ if (technology->dbus_registered == FALSE)
+ return;
+
if (technology->pending_reply != NULL) {
g_dbus_send_reply(connection,
technology->pending_reply, DBUS_TYPE_INVALID);
@@ -1235,6 +1238,9 @@ int __connman_technology_enabled(enum connman_service_type type)
if (technology == NULL)
return -ENXIO;
+ if (technology->rfkill_driven == TRUE)
+ return 0;
+
return technology_enabled(technology);
}
@@ -1254,11 +1260,22 @@ static int technology_disabled(struct connman_technology *technology)
int __connman_technology_disabled(enum connman_service_type type)
{
struct connman_technology *technology;
+ GSList *list;
technology = technology_find(type);
if (technology == NULL)
return -ENXIO;
+ if (technology->rfkill_driven == TRUE)
+ return 0;
+
+ for (list = technology->device_list; list != NULL; list = list->next) {
+ struct connman_device *device = list->data;
+
+ if (connman_device_get_powered(device) == TRUE)
+ return 0;
+ }
+
return technology_disabled(technology);
}
@@ -1325,6 +1342,7 @@ static connman_bool_t technology_apply_rfkill_change(struct connman_technology *
connman_bool_t softblock,
connman_bool_t hardblock)
{
+ gboolean hardblock_changed = FALSE;
gboolean apply = TRUE;
GList *start, *list;
@@ -1348,19 +1366,35 @@ static connman_bool_t technology_apply_rfkill_change(struct connman_technology *
goto softblock_change;
technology->hardblocked = hardblock;
-
- if (hardblock == TRUE) {
- DBG("%s is switched off.", get_name(technology->type));
- technology_disable(technology);
- technology_dbus_unregister(technology);
- } else {
- technology_enable(technology);
- technology_dbus_register(technology);
- }
+ hardblock_changed = TRUE;
softblock_change:
+ if (apply == FALSE && technology->softblocked != softblock)
+ apply = TRUE;
+
+ if (apply == FALSE)
+ return technology->hardblocked;
+
technology->softblocked = softblock;
+ if (technology->hardblocked == TRUE ||
+ technology->softblocked == TRUE) {
+ if (technology_disabled(technology) != -EALREADY)
+ technology_affect_devices(technology, FALSE);
+ } else if (technology->hardblocked == FALSE &&
+ technology->softblocked == FALSE) {
+ if (technology_enabled(technology) != -EALREADY)
+ technology_affect_devices(technology, TRUE);
+ }
+
+ if (hardblock_changed == TRUE) {
+ if (technology->hardblocked == TRUE) {
+ DBG("%s is switched off.", get_name(technology->type));
+ technology_dbus_unregister(technology);
+ } else
+ technology_dbus_register(technology);
+ }
+
return technology->hardblocked;
}