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

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

?? states.c

?? linxu內核中
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * *  Headset Profile support for Linux * *  Copyright (C) 2006  Fabien Chevalier * *  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 * */#include <bluetooth/bluetooth.h>#include <bluetooth/rfcomm.h>#include <bluetooth/sdp.h>#include <bluetooth/sdp_lib.h>#include <bluetooth/sco.h>#include <sys/socket.h>#include <sys/poll.h>#include <sys/un.h>#include <fcntl.h>#include <unistd.h>#include <stdlib.h>#include <errno.h>#include <syslog.h>#include <config.h>#include "states.h"#include "sdp.h"#include "volctl.h"#include "dbus.h"/* Local defines */  /* Size for sco packets we send/receive */#define SCO_PACKET_LEN        48#define CTL_LRU_ARRAY_SIZE    5  /* PCM Appl IPC packet types */#define PKT_TYPE_CFG_BDADDR        0#define PKT_TYPE_CFG_PAGINGTIMEOUT 1#define PKT_TYPE_CFG_ACK           2#define PKT_TYPE_CFG_NACK          3#define PKT_TYPE_ERROR_IND         4#define PKT_TYPE_STREAMING_IND     5/* Local structures definition */typedef struct ipc_packet {	unsigned char type;	union {		bdaddr_t     bdaddr;	               /* PKT_TYPE_CFG_BDADDR        */		long         timeout;                  /* PKT_TYPE_CFG_PAGINGTIMEOUT */		int	     errorcode;		       /* PKT_TYPE_ERROR_IND         */	};} ipc_packet_t;/* Local variables */  /* Stores SDP session used to scan for Headset Profile */static sdp_session_t *hs_sdp_session;  /* Stores the bd address for the device we are connected to */static bdaddr_t       hs_bdaddr;static long           hs_pagingtimeout;  /* Stores if we are in/or just came out from a state where we     are connected to the headset */static int            hs_connected;/* Functions shared by all states */static void appl_send_error_pkt(int error){	ipc_packet_t pkt = {.type = PKT_TYPE_ERROR_IND};	int bckp = errno; /* backing up errno */	pkt.errorcode = error;	send(hspd_sockets[IDX_PCM_APPL_SOCK], &pkt, sizeof(pkt), MSG_NOSIGNAL);	errno = bckp;}   /* This one is shared by all states, as it is not supposed to alter / depend on the state in which we are */static void process_at_command(const char* data, unsigned int datalen);void connectedReadCtlAppl(struct State *s, short revents){	volctl_ReadCtlApplSocket(s, revents, volctl_write_fromappl);}void unconnectedReadCtlAppl(struct State *s, short revents){	volctl_ReadCtlApplSocket(s, revents, volctl_write_fromappl_unconnected);}static struct State * genericGetNextState(struct State *this){	return this->_next_state;}static void genericReadRfcomm(struct State *this, short revents){	if((revents & (POLLHUP | POLLERR)) == 0) {		char buffer[32];		int size;		if((size = recv(hspd_sockets[IDX_RFCOMM_SOCK], buffer, sizeof(buffer) - 1, 0)) > 0) {			buffer[size] = 0;			process_at_command(buffer, size);		}		this->_next_state = this;	}	else {		syslog(LOG_NOTICE, "Headset disconnected as RFCOMM socket died");		/* back to Idle */		this->_next_state = &HeadsetIdleState;	}}static void genericReadSco(struct State *this, short revents){	if((revents & (POLLHUP | POLLERR)) == 0) {		this->_next_state = this;	}	else {		syslog(LOG_NOTICE, "Headset disconnected as SCO socket died");		/* back to Idle */		this->_next_state = &HeadsetIdleState;	}}static int rfcommConnectAsync(const bdaddr_t * dst, uint8_t channel){	struct sockaddr_rc addr;	int s;	if ((s = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM)) < 0) {		return -1;	}	/* Set socket as non blocking */	if(fcntl(s, F_SETFL, O_NONBLOCK) < 0) {		close(s);		return -1;		}	memset(&addr, 0, sizeof(addr));	addr.rc_family = AF_BLUETOOTH;	bacpy(&addr.rc_bdaddr, dst);	addr.rc_channel = channel;	if ((connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) && (errno != EAGAIN) && (errno != EINPROGRESS) ) {		close(s);		return -1;	}	return s;}static int scoConnectAsync(const bdaddr_t * dst){	struct sockaddr_sco addr;	int s;	if ((s = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO)) < 0) {		return -1;	}	/* Set socket as non blocking */	if(fcntl(s, F_SETFL, O_NONBLOCK) < 0) {		close(s);		return -1;		}	memset(&addr, 0, sizeof(addr));	addr.sco_family = AF_BLUETOOTH;	bacpy(&addr.sco_bdaddr, dst);	if ((connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) && (errno != EAGAIN) && (errno != EINPROGRESS) ) {		close(s);		return -1;	}	return s;}static int recv_cfg(int applsockfd, bdaddr_t* bdaddr, long *timeout){	int ret;	int expected_configs = 2;	const int CFG_TIMEOUT = 1000;	struct pollfd pfd = {.fd = applsockfd, .events = POLLIN};		while(expected_configs > 0) {		ret = poll(&pfd, 1, CFG_TIMEOUT);		if(ret == 1 && (!(pfd.revents & (POLLHUP | POLLERR))) ) {			expected_configs--;			ipc_packet_t pkt;			recv(applsockfd, &pkt, sizeof(ipc_packet_t), 0);			switch(pkt.type) {			case PKT_TYPE_CFG_BDADDR:				if(bdaddr != 0) {					bacpy(bdaddr, &pkt.bdaddr);					pkt.type = PKT_TYPE_CFG_ACK;				}				else {					pkt.type = PKT_TYPE_CFG_NACK;				}				send(applsockfd, &pkt, sizeof(ipc_packet_t), MSG_NOSIGNAL); 				break;			case PKT_TYPE_CFG_PAGINGTIMEOUT:				if(timeout != 0) {					if(pkt.timeout <= 0) {						*timeout = -1;						}					else {						*timeout = pkt.timeout;					}					pkt.type = PKT_TYPE_CFG_ACK;				}				else {					pkt.type = PKT_TYPE_CFG_NACK;				}				send(applsockfd, &pkt, sizeof(ipc_packet_t), MSG_NOSIGNAL); 				break;			default:				syslog(LOG_WARNING, "ignoring packet from local appli: type = %d", pkt.type);			}		}		else if (ret == 0) {			syslog(LOG_ERR, "Timeout retrieving configuration from local appli.");			return -1;		}		else {			syslog(LOG_ERR, "unable to retrieve configuration from local appli: %s", strerror(errno));			return -1;		}		}	return 0;}/* Idle State */static void headsetIdleEnter(struct State *this){	if(hs_connected) {		signalHeadsetDisconnected(&hs_bdaddr);	}	hs_connected = 0;	/* killing client sockets */	if(hspd_sockets[IDX_PCM_APPL_SOCK] != 0) {		close(hspd_sockets[IDX_PCM_APPL_SOCK]);		hspd_sockets[IDX_PCM_APPL_SOCK] = 0;	}	if(hspd_sockets[IDX_SCO_SOCK] != 0) {		close(hspd_sockets[IDX_SCO_SOCK]);		hspd_sockets[IDX_SCO_SOCK] = 0;	}	if(hspd_sockets[IDX_RFCOMM_SOCK] != 0) {		close(hspd_sockets[IDX_RFCOMM_SOCK]);		hspd_sockets[IDX_RFCOMM_SOCK] = 0;	}	if(hspd_sockets[IDX_SDP_SOCK] != 0) {		close(hspd_sockets[IDX_SDP_SOCK]);		hspd_sockets[IDX_SDP_SOCK] = 0;	}	memset(&hs_bdaddr, 0, sizeof(bdaddr_t));	/* This is not a transitional state */	this->_next_state = this;	}static void headsetIdleHandleApplConnReq(struct State *this){	struct sockaddr_un client_addr;	unsigned int client_addr_len = sizeof(client_addr);	/* Per default stay in same state */	this->_next_state = this;		/* Connect Appli to us */	int _appl_sock = accept(hspd_sockets[IDX_PCM_APPL_SRV_SOCK], (struct sockaddr *)&client_addr, &client_addr_len);	if(_appl_sock != -1) {		/* Retrieve configuration parameters */		fcntl(_appl_sock, F_SETFL, O_NONBLOCK);		if(recv_cfg(_appl_sock, &hs_bdaddr, &hs_pagingtimeout) >= 0) {			char remoteaddr[32];			ba2str(&hs_bdaddr, remoteaddr);			syslog(LOG_INFO, "Configuration phase ended: target bdaddr is %s, timeout is %ld ms", remoteaddr, hs_pagingtimeout);			/* Launch SDP on bluetooth headset */			hs_sdp_session = sdp_connect_async(BDADDR_ANY, &hs_bdaddr, 0);				if(hs_sdp_session != 0) {				hspd_sockets[IDX_PCM_APPL_SOCK] = _appl_sock;				hspd_sockets[IDX_SDP_SOCK] = sdp_get_socket(hs_sdp_session);				this->_next_state = &HeadsetPagingState;			}			else {				appl_send_error_pkt(errno);				syslog(LOG_ERR, "unable to create bluetooth L2CAP socket: %s", strerror(errno));				close(_appl_sock);			}		}		else {			close(_appl_sock);			return;		}	}}static void headsetIdleHandleRfcommConnReq(struct State *this){	struct sockaddr_rc client_addr;	unsigned int client_addr_len = sizeof(client_addr);	/* Per default stay in same state */	this->_next_state = this;		/* Connect Appli to us */	int _rfcomm_sock = accept(hspd_sockets[IDX_RFCOMM_SRV_SOCK], (struct sockaddr *)&client_addr, &client_addr_len);	if(_rfcomm_sock != -1) {		char remoteaddr[32];		ba2str(&client_addr.rc_bdaddr, remoteaddr);		syslog(LOG_INFO, "Incoming RFCOMM hs connection from %s accepted",				remoteaddr);		hspd_sockets[IDX_RFCOMM_SOCK] = _rfcomm_sock;		bacpy(&hs_bdaddr, &client_addr.rc_bdaddr);		hs_connected = 1;		signalHeadsetConnected(&hs_bdaddr);		this->_next_state = &HeadsetConnectedState;	}	else {		appl_send_error_pkt(errno);		syslog(LOG_ERR, "unable to accept bluetooth RFCOMM socket : %s", strerror(errno));		close(_rfcomm_sock);	}}struct State HeadsetIdleState = {	.name = "Idle",	.pollEvents = {		[IDX_PCM_APPL_SRV_SOCK]   = POLLIN,		[IDX_CTL_APPL_SRV_SOCK]   = POLLIN,		[IDX_RFCOMM_SRV_SOCK] = POLLIN	 },	.enter               = headsetIdleEnter,	.handleApplConnReq   = headsetIdleHandleApplConnReq,	.handleRfcommConnReq = headsetIdleHandleRfcommConnReq,	.readCtlAppl         = unconnectedReadCtlAppl,	.getNextState        = genericGetNextState,};/* Paging State */static void headsetPagingReadSdp(struct State *this, short revents){	/* Fetching result code */	int errcode = -1;	unsigned int opt_size = sizeof(int);	/* Per default stay in same state */	this->_next_state = &HeadsetIdleState;		if(getsockopt(hspd_sockets[IDX_SDP_SOCK], SOL_SOCKET, SO_ERROR, &errcode, &opt_size) == 0) {		if(errcode == 0) {			/* Retrieving sdp info */			uint32_t range = 0x0000ffff;			sdp_list_t *attrid, *search, *seq, *next;			uuid_t group;			int searchresult;			uint8_t channel = 1;						sdp_uuid16_create(&group, HEADSET_PROFILE_ID);						attrid = sdp_list_append(0, &range);			search = sdp_list_append(0, &group);			searchresult =			sdp_service_search_attr_req(hs_sdp_session, search, SDP_ATTR_REQ_RANGE,							attrid, &seq);			sdp_list_free(attrid, 0);			sdp_list_free(search, 0);					if (searchresult == 0) {				for (; seq; seq = next) {					sdp_record_t *rec = (sdp_record_t *) seq->data;					sdp_list_t *list = 0;					if (sdp_get_access_protos(rec, &list) == 0) {						channel = sdp_get_proto_port(list, RFCOMM_UUID);					}					next = seq->next;					free(seq);					sdp_record_free(rec);				}			}			else {				syslog(LOG_WARNING, "Service search failed: %s", strerror(errno));			}			sdp_close(hs_sdp_session);			/* Socket is already closed by sdp_close, so we only zero it */			hspd_sockets[IDX_SDP_SOCK] = 0;			/* Try connecting to bluetooth headset */			int _rfcomm_sock = rfcommConnectAsync(&hs_bdaddr, channel);						if(_rfcomm_sock >= 0) {				hspd_sockets[IDX_RFCOMM_SOCK] = _rfcomm_sock;				this->_next_state = &HeadsetConnectingState;			}			else {				appl_send_error_pkt(errno);				syslog(LOG_ERR, "unable to create bluetooth RFCOMM socket: %s", strerror(errno));			}		}		else {			appl_send_error_pkt(errcode);			syslog(LOG_NOTICE, "unable to connect L2CAP socket to headset: %s", strerror(errcode));			/* go to default state : idle */		}	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色诱亚洲精品久久久久久| 亚洲人被黑人高潮完整版| 国产欧美一区二区精品性| 一区二区免费看| 蜜臀av亚洲一区中文字幕| 一本一道波多野结衣一区二区| 日韩女优av电影在线观看| 国产精品精品国产色婷婷| 日本一区中文字幕| 91影院在线观看| 久久久精品影视| 美日韩一区二区三区| 欧美图区在线视频| 国产精品久久久久桃色tv| 久久超级碰视频| 欧美一卡2卡3卡4卡| 成人免费小视频| 国产成a人亚洲| 久久蜜臀中文字幕| 精品一区二区三区视频在线观看 | 亚洲图片激情小说| 国产一区二区剧情av在线| 欧美高清激情brazzers| 亚洲女同ⅹxx女同tv| 丁香婷婷综合网| 久久久精品黄色| 国产成人精品三级麻豆| 精品久久久久久久久久久久包黑料 | 亚洲美女视频在线观看| 国产电影一区在线| 欧美精品一区二区三区四区| 日本欧美一区二区三区| 欧美美女一区二区三区| 午夜影院久久久| 欧美色视频一区| 香蕉乱码成人久久天堂爱免费| 欧美日韩国产首页| 日本中文字幕一区二区有限公司| 51精品秘密在线观看| 日本vs亚洲vs韩国一区三区| 在线播放91灌醉迷j高跟美女| 亚洲电影一区二区| 7777精品伊人久久久大香线蕉经典版下载 | 色偷偷88欧美精品久久久| 中文字幕不卡在线播放| 大美女一区二区三区| 亚洲手机成人高清视频| 欧洲精品一区二区| 日韩中文字幕不卡| 精品国产乱码91久久久久久网站| 国内精品久久久久影院色| 国产亚洲精品aa| 91女厕偷拍女厕偷拍高清| 亚洲福利一区二区三区| 欧美成人午夜电影| 成人午夜电影久久影院| 一区二区三区成人在线视频| 538在线一区二区精品国产| 国产又粗又猛又爽又黄91精品| 国产精品卡一卡二卡三| 欧美性xxxxx极品少妇| 久久99热99| 日韩久久一区二区| 欧美xxxxxxxx| 色乱码一区二区三区88| 另类的小说在线视频另类成人小视频在线| 欧美tk丨vk视频| 94-欧美-setu| 免费在线欧美视频| 亚洲人成7777| 久久亚洲综合色一区二区三区| 色域天天综合网| 国产一区二区三区四区在线观看 | 99久久免费国产| 午夜电影网亚洲视频| 国产日产精品1区| 欧美日韩免费视频| 国产成人一级电影| 肉丝袜脚交视频一区二区| 中文字幕不卡在线观看| 日韩视频免费观看高清完整版| 欧美一区二区三区啪啪| www.欧美亚洲| 精品亚洲成a人| 午夜欧美大尺度福利影院在线看| 国产一区二区精品久久99| 欧美视频一区在线观看| 亚洲黄色av一区| 在线观看日韩电影| 一区二区三区精品视频在线| 不卡欧美aaaaa| 美女诱惑一区二区| 久久精品国产精品亚洲精品| 国内一区二区视频| 国产在线精品一区在线观看麻豆| 亚洲精品va在线观看| 国产日韩欧美综合一区| 在线91免费看| 欧美三级中文字| 色噜噜夜夜夜综合网| 91网站最新地址| 成人国产精品免费网站| 极品尤物av久久免费看| 日韩影院精彩在线| 午夜激情久久久| 中文字幕免费不卡| 日韩欧美一卡二卡| 成人高清视频在线| 亚洲成a人在线观看| 欧美精品一区二区在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 久久久不卡网国产精品二区| 极品少妇xxxx精品少妇| 亚洲欧美日韩成人高清在线一区| 欧美亚洲动漫另类| 国产精品18久久久久久久久久久久| 国产精品久久久久久久久果冻传媒 | 成人av综合在线| 亚洲二区在线观看| 一区二区三区av电影| 欧美不卡一区二区三区四区| 91久久香蕉国产日韩欧美9色| 久久99九九99精品| 有坂深雪av一区二区精品| 欧美色手机在线观看| 7777精品伊人久久久大香线蕉完整版| 色嗨嗨av一区二区三区| 久久99精品久久只有精品| 国产精品毛片久久久久久久| 91麻豆免费在线观看| 日日夜夜免费精品视频| 亚洲香肠在线观看| 亚洲自拍偷拍九九九| 午夜精品福利一区二区三区蜜桃| 在线观看av一区二区| 亚洲女人****多毛耸耸8| 日韩电影在线免费看| 日韩精品一级二级 | 色系网站成人免费| 日本韩国欧美三级| 欧美一级二级三级乱码| 精品日韩在线观看| 国产欧美日韩卡一| 青青国产91久久久久久| 久久 天天综合| 北条麻妃一区二区三区| 97久久久精品综合88久久| 欧美一区二区三区四区在线观看| 欧美精品成人一区二区三区四区| 欧美三级电影精品| 久久蜜桃一区二区| 欧美国产综合一区二区| 一区二区三区精品久久久| 男人的j进女人的j一区| av激情成人网| 欧美高清www午色夜在线视频| 日韩一区二区三区免费看| 欧美国产视频在线| 青青草精品视频| 色综合久久久久网| 亚洲精品一区二区三区福利| 夜夜嗨av一区二区三区中文字幕| 日韩电影免费一区| 色综合av在线| 国产色一区二区| 久久狠狠亚洲综合| 日韩视频一区二区在线观看| 日韩理论在线观看| 国产一区二区在线电影| 欧洲av在线精品| 国产精品美女一区二区在线观看| 国产揄拍国内精品对白| 欧美唯美清纯偷拍| 日韩中文字幕亚洲一区二区va在线| 国产米奇在线777精品观看| 国产午夜精品久久久久久免费视| 日韩高清国产一区在线| 9191成人精品久久| 夜夜嗨av一区二区三区中文字幕 | 久久久一区二区三区| 亚洲综合另类小说| 337p日本欧洲亚洲大胆精品| 久久久久久麻豆| 国产精品久久久久一区二区三区| 成人夜色视频网站在线观看| 欧美日韩一区久久| 亚洲精品国久久99热| 成人av网在线| 国产丝袜美腿一区二区三区| 久久丁香综合五月国产三级网站| 欧美日韩一级视频| 亚洲午夜久久久久久久久久久| 91影视在线播放| 亚洲三级免费观看| 91丨九色丨蝌蚪丨老版| 国产精品电影院| caoporn国产精品| 欧洲在线/亚洲| 男人的j进女人的j一区| 欧美精品一区二区三区视频|