Пример #1
0
void __connman_notifier_disable(enum connman_service_type type)
{
	DBG("type %d", type);

	__sync_synchronize();
	if (enabled[type] == 0) {
		connman_error("notifier disable underflow");
		return;
	}

	switch (type) {
	case CONNMAN_SERVICE_TYPE_UNKNOWN:
	case CONNMAN_SERVICE_TYPE_SYSTEM:
	case CONNMAN_SERVICE_TYPE_GPS:
	case CONNMAN_SERVICE_TYPE_VPN:
	case CONNMAN_SERVICE_TYPE_GADGET:
		return;
	case CONNMAN_SERVICE_TYPE_ETHERNET:
	case CONNMAN_SERVICE_TYPE_WIFI:
	case CONNMAN_SERVICE_TYPE_WIMAX:
	case CONNMAN_SERVICE_TYPE_BLUETOOTH:
	case CONNMAN_SERVICE_TYPE_CELLULAR:
		break;
	}

	if (__sync_fetch_and_sub(&enabled[type], 1) != 1)
		return;

	technology_enabled(type, FALSE);
}
Пример #2
0
void __connman_notifier_disable(enum connman_service_type type)
{
	DBG("type %d", type);

	if (g_atomic_int_get(&enabled[type]) == 0) {
		connman_error("notifier disable underflow");
		return;
	}

	switch (type) {
	case CONNMAN_SERVICE_TYPE_UNKNOWN:
	case CONNMAN_SERVICE_TYPE_SYSTEM:
	case CONNMAN_SERVICE_TYPE_GPS:
	case CONNMAN_SERVICE_TYPE_VPN:
	case CONNMAN_SERVICE_TYPE_GADGET:
		return;
	case CONNMAN_SERVICE_TYPE_ETHERNET:
	case CONNMAN_SERVICE_TYPE_WIFI:
	case CONNMAN_SERVICE_TYPE_WIMAX:
	case CONNMAN_SERVICE_TYPE_BLUETOOTH:
	case CONNMAN_SERVICE_TYPE_CELLULAR:
		break;
	}

	if (g_atomic_int_dec_and_test(&enabled[type]) == TRUE)
		technology_enabled(type, FALSE);
}
Пример #3
0
int __connman_technology_enabled(enum connman_service_type type)
{
	struct connman_technology *technology;

	technology = technology_find(type);
	if (technology == NULL)
		return -ENXIO;

	if (technology->rfkill_driven == TRUE)
		return 0;

	return technology_enabled(technology);
}
Пример #4
0
int __connman_technology_enabled(enum connman_service_type type)
{
	struct connman_technology *technology;

	technology = technology_find(type);
	if (technology == NULL)
		return -ENXIO;

	DBG("technology %p type %s rfkill %d enabled %d", technology,
		get_name(type), technology->rfkill_driven,
		technology->enabled);

	if (technology->rfkill_driven == TRUE) {
		if (technology->tethering_persistent == TRUE)
			enable_tethering(technology);
		return 0;
	}

	return technology_enabled(technology);
}
Пример #5
0
void __connman_notifier_enable(enum connman_service_type type)
{
	DBG("type %d", type);

	switch (type) {
	case CONNMAN_SERVICE_TYPE_UNKNOWN:
	case CONNMAN_SERVICE_TYPE_SYSTEM:
	case CONNMAN_SERVICE_TYPE_GPS:
	case CONNMAN_SERVICE_TYPE_VPN:
	case CONNMAN_SERVICE_TYPE_GADGET:
		return;
	case CONNMAN_SERVICE_TYPE_ETHERNET:
	case CONNMAN_SERVICE_TYPE_WIFI:
	case CONNMAN_SERVICE_TYPE_WIMAX:
	case CONNMAN_SERVICE_TYPE_BLUETOOTH:
	case CONNMAN_SERVICE_TYPE_CELLULAR:
		break;
	}

	if (__sync_fetch_and_add(&enabled[type], 1) == 0)
		technology_enabled(type, TRUE);
}
Пример #6
0
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;
}