If harblocked and a new device is inserted and detected as not hardblocked,
then it will be possible to enable/disable it (soft rfkill) independantly to
the main hw rfkill switch. It applies also when ConnMan starts, so it gets the
right hardblocked state.
---
 src/technology.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/src/technology.c b/src/technology.c
index 61634e8..4ef26b3 100644
--- a/src/technology.c
+++ b/src/technology.c
@@ -1338,7 +1338,8 @@ void __connman_technology_set_connected(enum 
connman_service_type type,
 
 static connman_bool_t technology_apply_rfkill_change(struct connman_technology 
*technology,
                                                connman_bool_t softblock,
-                                               connman_bool_t hardblock)
+                                               connman_bool_t hardblock,
+                                               connman_bool_t new_rfkill)
 {
        gboolean hardblock_changed = FALSE;
        gboolean apply = TRUE;
@@ -1351,18 +1352,21 @@ static connman_bool_t 
technology_apply_rfkill_change(struct connman_technology *
        if (technology->hardblocked == hardblock)
                goto softblock_change;
 
-       start = g_hash_table_get_values(rfkill_list);
-       for (list = start; list != NULL; list = list->next) {
-               struct connman_rfkill *rfkill = list->data;
+       if (!(new_rfkill == TRUE && hardblock == FALSE)) {
+               start = g_hash_table_get_values(rfkill_list);
 
-               if (rfkill->type != technology->type)
-                       continue;
+               for (list = start; list != NULL; list = list->next) {
+                       struct connman_rfkill *rfkill = list->data;
 
-               if (rfkill->hardblock != hardblock)
-                       apply = FALSE;
-       }
+                       if (rfkill->type != technology->type)
+                               continue;
 
-       g_list_free(start);
+                       if (rfkill->hardblock != hardblock)
+                               apply = FALSE;
+               }
+
+               g_list_free(start);
+       }
 
        if (apply == FALSE)
                goto softblock_change;
@@ -1436,7 +1440,7 @@ done:
 
        /* If hardblocked, there is no need to handle softblocked state */
        if (technology_apply_rfkill_change(technology,
-                                       softblock, hardblock) == TRUE)
+                               softblock, hardblock, TRUE) == TRUE)
                return 0;
 
        /*
@@ -1483,7 +1487,7 @@ int __connman_technology_update_rfkill(unsigned int index,
 
        /* If hardblocked, there is no need to handle softblocked state */
        if (technology_apply_rfkill_change(technology,
-                                       softblock, hardblock) == TRUE)
+                               softblock, hardblock, FALSE) == TRUE)
                return 0;
 
        if (global_offlinemode == TRUE)
@@ -1522,7 +1526,7 @@ int __connman_technology_remove_rfkill(unsigned int index,
                return -ENXIO;
 
        technology_apply_rfkill_change(technology,
-                       technology->softblocked, !technology->hardblocked);
+               technology->softblocked, !technology->hardblocked, FALSE);
 
        technology_put(technology);
 
-- 
1.7.12

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

Reply via email to