From bd3fe70bd9fadaa7bda00079822a8b7b75a76050 Mon Sep 17 00:00:00 2001 From: Tomasz Bursztyka Date: Mon, 15 Oct 2012 15:35:22 +0300 Subject: technology: Recompute hardblocked state on rfkill remove event This fixes the case of cascading rfkill switches: if enabled, hard rfkilling such technology might generate contradictory events. 1 - first all switches are hardblocked 2 - then one of these switch (usually: device's switch) gets fully unblocked 3 - then this same switch gets removed Step 2 is in contradiction with step 1, so we need to care about such switch getting removed by recomputing the hardblocked state. --- src/technology.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/technology.c b/src/technology.c index 44eeb136..976964a7 100644 --- a/src/technology.c +++ b/src/technology.c @@ -1346,6 +1346,10 @@ static connman_bool_t technology_apply_rfkill_change(struct connman_technology * gboolean apply = TRUE; GList *start, *list; + DBG("technology %p --> %d/%d vs %d/%d", + technology, softblock, hardblock, + technology->softblocked, technology->hardblocked); + if (technology->hardblocked == hardblock) goto softblock_change; @@ -1519,6 +1523,9 @@ int __connman_technology_remove_rfkill(unsigned int index, if (technology == NULL) return -ENXIO; + technology_apply_rfkill_change(technology, + technology->softblocked, !technology->hardblocked); + technology_put(technology); return 0; -- cgit v1.2.3