technology: Recompute hardblocked state on rfkill remove event
authorTomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Mon, 15 Oct 2012 12:35:22 +0000 (15:35 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Tue, 16 Oct 2012 12:07:14 +0000 (15:07 +0300)
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

index 44eeb13..976964a 100644 (file)
@@ -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;