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

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

?? manager.c

?? 基于LINUX內核驅動的開發
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * *  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);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美精品国产国产专区| 成人av在线一区二区| 欧美色图第一页| 亚洲一区在线观看视频| 欧美日本韩国一区二区三区视频| 婷婷久久综合九色国产成人 | 日韩电影免费在线| 精品国产免费久久| 9l国产精品久久久久麻豆| 国产精品国产三级国产aⅴ入口| 色婷婷精品久久二区二区蜜臀av| 午夜精品视频一区| 欧美精品一区二区三区在线| 国产99久久久久久免费看农村| 亚洲欧洲99久久| 欧美日本高清视频在线观看| 国产一区二区久久| 亚洲美腿欧美偷拍| 欧美mv日韩mv国产网站| 99久久久久久| 免费观看30秒视频久久| 国产精品国产三级国产| 在线综合+亚洲+欧美中文字幕| 黄一区二区三区| 亚洲裸体在线观看| 精品国产乱码久久久久久久久| 成人av电影免费观看| 视频一区二区三区中文字幕| 国产日产欧美一区二区视频| 欧美午夜免费电影| 国产精品一二三在| 日韩中文字幕区一区有砖一区 | 成人国产视频在线观看| 日韩精品一级中文字幕精品视频免费观看| 亚洲精品在线免费观看视频| 91精品1区2区| 国产成人在线电影| 日韩影院在线观看| 亚洲激情图片qvod| 国产女人18水真多18精品一级做 | 亚洲婷婷在线视频| xf在线a精品一区二区视频网站| 91福利精品视频| 成人aaaa免费全部观看| 麻豆精品新av中文字幕| 一区二区三区在线观看欧美| 中文字幕欧美激情| 精品国产a毛片| 日韩午夜激情电影| 在线免费观看一区| 91日韩精品一区| 成人免费视频免费观看| 激情图区综合网| 图片区小说区区亚洲影院| 亚洲精品v日韩精品| 一区二区三区在线观看欧美| 国产精品女人毛片| 欧美极品美女视频| 久久精品日韩一区二区三区| 欧美v日韩v国产v| 91精品国产高清一区二区三区| 在线观看免费亚洲| 91视频国产观看| 成人av午夜影院| 福利一区二区在线| 国产毛片一区二区| 黄色精品一二区| 麻豆国产一区二区| 久久国产精品第一页| 蜜臀av国产精品久久久久| 午夜欧美视频在线观看 | 欧美男人的天堂一二区| 欧美伊人久久久久久午夜久久久久| 99精品黄色片免费大全| 99国产精品久久久| 99久久婷婷国产综合精品| 99久久伊人精品| 91福利精品第一导航| 欧美亚洲日本国产| 欧美日韩一区二区三区四区| 欧美精品久久一区二区三区| 欧美美女喷水视频| 日韩一区二区在线免费观看| 日韩欧美亚洲国产另类| 久久青草国产手机看片福利盒子| 精品99一区二区| 国产精品女主播av| 亚洲精品视频在线观看免费| 亚洲国产精品一区二区www| 亚洲成人av福利| 久久99热狠狠色一区二区| 国产一区二区三区美女| 成人黄色片在线观看| 色婷婷综合久久久中文字幕| 欧美日韩久久一区| 精品少妇一区二区三区| 亚洲精品免费看| 亚洲国产三级在线| 久久精品国产亚洲一区二区三区 | 岛国精品在线观看| www.亚洲色图.com| 欧洲一区在线观看| 日韩午夜av一区| 国产偷国产偷精品高清尤物| 亚洲另类在线一区| 蜜臀av一区二区三区| 丁香激情综合国产| 欧美肥妇free| 欧美国产精品劲爆| 亚洲制服丝袜av| 黄色资源网久久资源365| 91亚洲国产成人精品一区二三 | 成人黄色a**站在线观看| 在线国产亚洲欧美| 精品福利视频一区二区三区| 中文字幕av在线一区二区三区| 亚洲国产视频一区| 成人综合婷婷国产精品久久| 欧美日韩精品是欧美日韩精品| 久久人人爽爽爽人久久久| 一区二区三区在线视频免费观看| 喷白浆一区二区| 色婷婷综合激情| 国产午夜精品在线观看| 天天综合色天天| 91婷婷韩国欧美一区二区| 日韩欧美专区在线| 亚洲精品老司机| 国产成人免费网站| 欧美日本乱大交xxxxx| 亚洲欧洲日韩综合一区二区| 麻豆精品国产传媒mv男同| 欧美系列在线观看| 中文字幕制服丝袜一区二区三区 | 亚洲一区自拍偷拍| 成人精品视频一区| 精品日韩在线一区| 夜夜夜精品看看| av一本久道久久综合久久鬼色| 精品久久一区二区三区| 亚洲福利国产精品| 99久久综合狠狠综合久久| 日韩欧美国产精品一区| 爽好久久久欧美精品| 欧美色综合影院| 亚洲精品老司机| 91丨porny丨国产| 国产精品久久久久久妇女6080| 国产乱国产乱300精品| 欧美一级国产精品| 日本一区中文字幕| 欧美三级蜜桃2在线观看| 一区二区国产视频| 91麻豆国产在线观看| 17c精品麻豆一区二区免费| 欧美在线|欧美| 亚洲美女视频在线观看| 91网站最新网址| 国产精品短视频| 91在线播放网址| 亚洲欧美日韩久久| 一本到三区不卡视频| 亚洲免费av在线| 色久综合一二码| 亚洲国产aⅴ成人精品无吗| 91官网在线免费观看| 亚洲一区二区三区四区在线观看 | 亚洲一区二区三区不卡国产欧美| 色噜噜夜夜夜综合网| 亚洲自拍偷拍综合| 欧美伊人久久大香线蕉综合69| 夜夜亚洲天天久久| 欧美军同video69gay| 日韩高清中文字幕一区| 欧美一区二区精品久久911| 男女视频一区二区| 久久综合成人精品亚洲另类欧美| 国产麻豆精品theporn| 国产精品女主播av| 91一区二区在线| 亚洲伊人色欲综合网| 日韩一区二区三区电影 | 日本亚洲视频在线| 91麻豆精品国产91久久久久| 青青草成人在线观看| 久久久久久久久伊人| 成人精品鲁一区一区二区| 日韩一区在线播放| 欧美少妇一区二区| 久久国内精品视频| 国产精品的网站| 欧美老年两性高潮| 国产精品自拍av| 一区二区三区四区中文字幕| 91精品免费观看| 国产精品538一区二区在线| 玉足女爽爽91| 日韩欧美www| 色香蕉成人二区免费| 免费人成黄页网站在线一区二区|