亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? device.c

?? 基于LINUX內核驅動的開發
?? C
?? 第 1 頁 / 共 2 頁
字號:
			"Connected",			DBUS_TYPE_INVALID);	/* Replying to the requestor */	send_message_and_unref(idev->conn,		dbus_message_new_method_return(idev->pending_connect));	goto cleanup;failed:	error_connection_attempt_failed(idev->conn,		idev->pending_connect, err);	if (isk > 0)		close(isk);	close(idev->ctrl_sk);	idev->intr_sk = -1;	idev->ctrl_sk = -1;cleanup:	dbus_message_unref(idev->pending_connect);	idev->pending_connect = NULL;	return FALSE;}static gboolean control_connect_cb(GIOChannel *chan,			GIOCondition cond, struct device *idev){	int ret, csk, err;	socklen_t len;	csk = g_io_channel_unix_get_fd(chan);	if (cond & G_IO_NVAL) {		err = EHOSTDOWN;		csk = -1;		goto failed;	}	if (cond & (G_IO_HUP | G_IO_ERR)) {		err = EHOSTDOWN;		error("Hangup or error on HIDP control socket");		goto failed;	}	/* Set HID control channel */	idev->ctrl_sk = csk;	len = sizeof(ret);	if (getsockopt(csk, SOL_SOCKET, SO_ERROR, &ret, &len) < 0) {		err = errno;		error("getsockopt(SO_ERROR): %s (%d)", strerror(err), err);		goto failed;	}	if (ret != 0) {		err = ret;		error("connect(): %s (%d)", strerror(ret), ret);		goto failed;	}	/* Connect to the HID interrupt channel */	if (l2cap_connect(&idev->src, &idev->dst, L2CAP_PSM_HIDP_INTR,				(GIOFunc) interrupt_connect_cb, idev) < 0) {		err = errno;		error("L2CAP connect failed:%s (%d)", strerror(errno), errno);		goto failed;	}	return FALSE;failed:	if (csk > 0)		close(csk);	idev->ctrl_sk = -1;	error_connection_attempt_failed(idev->conn,			idev->pending_connect, err);	dbus_message_unref(idev->pending_connect);	idev->pending_connect = NULL;	return FALSE;}static int fake_disconnect(struct device *idev){	struct fake_input *fake = idev->fake;	if (!fake->io)		return -ENOTCONN;	g_io_channel_close(fake->io);	g_io_channel_unref(fake->io);	fake->io = NULL;	if (fake->uinput >= 0) {		ioctl(fake->uinput, UI_DEV_DESTROY);		close(fake->uinput);		fake->uinput = -1;	}	return 0;}static int disconnect(struct device *idev, uint32_t flags){	struct fake_input *fake = idev->fake;	struct hidp_conndel_req req;	struct hidp_conninfo ci;	int ctl, err;	/* Fake input disconnect */	if (fake) {		err = fake->disconnect(idev);		if (err == 0)			fake->flags &= ~FI_FLAG_CONNECTED;		return err;	}	/* Standard HID disconnect */	if (idev->ctrl_sk >= 0) {		close(idev->ctrl_sk);		idev->ctrl_sk = -1;	}	if (idev->intr_sk >= 0) {		close(idev->intr_sk);		idev->intr_sk = -1;	}	ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HIDP);	if (ctl < 0) {		error("Can't open HIDP control socket");		return -errno;	}	memset(&ci, 0, sizeof(ci));	bacpy(&ci.bdaddr, &idev->dst);	if ((ioctl(ctl, HIDPGETCONNINFO, &ci) < 0) ||				(ci.state != BT_CONNECTED)) {		errno = ENOTCONN;		goto fail;	}	memset(&req, 0, sizeof(req));	bacpy(&req.bdaddr, &idev->dst);	req.flags = flags;	if (ioctl(ctl, HIDPCONNDEL, &req) < 0) {		error("Can't delete the HID device: %s(%d)",				strerror(errno), errno);		goto fail;	}	close(ctl);	return 0;fail:	err = errno;	close(ctl);	errno = err;	return -err;}static int is_connected(struct device *idev){	struct fake_input *fake = idev->fake;	struct hidp_conninfo ci;	int ctl;	/* Fake input */	if (fake)		return fake->flags & FI_FLAG_CONNECTED;	/* Standard HID */	ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HIDP);	if (ctl < 0)		return 0;	memset(&ci, 0, sizeof(ci));	bacpy(&ci.bdaddr, &idev->dst);	if (ioctl(ctl, HIDPGETCONNINFO, &ci) < 0) {		close(ctl);		return 0;	}	close(ctl);	if (ci.state != BT_CONNECTED)		return 0;	else		return 1;}/* * Input Device methods */static DBusHandlerResult device_connect(DBusConnection *conn,					DBusMessage *msg, void *data){	struct device *idev = data;	struct fake_input *fake = idev->fake;	if (idev->pending_connect)		return error_in_progress(conn, msg,				"Device connection already in progress");	if (is_connected(idev))		return error_already_connected(conn, msg);	idev->pending_connect = dbus_message_ref(msg);	/* Fake input device */	if (fake) {		if (fake->connect(idev) < 0) {			int err = errno;			const char *str = strerror(err);			error("Connect failed: %s(%d)", str, err);			dbus_message_unref(idev->pending_connect);			idev->pending_connect = NULL;			return error_connection_attempt_failed(conn,					msg, err);		}		fake->flags |= FI_FLAG_CONNECTED;		return DBUS_HANDLER_RESULT_HANDLED;	}	/* HID devices */	if (l2cap_connect(&idev->src, &idev->dst, L2CAP_PSM_HIDP_CTRL,				(GIOFunc) control_connect_cb, idev) < 0) {		int err = errno;		error("L2CAP connect failed: %s(%d)", strerror(err), err);		dbus_message_unref(idev->pending_connect);		idev->pending_connect = NULL;		return error_connection_attempt_failed(conn, msg, err);	}	return DBUS_HANDLER_RESULT_HANDLED;}static DBusHandlerResult device_disconnect(DBusConnection *conn,						DBusMessage *msg, void *data){	struct device *idev = data;	if (disconnect(idev, 0) < 0)		return error_failed_errno(conn, msg, errno);	/* Replying to the requestor */	return send_message_and_unref(conn,			dbus_message_new_method_return(msg));}static DBusHandlerResult device_is_connected(DBusConnection *conn,						DBusMessage *msg, void *data){	struct device *idev = data;	DBusMessage *reply;	dbus_bool_t connected;	connected = is_connected(idev);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply,			DBUS_TYPE_BOOLEAN, &connected,			DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult device_get_adapter(DBusConnection *conn,						DBusMessage *msg, void *data){	struct device *idev = data;	DBusMessage *reply;	char addr[18];	const char *paddr = addr;	ba2str(&idev->src, addr);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply,			DBUS_TYPE_STRING, &paddr,			DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult device_get_address(DBusConnection *conn,						DBusMessage *msg, void *data){	struct device *idev = data;	DBusMessage *reply;	char addr[18];	const char *paddr = addr;	ba2str(&idev->dst, addr);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply,			DBUS_TYPE_STRING, &paddr,			DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult device_get_name(DBusConnection *conn,						DBusMessage *msg, void *data){	struct device *idev = data;	DBusMessage *reply;	const char *pname = (idev->name ? idev->name : "");	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply,			DBUS_TYPE_STRING, &pname,			DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult device_get_product_id(DBusConnection *conn,						DBusMessage *msg, void *data){	struct device *idev = data;	DBusMessage *reply;	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply,			DBUS_TYPE_UINT16, &idev->product,			DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult device_get_vendor_id(DBusConnection *conn,						DBusMessage *msg, void *data){	struct device *idev = data;	DBusMessage *reply;	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply,			DBUS_TYPE_UINT16, &idev->vendor,			DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static void device_unregister(DBusConnection *conn, void *data){	struct device *idev = data;	/* Disconnect if applied */	disconnect(idev, (1 << HIDP_VIRTUAL_CABLE_UNPLUG));	device_free(idev);}static DBusMethodVTable device_methods[] = {	{ "Connect",		device_connect,		"",	"" 	},	{ "Disconnect",		device_disconnect,	"",	"" 	},	{ "IsConnected",	device_is_connected,	"",	"b"	},	{ "GetAdapter",		device_get_adapter,	"",	"s"	},	{ "GetAddress",		device_get_address,	"",	"s"	},	{ "GetName",		device_get_name,	"",	"s"	},	{ "GetProductId",	device_get_product_id,	"",	"q"	},	{ "GetVendorId",	device_get_vendor_id,	"",	"q"	},	{ NULL, NULL, NULL, NULL }};static DBusSignalVTable device_signals[] = {	{ "Connected",		""	},	{ "Disconnected",	""	},	{ NULL, NULL }};/* * Input registration functions */static int register_path(DBusConnection *conn, const char *path, struct device *idev){	if (!dbus_connection_create_object_path(conn, path,						idev, device_unregister)) {		error("Input device path registration failed");		return -EINVAL;	}	if (!dbus_connection_register_interface(conn, path,						INPUT_DEVICE_INTERFACE,						device_methods,						device_signals, NULL)) {		error("Failed to register %s interface to %s",				INPUT_DEVICE_INTERFACE, path);		dbus_connection_destroy_object_path(conn, path);		return -1;	}	devices = g_slist_append(devices, idev);	info("Created input device: %s", path);	return 0;}int input_device_register(DBusConnection *conn, bdaddr_t *src, bdaddr_t *dst,				struct hidp_connadd_req *hid, const char **ppath){	struct device *idev;	const char *path;	int err;	idev = device_new(src, dst, hid->subclass);	if (!idev)		return -EINVAL;	path = create_input_path(idev->major, idev->minor);	if (!path) {		device_free(idev);		return -EINVAL;	}	idev->path	= g_strdup(path);	idev->product	= hid->product;	idev->vendor	= hid->vendor;	idev->conn	= dbus_connection_ref(conn);	err = register_path(conn, path, idev);	if (!err && ppath)		*ppath = path;	return err;}int fake_input_register(DBusConnection *conn, bdaddr_t *src,			bdaddr_t *dst, uint8_t ch, const char **ppath){	struct device *idev;	const char *path;	int err;	idev = device_new(src, dst, 0);	if (!idev)		return -EINVAL;	path = create_input_path(idev->major, idev->minor);	if (!path) {		device_free(idev);		return -EINVAL;	}	idev->path = g_strdup(path);	idev->conn = dbus_connection_ref(conn);	/* FIXME: Missing set product and vendor */	idev->fake = g_new0(struct fake_input, 1);	idev->fake->ch = ch;	idev->fake->connect = rfcomm_connect;	idev->fake->disconnect = fake_disconnect;	err = register_path(conn, path, idev);	if (!err && ppath)		*ppath = path;	return err;}int input_device_unregister(DBusConnection *conn, const char *path){	struct device *idev;	if (!dbus_connection_get_object_user_data(conn,				path, (void *) &idev) || !idev)		return -EINVAL;	if (idev->pending_connect) {		/* Pending connection running */		return -EBUSY;	}	del_stored_device_info(&idev->src, &idev->dst);	devices = g_slist_remove(devices, idev);	/*	 * Workaround: if connected, the watch will not be able	 * to access the D-Bus data assigned to this path	 * because the object path data was destroyed.	 */	if (idev->ctrl_watch)		g_source_remove(idev->ctrl_watch);	if (idev->intr_watch) {		g_source_remove(idev->intr_watch);		dbus_connection_emit_signal(conn,				path,				INPUT_DEVICE_INTERFACE,				"Disconnected",				DBUS_TYPE_INVALID);	}	dbus_connection_destroy_object_path(conn, path);	dbus_connection_emit_signal(conn, INPUT_PATH,			INPUT_MANAGER_INTERFACE, "DeviceRemoved" ,			DBUS_TYPE_STRING, &path,			DBUS_TYPE_INVALID);	return 0;}int l2cap_connect(bdaddr_t *src, bdaddr_t *dst, unsigned short psm,						GIOFunc cb, void *data){	GIOChannel *io;	struct sockaddr_l2 addr;	struct l2cap_options opts;	int sk, err;	sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);	if (sk < 0)		return -1;	memset(&addr, 0, sizeof(addr));	addr.l2_family  = AF_BLUETOOTH;	bacpy(&addr.l2_bdaddr, src);	if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0)		goto failed;	if (set_nonblocking(sk) < 0)		goto failed;	memset(&opts, 0, sizeof(opts));#if 0	opts.imtu = HIDP_DEFAULT_MTU;	opts.omtu = HIDP_DEFAULT_MTU;	opts.flush_to = 0xffff;	if (setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, sizeof(opts)) < 0)		goto failed;#endif	memset(&addr, 0, sizeof(addr));	addr.l2_family  = AF_BLUETOOTH;	bacpy(&addr.l2_bdaddr, dst);	addr.l2_psm = htobs(psm);	io = g_io_channel_unix_new(sk);	g_io_channel_set_close_on_unref(io, FALSE);	if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {		if (!(errno == EAGAIN || errno == EINPROGRESS)) {			g_io_channel_unref(io);			goto failed;		}		g_io_add_watch(io, G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL,				(GIOFunc) cb, data);	} else		cb(io, G_IO_OUT, data);	g_io_channel_unref(io);	return 0;failed:	err = errno;	close(sk);	errno = err;	return -1;}static struct device *find_device(bdaddr_t *src, bdaddr_t *dst){	struct device *idev;	GSList *list;	for (list = devices; list != NULL; list = list->next) {		idev = list->data;		if (!bacmp(&idev->src, src) && !bacmp(&idev->dst, dst))			return idev;	}	return NULL;}gboolean input_device_is_registered(bdaddr_t *src, bdaddr_t *dst){	struct device *idev = find_device(src, dst);	if (!idev)		return FALSE;	else		return TRUE;}int input_device_set_channel(bdaddr_t *src, bdaddr_t *dst, int psm, int nsk){	struct device *idev = find_device(src, dst);	if (!idev)		return -ENOENT;	switch (psm) {	case L2CAP_PSM_HIDP_CTRL:		idev->ctrl_sk = nsk;		break;	case L2CAP_PSM_HIDP_INTR:		idev->intr_sk = nsk;		break;	}	return 0;}int input_device_close_channels(bdaddr_t *src, bdaddr_t *dst){	struct device *idev = find_device(src, dst);	if (!idev)		return -ENOENT;	if (idev->ctrl_sk >= 0) {		close(idev->ctrl_sk);		idev->ctrl_sk = -1;	}	if (idev->intr_sk >= 0) {		close(idev->intr_sk);		idev->intr_sk = -1;	}	return 0;}int input_device_connadd(bdaddr_t *src, bdaddr_t *dst){	struct device *idev;	int err;	idev = find_device(src, dst);	if (!idev)		return -ENOENT;	err = hidp_connadd(src, dst, idev->ctrl_sk, idev->intr_sk, idev->name);	if (err < 0) {		close(idev->ctrl_sk);		close(idev->intr_sk);		idev->ctrl_sk = -1;		idev->intr_sk = -1;		return err;	}	idev->intr_watch = create_watch(idev->intr_sk, intr_watch_cb, idev);	idev->ctrl_watch = create_watch(idev->ctrl_sk, ctrl_watch_cb, idev);	dbus_connection_emit_signal(idev->conn,			idev->path,			INPUT_DEVICE_INTERFACE,			"Connected",			DBUS_TYPE_INVALID);	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区二区三级电影在线观看| 日韩午夜激情免费电影| 91社区在线播放| 国产自产高清不卡| 成人动漫精品一区二区| 99久久久免费精品国产一区二区| 激情综合网av| 成人小视频免费在线观看| 成人黄色小视频| 色综合久久66| 日韩一级片在线观看| 国产精品久久久久精k8 | 懂色中文一区二区在线播放| 欧美日韩卡一卡二| 国产免费成人在线视频| 午夜精品在线看| 波多野结衣精品在线| 欧美一区国产二区| 国内精品嫩模私拍在线| 风间由美一区二区av101 | 国产精品午夜久久| 美女视频黄久久| 91传媒视频在线播放| 中文字幕欧美日本乱码一线二线| 免费欧美日韩国产三级电影| 在线观看区一区二| 国产精品久久三区| 国产福利一区在线| 欧美大片顶级少妇| 日韩高清在线一区| 欧美日韩视频在线第一区| 亚洲最大色网站| 一本色道亚洲精品aⅴ| 亚洲天堂久久久久久久| 国产91精品一区二区麻豆亚洲| 欧美va日韩va| 久久国产视频网| 日韩欧美成人午夜| 秋霞电影网一区二区| 欧美哺乳videos| 国产麻豆视频一区二区| 久久久亚洲高清| 成人动漫一区二区三区| 1000精品久久久久久久久| 色哟哟精品一区| 日韩福利视频导航| 日韩欧美不卡一区| 福利一区在线观看| 一区二区三区中文免费| 欧美影视一区在线| 久久精品国产精品亚洲精品| 国产亚洲精品久| 色婷婷精品大视频在线蜜桃视频| 加勒比av一区二区| 欧美不卡在线视频| av电影在线观看一区| 亚洲国产婷婷综合在线精品| 91浏览器在线视频| 三级欧美在线一区| 国产日韩欧美电影| 欧美性色欧美a在线播放| 美女看a上一区| 亚洲免费av观看| 日韩欧美中文字幕精品| 成人免费毛片app| 日本aⅴ精品一区二区三区| 欧美激情综合五月色丁香小说| 欧美日韩中文字幕精品| 丁香天五香天堂综合| 日本亚洲最大的色成网站www| 综合久久久久久久| 久久久久国产一区二区三区四区| 欧美性猛交一区二区三区精品| 国产白丝网站精品污在线入口| 亚洲影院久久精品| 国产精品久久久久久久久免费桃花| 日韩午夜av电影| 欧美日韩免费视频| 91捆绑美女网站| 成人妖精视频yjsp地址| 美女视频黄免费的久久| 水野朝阳av一区二区三区| 亚洲日穴在线视频| 国产精品美女久久久久久2018| 精品国产乱码久久久久久久久| 欧美日本乱大交xxxxx| 欧美亚洲一区二区在线| 在线日韩av片| 欧美亚洲综合网| 欧美午夜一区二区三区| 一本到高清视频免费精品| 日韩三级精品电影久久久| 欧美日韩精品专区| 欧美色精品天天在线观看视频| 欧美在线视频你懂得| 在线观看91精品国产入口| 91网页版在线| 欧美性色黄大片手机版| 欧美日韩三级在线| 精品久久一区二区| 亚洲国产精品成人久久综合一区| 欧美韩国日本不卡| 亚洲人成亚洲人成在线观看图片 | 午夜精品福利在线| 日韩国产精品大片| 狠狠色狠狠色综合系列| 粉嫩一区二区三区在线看| 91久久免费观看| 欧美一级爆毛片| 日本一区二区三区四区在线视频| 亚洲另类中文字| 麻豆国产欧美一区二区三区| 成人高清视频免费观看| 在线观看www91| 久久久久亚洲综合| 亚洲第一av色| 欧美日韩高清在线| 久久众筹精品私拍模特| 亚洲视频图片小说| 蜜臀av性久久久久av蜜臀妖精 | 久久―日本道色综合久久| 国产精品的网站| 精品中文字幕一区二区小辣椒| 99riav久久精品riav| 精品国产网站在线观看| 亚洲国产美国国产综合一区二区| 国产又粗又猛又爽又黄91精品| 色综合久久久久| 久久久久久电影| 男女性色大片免费观看一区二区| 91首页免费视频| 久久久国产精品麻豆| 婷婷开心久久网| 91丨porny丨最新| 国产精品久久久久精k8| 国产美女精品在线| 日韩视频一区二区三区在线播放| 亚洲免费av高清| 在线观看视频一区二区| 国产在线麻豆精品观看| 欧美日韩高清一区| 午夜精品久久久久久久久久| 欧洲精品在线观看| 亚洲一区二区在线视频| 日本韩国欧美国产| 亚洲最色的网站| 亚洲视频网在线直播| 欧美影院精品一区| 日韩二区三区在线观看| 日韩视频在线一区二区| 裸体在线国模精品偷拍| 久久伊人中文字幕| 美脚の诱脚舐め脚责91| 日韩欧美一二三四区| 国内精品久久久久影院薰衣草 | 亚洲一区国产视频| 欧美日韩精品免费观看视频 | 午夜激情一区二区三区| 欧美mv和日韩mv国产网站| 国产精品综合在线视频| 亚洲丝袜制服诱惑| 欧美电影在哪看比较好| 精品亚洲国内自在自线福利| 国产视频一区在线观看| 一本久久综合亚洲鲁鲁五月天| 天堂成人免费av电影一区| 久久久精品综合| 在线欧美小视频| 国产成人精品亚洲午夜麻豆| 亚洲自拍偷拍综合| 久久久久国产精品麻豆ai换脸| 色噜噜夜夜夜综合网| 久久99国产精品尤物| 国产成人在线视频免费播放| 亚洲激情av在线| 久久这里都是精品| 欧美日韩小视频| 99久久精品免费精品国产| 一区二区三区欧美| 精品99一区二区三区| 国产69精品久久99不卡| 亚洲国产日产av| 亚洲人成精品久久久久| 精品国产sm最大网站免费看| 91麻豆蜜桃一区二区三区| 青青草97国产精品免费观看无弹窗版| 国产精品色哟哟| 欧美日韩一级二级| av在线免费不卡| 国产成人在线观看免费网站| 亚洲精品国产第一综合99久久| 精品国产百合女同互慰| 欧美日韩aaaaaa| 欧美裸体一区二区三区| 色八戒一区二区三区| 成人免费视频播放| 国产精品一区在线| 亚洲第一搞黄网站| 亚洲午夜在线视频| 亚洲美女免费在线|