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: recomputing the hardblocked state.
---
 src/technology.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/technology.c b/src/technology.c
index ff0e134..61634e8 100644
--- a/src/technology.c
+++ b/src/technology.c
@@ -1344,6 +1344,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;
 
@@ -1517,6 +1521,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;
-- 
1.7.12

_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to