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

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

?? dbus.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 <stdio.h>#include <errno.h>#include <fcntl.h>#include <unistd.h>#include <string.h>#include <stdlib.h>#include <stdint.h>#include <glib.h>#include <dbus/dbus.h>#ifdef NEED_DBUS_WATCH_GET_UNIX_FD#define dbus_watch_get_unix_fd dbus_watch_get_fd#endif#ifdef HAVE_DBUS_GLIB#include <dbus/dbus-glib-lowlevel.h>#endif#include "dbus.h"#include "logging.h"#define DISPATCH_TIMEOUT	0static int name_listener_initialized = 0;static GSList *name_listeners = NULL;#ifndef HAVE_DBUS_GLIBtypedef struct {	uint32_t id;	DBusTimeout *timeout;} timeout_handler_t;struct watch_info {	guint watch_id;	GIOChannel *io;	DBusConnection *conn;};struct server_info {	guint watch_id;	GIOChannel *io;	DBusServer *server;};#endifstruct disconnect_data {	void (*disconnect_cb)(void *);	void *user_data;};struct name_callback {	name_cb_t func;	void *user_data;};struct name_data {	DBusConnection *connection;	char *name;	GSList *callbacks;};static struct name_data *name_data_find(DBusConnection *connection,							const char *name){	GSList *current;	for (current = name_listeners;			current != NULL; current = current->next) {		struct name_data *data = current->data;		if (name == NULL && data->name == NULL) {			if (connection == data->connection)				return data;		} else {			if (strcmp(name, data->name) == 0)				return data;		}	}	return NULL;}static struct name_callback *name_callback_find(GSList *callbacks,					name_cb_t func, void *user_data){	GSList *current;	for (current = callbacks; current != NULL; current = current->next) {		struct name_callback *cb = current->data;		if (cb->func == func && cb->user_data == user_data)			return cb;	}	return NULL;}static void name_data_call_and_free(struct name_data *data){	GSList *l;	for (l = data->callbacks; l != NULL; l = l->next) {		struct name_callback *cb = l->data;		if (cb->func)			cb->func(data->name, cb->user_data);		g_free(cb);	}	g_slist_free(data->callbacks);	g_free(data->name);	g_free(data);}static void name_data_free(struct name_data *data){	GSList *l;	for (l = data->callbacks; l != NULL; l = l->next)		g_free(l->data);	g_slist_free(data->callbacks);	g_free(data->name);	g_free(data);}static int name_data_add(DBusConnection *connection,			const char *name, name_cb_t func, void *user_data){	int first = 1;	struct name_data *data = NULL;	struct name_callback *cb = NULL;	cb = g_new(struct name_callback, 1);	cb->func = func;	cb->user_data = user_data;	data = name_data_find(connection, name);	if (data) {		first = 0;		goto done;	}	data = g_new0(struct name_data, 1);	data->connection = connection;	data->name = g_strdup(name);	name_listeners = g_slist_append(name_listeners, data);done:	data->callbacks = g_slist_append(data->callbacks, cb);	return first;}static void name_data_remove(DBusConnection *connection,			const char *name, name_cb_t func, void *user_data){	struct name_data *data;	struct name_callback *cb = NULL;	data = name_data_find(connection, name);	if (!data)		return;	cb = name_callback_find(data->callbacks, func, user_data);	if (cb) {		data->callbacks = g_slist_remove(data->callbacks, cb);		g_free(cb);	}	if (!data->callbacks) {		name_listeners = g_slist_remove(name_listeners, data);		name_data_free(data);	}}static gboolean add_match(DBusConnection *connection, const char *name){	DBusError err;	char match_string[128];	snprintf(match_string, sizeof(match_string),			"interface=%s,member=NameOwnerChanged,arg0=%s",			DBUS_INTERFACE_DBUS, name);	dbus_error_init(&err);	dbus_bus_add_match(connection, match_string, &err);	if (dbus_error_is_set(&err)) {		error("Adding match rule \"%s\" failed: %s", match_string,				err.message);		dbus_error_free(&err);		return FALSE;	}	return TRUE;}static gboolean remove_match(DBusConnection *connection, const char *name){	DBusError err;	char match_string[128];	snprintf(match_string, sizeof(match_string),			"interface=%s,member=NameOwnerChanged,arg0=%s",			DBUS_INTERFACE_DBUS, name);	dbus_error_init(&err);	dbus_bus_remove_match(connection, match_string, &err);	if (dbus_error_is_set(&err)) {		error("Removing owner match rule for %s failed: %s",				name, err.message);		dbus_error_free(&err);		return FALSE;	}	return TRUE;}static DBusHandlerResult name_exit_filter(DBusConnection *connection,					DBusMessage *message, void *user_data){	GSList *l;	struct name_data *data;	char *name, *old, *new;	if (!dbus_message_is_signal(message, DBUS_INTERFACE_DBUS,							"NameOwnerChanged"))		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;	if (!dbus_message_get_args(message, NULL,				DBUS_TYPE_STRING, &name,				DBUS_TYPE_STRING, &old,				DBUS_TYPE_STRING, &new,				DBUS_TYPE_INVALID)) {		error("Invalid arguments for NameOwnerChanged signal");		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;	}	/* We are not interested of service creations */	if (*new != '\0')		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;	data = name_data_find(connection, name);	if (!data) {		error("Got NameOwnerChanged signal for %s which has no listeners", name);		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;	}	for (l = data->callbacks; l != NULL; l = l->next) {		struct name_callback *cb = l->data;		cb->func(name, cb->user_data);	}	name_listeners = g_slist_remove(name_listeners, data);	name_data_free(data);	remove_match(connection, name);	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;}int name_listener_add(DBusConnection *connection, const char *name,					name_cb_t func, void *user_data){	int first;	if (!name_listener_initialized) {		if (!dbus_connection_add_filter(connection,					name_exit_filter, NULL, NULL)) {			error("dbus_connection_add_filter() failed");			return -1;		}		name_listener_initialized = 1;	}	first = name_data_add(connection, name, func, user_data);	/* The filter is already added if this is not the first callback	 * registration for the name */	if (!first)		return 0;	if (name) {		debug("name_listener_add(%s)", name);		if (!add_match(connection, name)) {			name_data_remove(connection, name, func, user_data);			return -1;		}	}	return 0;}int name_listener_remove(DBusConnection *connection, const char *name,					name_cb_t func, void *user_data){	struct name_data *data;	struct name_callback *cb;	data = name_data_find(connection, name);	if (!data) {		error("remove_name_listener: no listener for %s", name);		return -1;	}	cb = name_callback_find(data->callbacks, func, user_data);	if (!cb) {		error("No matching callback found for %s", name);		return -1;	}	data->callbacks = g_slist_remove(data->callbacks, cb);	g_free(cb);	/* Don't remove the filter if other callbacks exist */	if (data->callbacks)		return 0;	if (name) {		debug("name_listener_remove(%s)", name);		if (!remove_match(connection, name))			return -1;	}	name_data_remove(connection, name, func, user_data);	return 0;}int name_listener_indicate_disconnect(DBusConnection *connection){	struct name_data *data;	data = name_data_find(connection, NULL);	if (!data) {		error("name_listener_indicate_disconnect: no listener found");		return -1;	}	debug("name_listener_indicate_disconnect");	name_data_call_and_free(data);	return 0;}dbus_bool_t dbus_bus_get_unix_process_id(DBusConnection *conn, const char *name,						unsigned long *pid){	DBusMessage *msg, *reply;	DBusError err;	dbus_uint32_t pid_arg;	msg = dbus_message_new_method_call("org.freedesktop.DBus",						"/org/freedesktop/DBus",						"org.freedesktop.DBus",						"GetConnectionUnixProcessID");	if (!msg) {		error("Unable to allocate new message");		return FALSE;	}	if (!dbus_message_append_args(msg, DBUS_TYPE_STRING, &name,					DBUS_TYPE_INVALID)) {		error("Unable to append arguments to message");		dbus_message_unref(msg);		return FALSE;	}	dbus_error_init(&err);	reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err);	if (dbus_error_is_set(&err)) {		error("Sending GetConnectionUnixProcessID failed: %s", err.message);		dbus_error_free(&err);		dbus_message_unref(msg);		return FALSE;	}	dbus_error_init(&err);	dbus_message_get_args(reply, &err, DBUS_TYPE_UINT32, &pid_arg,					DBUS_TYPE_INVALID);	if (dbus_error_is_set(&err)) {		error("Getting GetConnectionUnixProcessID args failed: %s",				err.message);		dbus_error_free(&err);		dbus_message_unref(msg);		dbus_message_unref(reply);		return FALSE;	}	*pid = (unsigned long) pid_arg;	dbus_message_unref(msg);	dbus_message_unref(reply);	return TRUE;}static DBusHandlerResult disconnect_filter(DBusConnection *conn,						DBusMessage *msg, void *data){	struct disconnect_data *dc_data = data;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲乱码中文字幕| 91麻豆.com| 精品久久久久久久久久久院品网| 一区二区三区四区乱视频| 99久久国产综合色|国产精品| 亚洲乱码日产精品bd| 欧美日韩高清一区二区不卡| 免费在线视频一区| 久久久久久久久久久99999| 色综合色综合色综合色综合色综合 | 激情小说欧美图片| 精品成人一区二区三区四区| 高清不卡一区二区在线| 亚洲日本一区二区三区| 欧美高清性hdvideosex| 黄色精品一二区| 亚洲老司机在线| 久久久精品tv| 欧美精品在线一区二区| 丁香网亚洲国际| 五月婷婷另类国产| 日本精品一区二区三区四区的功能| av成人免费在线观看| 激情文学综合网| 麻豆精品精品国产自在97香蕉| 一区二区三区日本| 自拍偷拍亚洲综合| 国产精品毛片高清在线完整版| 日韩一区二区免费在线观看| 91搞黄在线观看| 在线观看一区二区视频| 成人18精品视频| 精彩视频一区二区| 亚洲一区免费观看| 色素色在线综合| 91美女视频网站| 一本色道久久综合精品竹菊| 国产伦精品一区二区三区免费 | fc2成人免费人成在线观看播放 | 欧美精品一区二| 久久免费看少妇高潮| 国产欧美日韩在线观看| 精品入口麻豆88视频| 欧美日韩一区二区三区四区五区| 蜜臀国产一区二区三区在线播放 | 欧美精品18+| 国产欧美一区二区三区在线看蜜臀 | 久久精品夜色噜噜亚洲a∨| 国产日产欧产精品推荐色| 日韩一区在线播放| 99久久99久久久精品齐齐| www.综合网.com| 国产老女人精品毛片久久| 国产一区二区精品久久99| 99久久精品久久久久久清纯| 91丨porny丨国产| 精品国产亚洲一区二区三区在线观看 | 2024国产精品视频| 亚洲黄色录像片| 成人一区在线看| 欧美在线播放高清精品| 欧美一区二区三区四区五区| 欧美大片免费久久精品三p| 综合分类小说区另类春色亚洲小说欧美| 亚洲综合一二区| 国产91丝袜在线观看| 欧美二区乱c少妇| 亚洲男人的天堂av| 国产精品一区二区久久不卡| 欧美老肥妇做.爰bbww视频| 一区二区在线观看免费| 91网站在线播放| 又紧又大又爽精品一区二区| 欧美午夜精品久久久久久超碰| 亚洲欧美区自拍先锋| 一本色道久久综合亚洲91| 亚洲欧洲在线观看av| 成人在线一区二区三区| 久久久欧美精品sm网站| 久久精品国产在热久久| 国产亚洲一区二区三区在线观看| 国产精品亚洲第一区在线暖暖韩国| 精品国精品国产| 国产成人自拍网| 亚洲欧美一区二区不卡| 在线亚洲免费视频| 午夜欧美电影在线观看| 国产精品欧美一区喷水| 成人精品免费看| 亚洲一二三专区| 欧美成人一级视频| 91电影在线观看| 精品写真视频在线观看| 亚洲丝袜制服诱惑| 精品国产一区二区三区久久影院| 99热精品一区二区| 国产一区二区在线视频| 亚洲成人福利片| 亚洲猫色日本管| 国产精品丝袜91| 久久久久久一二三区| 日韩欧美你懂的| 欧美区在线观看| 国产黄色精品视频| 国产精品久久毛片av大全日韩| 欧美美女网站色| 欧美日韩精品欧美日韩精品| 欧美私人免费视频| 麻豆精品国产91久久久久久| 国产精品久久久久久久久快鸭 | 国产日韩欧美激情| 欧美视频自拍偷拍| 亚洲午夜羞羞片| 最新热久久免费视频| 亚洲免费观看在线观看| 国产欧美精品在线观看| 欧美久久久久免费| www.色精品| 欧美综合亚洲图片综合区| 色又黄又爽网站www久久| 在线观看视频91| 欧美一区二区在线看| 精品国产不卡一区二区三区| 久久久久久一级片| 欧美国产日韩亚洲一区| 亚洲欧美电影院| 青青国产91久久久久久| 国产精品一区二区久久不卡| 99在线精品观看| 久久综合色综合88| 亚洲精品伦理在线| 狠狠色狠狠色综合日日91app| 日韩高清中文字幕一区| 日韩一二三四区| 欧美日韩不卡在线| 国产精品久久久久久户外露出| 中文字幕亚洲一区二区av在线| 国产精品对白交换视频 | 国产一区二三区| 欧美一区二区三区免费观看视频 | 成人av在线播放网址| 欧美日韩aaa| 尤物视频一区二区| 成人在线一区二区三区| 国产一区二区三区国产| 免费观看30秒视频久久| 91丝袜国产在线播放| 久久亚洲精品国产精品紫薇| 午夜精品一区二区三区电影天堂| 床上的激情91.| 亚洲精品在线观| 韩国三级在线一区| 精品欧美乱码久久久久久1区2区| 亚洲一线二线三线久久久| 色综合久久久久久久久| 亚洲同性同志一二三专区| 成人精品小蝌蚪| 国产精品女主播av| 91美女片黄在线| 一区二区三区免费网站| 99re这里只有精品视频首页| 久久日韩粉嫩一区二区三区| 久久精品国产亚洲高清剧情介绍| 欧美日韩久久久一区| 久久狠狠亚洲综合| 国产日产精品一区| 正在播放亚洲一区| 国产一区二区在线观看免费| 国产婷婷一区二区| 色久优优欧美色久优优| 亚洲国产精品天堂| 久久亚洲春色中文字幕久久久| 韩国v欧美v日本v亚洲v| 亚洲欧美日韩系列| 日韩欧美高清一区| 色婷婷亚洲婷婷| 国产精品一卡二| 亚洲成a人片综合在线| 亚洲精品一区二区在线观看| 一本色道久久综合亚洲91 | 欧美日韩一级片在线观看| 久久成人羞羞网站| 亚洲国产欧美一区二区三区丁香婷| 日韩午夜三级在线| 欧美视频在线观看一区| 成人v精品蜜桃久久一区| 久久99蜜桃精品| 日韩精品亚洲专区| 亚洲一区二区欧美激情| 国产精品萝li| 亚洲国产精品高清| 久久久99精品免费观看不卡| 欧美一区二区三区不卡| 欧美日韩午夜在线视频| 欧美日韩国产综合久久| 欧美色图天堂网| 欧美精品第1页| 欧美三级欧美一级| 欧美性猛交xxxx乱大交退制版| 色视频一区二区|