+static connman_bool_t technology_apply_rfkill_change(struct connman_technology *technology,
+ connman_bool_t softblock,
+ connman_bool_t hardblock,
+ connman_bool_t new_rfkill)
+{
+ gboolean hardblock_changed = FALSE;
+ 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;
+
+ if (!(new_rfkill == TRUE && hardblock == FALSE)) {
+ start = g_hash_table_get_values(rfkill_list);
+
+ for (list = start; list != NULL; list = list->next) {
+ struct connman_rfkill *rfkill = list->data;
+
+ if (rfkill->type != technology->type)
+ continue;
+
+ if (rfkill->hardblock != hardblock)
+ apply = FALSE;
+ }
+
+ g_list_free(start);
+ }
+
+ if (apply == FALSE)
+ goto softblock_change;
+
+ technology->hardblocked = hardblock;
+ 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;
+}
+