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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? manager.c

?? 基于LINUX內(nèi)核驅(qū)動(dòng)的開發(fā)
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
/* * *  BlueZ - Bluetooth protocol stack for Linux * *  Copyright (C) 2004-2008  Marcel Holtmann <marcel@holtmann.org> * * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA * */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <errno.h>#include <ctype.h>#include <dirent.h>#include <sys/stat.h>#include <bluetooth/bluetooth.h>#include <bluetooth/hci.h>#include <bluetooth/hci_lib.h>#include <bluetooth/bnep.h>#include <bluetooth/sdp.h>#include <bluetooth/sdp_lib.h>#include <glib.h>#include "dbus.h"#include "dbus-helper.h"#include "logging.h"#include "textfile.h"#define NETWORK_MANAGER_INTERFACE "org.bluez.network.Manager"#include "error.h"#include "bridge.h"#include "manager.h"#include "common.h"#define MAX_NAME_SIZE	256struct pending_reply {	DBusConnection	*conn;	DBusMessage	*msg;	bdaddr_t	src;		/* Source address */	bdaddr_t	dst;		/* Destination address */	char		*addr;		/* Destination address */	char		*path;		/* D-Bus object path */	char		*adapter_path;	/* Default adapter path */	uint16_t	id;		/* Role */};static struct network_conf *conf = NULL;/* Network service configuration */static GSList *server_paths	= NULL;	/* Network registered servers paths */static GSList *connection_paths	= NULL;	/* Network registered connections paths */static int default_index = -1;		/* Network default connection path index */static int net_uid = 0;			/* Network objects identifier */static DBusConnection *connection = NULL;static void pending_reply_free(struct pending_reply *pr){	if (pr->addr)		g_free(pr->addr);	if (pr->path)		g_free(pr->path);	if (pr->adapter_path)		g_free(pr->adapter_path);	if (pr->msg)		dbus_message_unref(pr->msg);	if (pr->conn)		dbus_connection_unref(pr->conn);}static DBusHandlerResult create_path(DBusConnection *conn,					DBusMessage *msg, const char *path,					const char *sname){	DBusMessage *reply;	/* emit signal when it is a new path */	if (sname) {		dbus_connection_emit_signal(conn, NETWORK_PATH,						NETWORK_MANAGER_INTERFACE,						sname, DBUS_TYPE_STRING, &path,						DBUS_TYPE_INVALID);	}	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply, DBUS_TYPE_STRING, &path,					DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult list_paths(DBusConnection *conn, DBusMessage *msg,					GSList *list){	DBusMessage *reply;	DBusMessageIter iter;	DBusMessageIter array_iter;	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_iter_init_append(reply, &iter);	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,				DBUS_TYPE_STRING_AS_STRING, &array_iter);	for (; list; list = list->next) {		dbus_message_iter_append_basic(&array_iter,						DBUS_TYPE_STRING,						&list->data);	}	dbus_message_iter_close_container(&iter, &array_iter);	return send_message_and_unref(conn, reply);}static const char * last_connection_used(DBusConnection *conn){	const char *path = NULL;	GSList *l;	int i;	for (i = g_slist_length (connection_paths) -1; i > -1; i--) {		path = g_slist_nth_data (connection_paths, i);		if (connection_is_connected(path))			break;	}	/* No connection connected fallback to last connection */	if (i == -1) {		l = g_slist_last(connection_paths);		path = l->data;	}	return path;}static DBusHandlerResult remove_path(DBusConnection *conn,					DBusMessage *msg, GSList **list,					const char *sname){	const char *path;	DBusMessage *reply;	DBusError derr;	GSList *l;	dbus_error_init(&derr);	if (!dbus_message_get_args(msg, &derr,				DBUS_TYPE_STRING, &path,				DBUS_TYPE_INVALID)) {		error_invalid_arguments(conn, msg, derr.message);		dbus_error_free(&derr);		return DBUS_HANDLER_RESULT_HANDLED;	}	l = g_slist_find_custom(*list, path, (GCompareFunc) strcmp);	if (!l)		return error_does_not_exist(conn, msg, "Path doesn't exist");	/* Remove references from the storage */	if (*list == connection_paths) {		if (connection_has_pending(path))			return error_failed(conn, msg, "Connection is Busy");		connection_remove_stored(path);		/* Reset default connection */		if (l == g_slist_nth(*list, default_index)) {			const char *dpath;			dpath = last_connection_used(conn);			connection_store(dpath, TRUE);		}	}	g_free(l->data);	*list = g_slist_remove(*list, l->data);	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	if (!dbus_connection_destroy_object_path(conn, path))		error("Network path unregister failed");	dbus_connection_emit_signal(conn, NETWORK_PATH,					NETWORK_MANAGER_INTERFACE,					sname, DBUS_TYPE_STRING, &path,					DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static void pan_record_reply(DBusPendingCall *call, void *data){	struct pending_reply *pr = data;	DBusMessage *reply = dbus_pending_call_steal_reply(call);	DBusError derr;	int len, scanned;	uint8_t *rec_bin;	sdp_data_t *d;	sdp_record_t *rec = NULL;	char name[MAX_NAME_SIZE], *desc = NULL;	dbus_error_init(&derr);	if (dbus_set_error_from_message(&derr, reply)) {		/* FIXME: forward error as is */		if (dbus_error_has_name(&derr,				"org.bluez.Error.ConnectionAttemptFailed"))			error_connection_attempt_failed(pr->conn, pr->msg, 					EINVAL);		else			error_not_supported(pr->conn, pr->msg);		error("GetRemoteServiceRecord failed: %s(%s)", derr.name,			derr.message);		goto fail;	}	if (!dbus_message_get_args(reply, &derr,				DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &rec_bin, &len,				DBUS_TYPE_INVALID)) {		error_not_supported(pr->conn, pr->msg);		error("%s: %s", derr.name, derr.message);		goto fail;	}	if (len == 0) {		error_not_supported(pr->conn, pr->msg);		error("Invalid PAN service record length");		goto fail;	}	rec = sdp_extract_pdu(rec_bin, &scanned);	/* Concat remote name and service name */	memset(name, 0, MAX_NAME_SIZE);	if (read_remote_name(&pr->src, &pr->dst, name, MAX_NAME_SIZE) < 0)		len = 0;	else		len = strlen(name);	d = sdp_data_get(rec, SDP_ATTR_SVCNAME_PRIMARY);	if (d) {		snprintf(name + len, MAX_NAME_SIZE - len,			len ? " (%.*s)" : "%.*s", d->unitSize, d->val.str);	}	/* Extract service description from record */	d = sdp_data_get(rec, SDP_ATTR_SVCDESC_PRIMARY);	if (d) {		desc = g_new0(char, d->unitSize);		snprintf(desc, d->unitSize, "%.*s",				d->unitSize, d->val.str);	}	if (connection_register(pr->path, &pr->src, &pr->dst, pr->id, name,				desc) < 0) {		error_failed(pr->conn, pr->msg, "D-Bus path registration failed");		goto fail;	}	connection_store(pr->path, FALSE);	connection_paths = g_slist_append(connection_paths, g_strdup(pr->path));	create_path(pr->conn, pr->msg, pr->path, "ConnectionCreated");fail:	if (desc)		g_free(desc);	sdp_record_free(rec);	dbus_error_free(&derr);	pending_reply_free(pr);	dbus_message_unref(reply);}static int get_record(struct pending_reply *pr, uint32_t handle,					DBusPendingCallNotifyFunction cb){	DBusMessage *msg;	DBusPendingCall *pending;	msg = dbus_message_new_method_call("org.bluez", pr->adapter_path,			"org.bluez.Adapter", "GetRemoteServiceRecord");	if (!msg)		return -1;	dbus_message_append_args(msg,			DBUS_TYPE_STRING, &pr->addr,			DBUS_TYPE_UINT32, &handle,			DBUS_TYPE_INVALID);	if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) {		error("Can't send D-Bus message.");		dbus_message_unref(msg);		return -1;	}	dbus_pending_call_set_notify(pending, cb, pr, NULL);	dbus_message_unref(msg);	dbus_pending_call_unref(pending);	return 0;}static void pan_handle_reply(DBusPendingCall *call, void *data){	struct pending_reply *pr = data;	DBusMessage *reply = dbus_pending_call_steal_reply(call);	DBusError derr;	uint32_t *phandle;	int len;	dbus_error_init(&derr);	if (dbus_set_error_from_message(&derr, reply)) {		/* FIXME : forward error as is */		if (dbus_error_has_name(&derr,				"org.bluez.Error.ConnectionAttemptFailed"))			error_connection_attempt_failed(pr->conn, pr->msg,					EINVAL);		else			error_not_supported(pr->conn, pr->msg);		error("GetRemoteServiceHandles: %s(%s)", derr.name,				derr.message);		goto fail;	}	if (!dbus_message_get_args(reply, &derr,				DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &phandle,				&len, DBUS_TYPE_INVALID)) {		error_not_supported(pr->conn, pr->msg);		error("%s: %s", derr.name, derr.message);		goto fail;	}	if (!len) {		error_not_supported(pr->conn, pr->msg);		goto fail;	}	if (get_record(pr, *phandle, pan_record_reply) < 0) {		error_not_supported(pr->conn, pr->msg);		goto fail;	}	dbus_message_unref(reply);	return;fail:	dbus_error_free(&derr);	pending_reply_free(pr);}static int get_handles(struct pending_reply *pr,			DBusPendingCallNotifyFunction cb){	DBusMessage *msg;	DBusPendingCall *pending;	const char *uuid;	msg = dbus_message_new_method_call("org.bluez", pr->adapter_path,			"org.bluez.Adapter", "GetRemoteServiceHandles");	if (!msg)		return -1;	uuid = bnep_uuid(pr->id);	dbus_message_append_args(msg,			DBUS_TYPE_STRING, &pr->addr,			DBUS_TYPE_STRING, &uuid,			DBUS_TYPE_INVALID);	if (dbus_connection_send_with_reply(pr->conn, msg, &pending, -1) == FALSE) {		error("Can't send D-Bus message.");		dbus_message_unref(msg);		return -1;	}	dbus_pending_call_set_notify(pending, cb, pr, NULL);	dbus_message_unref(msg);	dbus_pending_call_unref(pending);	return 0;}static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg,					void *data){	return list_paths(conn, msg, server_paths);}static DBusHandlerResult find_server(DBusConnection *conn,						DBusMessage *msg, void *data){	DBusError derr;	const char *pattern;	const char *path;	GSList *list;	DBusMessage *reply;	dbus_error_init(&derr);	if (!dbus_message_get_args(msg, &derr,				DBUS_TYPE_STRING, &pattern,				DBUS_TYPE_INVALID)) {		error_invalid_arguments(conn, msg, derr.message);		dbus_error_free(&derr);		return DBUS_HANDLER_RESULT_HANDLED;	}	for (list = server_paths; list; list = list->next) {		path = (const char *) list->data;		if (server_find_data(path, pattern) == 0)			break;	}	if (list == NULL) {		error_does_not_exist(conn, msg, "No such server");		return DBUS_HANDLER_RESULT_HANDLED;	}	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply, DBUS_TYPE_STRING, &path,					DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}static DBusHandlerResult list_connections(DBusConnection *conn,						DBusMessage *msg, void *data){	return list_paths(conn, msg, connection_paths);}static GSList * find_connection_pattern(DBusConnection *conn,					const char *pattern){	const char *path;	GSList *list;	if (pattern == NULL)		return NULL;	for (list = connection_paths; list; list = list->next) {		path = (const char *) list->data;		if (connection_find_data(path, pattern) == 0)			break;	}	return list;}static DBusHandlerResult find_connection(DBusConnection *conn,						DBusMessage *msg, void *data){	DBusError derr;	const char *pattern;	const char *path;	GSList *list;	DBusMessage *reply;	dbus_error_init(&derr);	if (!dbus_message_get_args(msg, &derr,				DBUS_TYPE_STRING, &pattern,				DBUS_TYPE_INVALID)) {		error_invalid_arguments(conn, msg, derr.message);		dbus_error_free(&derr);		return DBUS_HANDLER_RESULT_HANDLED;	}	list = find_connection_pattern(conn, pattern);	if (list == NULL) {		error_does_not_exist(conn, msg, "No such connection");		return DBUS_HANDLER_RESULT_HANDLED;	}	path = list->data;	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	dbus_message_append_args(reply, DBUS_TYPE_STRING, &path,					DBUS_TYPE_INVALID);	return send_message_and_unref(conn, reply);}char *find_adapter(DBusConnection *conn, bdaddr_t *src){	DBusMessage *msg, *reply;	DBusError derr;	char address[18], *addr_ptr = address;	char *path, *ret;	msg = dbus_message_new_method_call("org.bluez", "/org/bluez",						"org.bluez.Manager",						"FindAdapter");	if (!msg) {		error("Unable to allocate new method call");		return NULL;	}	ba2str(src, address);	dbus_message_append_args(msg, DBUS_TYPE_STRING, &addr_ptr,				 DBUS_TYPE_INVALID);	dbus_error_init(&derr);	reply = dbus_connection_send_with_reply_and_block(conn, msg, -1,								&derr);	dbus_message_unref(msg);	if (dbus_error_is_set(&derr) ||				dbus_set_error_from_message(&derr, reply)) {		error("FindAdapter(%s) failed: %s", address, derr.message);		dbus_error_free(&derr);		return NULL;	}	dbus_error_init(&derr);	dbus_message_get_args(reply, &derr,				DBUS_TYPE_STRING, &path,				DBUS_TYPE_INVALID);	if (dbus_error_is_set(&derr)) {		error("Unable to get message args");		dbus_message_unref(reply);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人精品视频.| 久久亚区不卡日本| 综合欧美亚洲日本| eeuss鲁片一区二区三区在线看| 欧美日韩精品二区第二页| 一区二区视频在线| 欧美无人高清视频在线观看| 国产精品美女一区二区三区| 色婷婷av一区二区三区软件| 亚洲第一福利视频在线| 日韩一区二区三区免费看| 国产一二三精品| 国产精品美女久久久久久久久| 色婷婷久久久久swag精品| 偷拍一区二区三区| 久久久精品免费观看| 色综合中文字幕| 蜜臀久久99精品久久久久宅男| 久久久久国产精品麻豆| 91在线观看成人| 日本aⅴ精品一区二区三区 | 色婷婷激情综合| 午夜精品久久久久久久99水蜜桃| 日韩一区二区三区av| 成人精品鲁一区一区二区| 亚洲精品中文在线影院| 日韩区在线观看| 97久久超碰国产精品电影| 日韩高清不卡一区二区三区| 国产日产欧美一区| 欧美视频精品在线观看| 国产成人免费视频网站| 亚洲一二三四久久| 欧美日韩免费一区二区三区视频| 91在线码无精品| 91精品国产综合久久精品app | 久久精品水蜜桃av综合天堂| 国产精品久99| 8v天堂国产在线一区二区| 日韩和欧美的一区| 亚洲天堂中文字幕| 日韩一级高清毛片| 欧美一二三四在线| 日韩福利视频网| 国产精品视频一二三| 国产91精品一区二区麻豆网站| 欧美电影免费观看完整版| 精品夜夜嗨av一区二区三区| 亚洲另类在线制服丝袜| 91精品福利在线一区二区三区 | 国产精品情趣视频| 99国产精品国产精品毛片| 另类小说色综合网站| 1区2区3区国产精品| 久久久久久久久久久久久夜| 欧美日韩国产美| 国产视频在线观看一区二区三区 | 日韩高清一级片| 777a∨成人精品桃花网| 一区二区三区四区中文字幕| 色婷婷综合在线| 国产麻豆91精品| 亚洲女与黑人做爰| 亚洲综合色婷婷| 欧美日韩午夜精品| 欧美三级电影一区| 亚洲国产精品欧美一二99| 麻豆freexxxx性91精品| 亚洲高清在线视频| 中文字幕在线不卡视频| 日韩欧美亚洲国产另类| 在线观看亚洲精品| 亚洲国产精品久久不卡毛片 | 不卡一区在线观看| 亚洲男帅同性gay1069| 日韩精彩视频在线观看| 国产精品日日摸夜夜摸av| 五月综合激情日本mⅴ| 91免费观看国产| 一区二区三区波多野结衣在线观看| 精品国产乱码久久久久久1区2区| 日韩欧美色电影| 日韩丝袜美女视频| 精品三级在线观看| 国产亚洲精品bt天堂精选| 久久久久久电影| 国产欧美日韩中文久久| 国产精品视频免费看| 国产精品欧美一级免费| 国产精品日韩精品欧美在线| 日本一二三不卡| 亚洲国产高清不卡| 国产精品免费免费| 亚洲精品国产无天堂网2021| 亚洲成人中文在线| 看电视剧不卡顿的网站| 国产精品一区免费视频| 北条麻妃一区二区三区| 欧美性大战久久久| 日韩精品一区二区三区在线观看 | 欧美精彩视频一区二区三区| 国产精品久久久久久久久免费相片| 亚洲乱码国产乱码精品精的特点| 亚洲国产一区二区在线播放| 日韩福利电影在线| 国产成人免费av在线| 色婷婷久久综合| 日韩视频一区二区| 国产精品国产三级国产三级人妇| 亚洲自拍偷拍网站| 另类小说图片综合网| 91毛片在线观看| 6080国产精品一区二区| 中文字幕精品一区| 性久久久久久久| 国产福利一区二区| 日本精品一级二级| 2023国产精品自拍| 亚洲精品高清视频在线观看| 久久国产麻豆精品| 日本久久一区二区| 国产丝袜欧美中文另类| 日韩福利视频导航| av不卡在线播放| 久久综合九色综合欧美98| 一区二区三区四区视频精品免费| 六月婷婷色综合| 91福利在线观看| 久久欧美一区二区| 亚洲国产精品精华液网站| 成人激情校园春色| 欧美精品一区男女天堂| 亚洲444eee在线观看| av不卡一区二区三区| 国产亚洲成aⅴ人片在线观看| 亚洲国产精品人人做人人爽| 成人性生交大片免费看中文网站| 制服丝袜亚洲网站| 亚洲靠逼com| 国产白丝网站精品污在线入口| 欧美少妇xxx| 国产精品毛片无遮挡高清| 日本不卡一区二区三区高清视频| 99久久久免费精品国产一区二区 | 日本一区二区成人在线| 日韩电影在线看| 在线观看成人小视频| 欧美国产一区二区在线观看| 另类小说欧美激情| 日韩美女一区二区三区| 亚洲一二三四久久| 欧美手机在线视频| 亚洲精品国产成人久久av盗摄| 成人免费看片app下载| 久久久久久久久久久久电影 | 亚洲va欧美va国产va天堂影院| jiyouzz国产精品久久| 久久久99精品免费观看不卡| 日本女优在线视频一区二区| 欧美日韩大陆一区二区| 一区二区三区欧美久久| 国产激情一区二区三区四区 | 欧美日韩视频在线第一区 | 国产精品成人免费在线| 精品制服美女久久| 欧美一级在线观看| 日韩av成人高清| 欧美一区二区人人喊爽| 免费美女久久99| 欧美一级理论片| 裸体在线国模精品偷拍| 日韩免费视频一区| 精品一区二区三区蜜桃| 精品91自产拍在线观看一区| 蜜桃传媒麻豆第一区在线观看| 91精品国产综合久久精品麻豆| 日本成人在线看| 欧美不卡一区二区三区| 精品无人码麻豆乱码1区2区| 久久久久久久久久久久久女国产乱| 韩国毛片一区二区三区| 久久久国产精华| av亚洲精华国产精华精华| 亚洲精品你懂的| 欧美日韩国产小视频| 青青草一区二区三区| 日韩视频免费观看高清在线视频| 国产一区三区三区| 国产精品每日更新| 欧美欧美午夜aⅴ在线观看| 毛片一区二区三区| 久久久综合精品| 9i看片成人免费高清| 亚洲一区二区在线视频| 日韩无一区二区| 国产suv一区二区三区88区| 国产精品久久综合| 欧美日本国产视频| 韩国一区二区三区| 国产精品不卡在线观看|