Example #1
0
void btd_manager_set_offline(gboolean offline)
{
	GSList *l;

	for (l = adapters; l != NULL; l = g_slist_next(l)) {
		struct btd_adapter *adapter = l->data;

		if (offline)
			btd_adapter_switch_offline(adapter);
		else
			btd_adapter_restore_powered(adapter);
	}
}
static gboolean rfkill_event(GIOChannel *chan,
				GIOCondition cond, gpointer data)
{
	unsigned char buf[32];
	struct rfkill_event *event = (void *) buf;
	struct btd_adapter *adapter;
	char sysname[PATH_MAX];
	ssize_t len;
	int fd, id;

	if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
		return FALSE;

	fd = g_io_channel_unix_get_fd(chan);

	memset(buf, 0, sizeof(buf));

	len = read(fd, buf, sizeof(buf));
	if (len < 0) {
		if (errno == EAGAIN)
			return TRUE;
		return FALSE;
	}

	if (len != sizeof(struct rfkill_event))
		return TRUE;

	DBG("RFKILL event idx %u type %u op %u soft %u hard %u",
					event->idx, event->type, event->op,
						event->soft, event->hard);

	if (event->soft || event->hard)
		return TRUE;

	if (event->op != RFKILL_OP_CHANGE)
		return TRUE;

	if (event->type != RFKILL_TYPE_BLUETOOTH &&
					event->type != RFKILL_TYPE_ALL)
		return TRUE;

	snprintf(sysname, sizeof(sysname) - 1,
			"/sys/class/rfkill/rfkill%u/name", event->idx);

	fd = open(sysname, O_RDONLY);
	if (fd < 0)
		return TRUE;

	memset(sysname, 0, sizeof(sysname));

	if (read(fd, sysname, sizeof(sysname)) < 4) {
		close(fd);
		return TRUE;
	}

	close(fd);

	if (g_str_has_prefix(sysname, "hci") == FALSE)
		return TRUE;

	id = atoi(sysname + 3);
	if (id < 0)
		return TRUE;

	adapter = manager_find_adapter_by_id(id);
	if (!adapter)
		return TRUE;

	DBG("RFKILL unblock for hci%d", id);

	btd_adapter_restore_powered(adapter);

	return TRUE;
}