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

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

?? states.c

?? linxu內(nèi)核中
?? 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 */		}	}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人精品免费网站| 成人午夜精品在线| 午夜电影久久久| 亚洲一卡二卡三卡四卡 | 婷婷中文字幕一区三区| 一区二区三区高清| 亚洲综合色噜噜狠狠| 亚洲影院免费观看| 亚洲一二三四在线| 偷窥少妇高潮呻吟av久久免费| 亚洲一区二区三区四区在线| 亚洲最大色网站| 亚洲成人免费观看| 蜜桃av噜噜一区| 国产一区二区久久| 成人一区在线看| 色婷婷一区二区三区四区| 91免费视频大全| 国产日韩精品久久久| 欧美激情综合在线| 中文字幕一区免费在线观看| 亚洲精品va在线观看| 日精品一区二区| 国产馆精品极品| 色综合夜色一区| 7777精品伊人久久久大香线蕉经典版下载 | 国产福利91精品一区二区三区| 亚洲小说春色综合另类电影| 亚洲一二三四在线观看| 亚洲午夜久久久久久久久久久| 亚洲一区在线看| 日韩在线一区二区三区| 国产成人在线看| 国产成人99久久亚洲综合精品| 美女任你摸久久| 高清shemale亚洲人妖| 成人黄色电影在线 | 不卡的av网站| 欧美日韩久久一区| 国产+成+人+亚洲欧洲自线| 99国产精品久久久久久久久久久 | 精品国产第一区二区三区观看体验 | 日韩欧美在线网站| 国产一区二区在线观看视频| 成人午夜免费视频| 337p亚洲精品色噜噜| 国产亚洲精品超碰| 欧美日韩中文国产| 久久久99久久| 丝瓜av网站精品一区二区| 国产91精品免费| 欧美日韩电影在线| 国产精品美女久久久久久2018| 亚洲高清在线精品| 国产成人在线看| 8x福利精品第一导航| 国产精品人成在线观看免费| 91.麻豆视频| 亚洲视频一二区| 韩国av一区二区三区| 在线精品视频一区二区| 久久久不卡网国产精品二区| 亚洲超丰满肉感bbw| 成人午夜碰碰视频| 欧美xxxx在线观看| 91精品国产一区二区三区香蕉| 欧美国产精品专区| 麻豆视频观看网址久久| 欧美中文字幕一区| 国产精品丝袜一区| 久久国产精品99精品国产| 欧美经典三级视频一区二区三区| 美女网站色91| 国产拍揄自揄精品视频麻豆| 色悠悠久久综合| 国产农村妇女精品| 99久久久无码国产精品| 久久久国产精品麻豆| 轻轻草成人在线| 91精品国产麻豆| 久久99精品一区二区三区| 蜜桃久久av一区| 91美女视频网站| 色婷婷综合久色| 中文一区二区在线观看| 日本sm残虐另类| 欧美在线一二三四区| 亚洲三级电影全部在线观看高清| 国产久卡久卡久卡久卡视频精品| 欧美电影在哪看比较好| 亚洲第一久久影院| 欧美综合色免费| 一区二区三区成人在线视频| 自拍偷自拍亚洲精品播放| 国产福利一区二区| 久久先锋影音av鲁色资源| 人人精品人人爱| 在线播放日韩导航| 日韩av在线播放中文字幕| 欧美色精品天天在线观看视频| 亚洲精品高清视频在线观看| 色成年激情久久综合| 亚洲精品自拍动漫在线| 日本韩国一区二区三区视频| 一区二区三区在线高清| 91精品办公室少妇高潮对白| 一区二区三区91| 在线观看国产日韩| 亚洲成人资源网| 欧美片在线播放| 日本一区中文字幕| 日韩精品资源二区在线| 国产一区二区视频在线| 久久午夜国产精品| 国产精品系列在线观看| 国产精品久久久久久久第一福利| 丁香婷婷综合激情五月色| 国产精品国产三级国产有无不卡| 成人午夜精品在线| 综合激情成人伊人| 欧美视频一区在线| 麻豆精品精品国产自在97香蕉| 欧美变态tickle挠乳网站| 粉嫩绯色av一区二区在线观看| 国产精品免费av| 日本精品一区二区三区高清| 日韩精品色哟哟| 久久影院午夜论| 成人av电影在线| 一区二区三区精品久久久| 91精品国产91热久久久做人人| 精品综合久久久久久8888| 国产欧美精品一区二区色综合 | 在线视频欧美区| 欧美成人a∨高清免费观看| 欧美精品电影在线播放| 91福利在线播放| 一本色道久久综合亚洲精品按摩| 成人丝袜高跟foot| 99久久免费视频.com| 盗摄精品av一区二区三区| 国产精品亚洲第一| 99国产精品久| 色国产精品一区在线观看| 欧美日韩国产高清一区二区| 91.xcao| 一区二区三区不卡视频| 欧美一区二区在线视频| 国产精品一区二区黑丝| 亚洲欧美偷拍另类a∨色屁股| 欧美日韩国产经典色站一区二区三区| 久久99热99| 亚洲黄网站在线观看| 日韩一本二本av| 亚洲va欧美va人人爽| 日日骚欧美日韩| 精品在线一区二区三区| 国产乱理伦片在线观看夜一区| 成人午夜视频福利| 欧美日韩一区二区欧美激情| 欧美高清你懂得| 久久久久久免费网| 亚洲精品v日韩精品| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产麻豆精品久久一二三| 成人午夜私人影院| 欧美日韩国产综合视频在线观看| 欧美成人高清电影在线| 亚洲欧美经典视频| 久久99精品国产麻豆婷婷| 成熟亚洲日本毛茸茸凸凹| 在线精品视频免费观看| 久久久亚洲高清| 亚洲1区2区3区视频| 欧美一级久久久| 国产日韩欧美在线一区| 国产91富婆露脸刺激对白| 日韩一卡二卡三卡国产欧美| 国产精品电影一区二区三区| 中文字幕亚洲区| 亚洲va韩国va欧美va| 成人免费视频免费观看| 欧美一区二区三区在线| 国产精品色哟哟| 99国产精品国产精品久久| 国产麻豆成人传媒免费观看| 国产精品国产三级国产aⅴ中文 | 26uuu国产日韩综合| 欧美一区二区三区在线观看| 欧美午夜寂寞影院| 色av成人天堂桃色av| 99久久777色| 国内精品免费**视频| 国产欧美va欧美不卡在线| 欧美bbbbb| 精品免费一区二区三区| 免费高清不卡av| 日韩区在线观看| 韩国av一区二区三区| 精品国产自在久精品国产|