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

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

?? daemon.c

?? linxu內核中
?? C
字號:
/* * *  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 <sys/socket.h>#include <sys/un.h>#include <fcntl.h>#include <unistd.h>#include <signal.h>#include <errno.h>#include <syslog.h>#include <assert.h>#include <bluetooth/bluetooth.h>#include <bluetooth/rfcomm.h>#include <bluetooth/sdp.h>#include <bluetooth/sdp_lib.h>#include <config.h>#include "daemon.h"#include "sdp.h"#include "volctl.h"/* Local defines */#define PCM_SERVER_SOCKET "\0bluez-headset-pcm"#define CTL_SERVER_SOCKET "\0bluez-headset-ctl"/* Local data */volatile sig_atomic_t terminate = 0;static   sdp_session_t *sdp_session;/* Local functions declaration */static void daemon_checkNewState  (struct Daemon *this);static int  daemon_dispatchEvents (struct Daemon *this, const short revents[], int pollrvalue);static void sig_term(int sig);/* Functions definitions */int createDaemon(struct Daemon* this){	this->_cur_state     = &HeadsetIdleState;	openlog("headsetd", LOG_PID | LOG_NDELAY | LOG_PERROR, LOG_DAEMON);	syslog(LOG_INFO, "Bluetooth headset daemon version " VERSION);	/* Initialising Applicative PCM server socket */	int _appl_srv_sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);    	if(_appl_srv_sockfd < 0)  	{    		syslog(LOG_ERR, "socket(_appl_srv_sockfd): %s", strerror(errno));    		return -1;  	}	struct sockaddr_un  pcm_srv_sock = {		AF_UNIX, PCM_SERVER_SOCKET	};	if(bind(_appl_srv_sockfd, (struct sockaddr *)&pcm_srv_sock, sizeof(pcm_srv_sock)) != 0) {    		syslog(LOG_ERR, "bind(_appl_srv_sockfd): %s", strerror(errno));		goto error;		}  	/* Set socket as non blocking */	if(fcntl(_appl_srv_sockfd, F_SETFL, O_NONBLOCK) < 0) {    		syslog(LOG_ERR, "fcntl(_appl_srv_sockfd): %s", strerror(errno));		goto error;		}	listen(_appl_srv_sockfd, 1);	/* Initialising Applicative CTL server socket */	int _appl_ctlsrv_sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);    	if(_appl_ctlsrv_sockfd < 0)  	{    		syslog(LOG_ERR, "socket(_appl_ctlsrv_sockfd): %s", strerror(errno));    		goto error;  	}	struct sockaddr_un  ctl_srv_sock = {		AF_UNIX, CTL_SERVER_SOCKET	};	if(bind(_appl_ctlsrv_sockfd, (struct sockaddr *)&ctl_srv_sock, sizeof(ctl_srv_sock)) != 0) {    		syslog(LOG_ERR, "bind(_appl_ctlsrv_sockfd): %s", strerror(errno));		goto error2;		}  	/* Set socket as non blocking */	if(fcntl(_appl_ctlsrv_sockfd, F_SETFL, O_NONBLOCK) < 0) {    		syslog(LOG_ERR, "fcntl(_appl_srv_sockfd): %s", strerror(errno));		goto error2;		}	listen(_appl_ctlsrv_sockfd, 1);	/* Initialising RFCOMM server socket */	int _rfcomm_srv_sockfd = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);  	if(_rfcomm_srv_sockfd < 0)  	{    		syslog(LOG_ERR, "socket(_rfcomm_srv_sockfd): %s", strerror(errno));		goto error2;	  	}	struct sockaddr_rc socka;	socka.rc_family  = AF_BLUETOOTH;	socka.rc_channel = 1;	socka.rc_bdaddr  = *BDADDR_ANY;	/* We loop until we find a free channel to bind to */	int rfcomm_channel;	for(rfcomm_channel = 0; (rfcomm_channel == 0) && (socka.rc_channel <= 31); socka.rc_channel += 2) {		if(bind(_rfcomm_srv_sockfd, (struct sockaddr *)&socka, sizeof(socka)) == 0) {			rfcomm_channel = socka.rc_channel;		}		else if(errno != EADDRINUSE) {			syslog(LOG_ERR, "bind(_rfcomm_srv_sockfd): %s", strerror(errno));			goto error3;			}	}  	/* Set socket as non blocking */	if(fcntl(_rfcomm_srv_sockfd, F_SETFL, O_NONBLOCK) < 0) {    		syslog(LOG_ERR, "fcntl(_rfcomm_srv_sockfd): %s", strerror(errno));		goto error3;		}	listen(_rfcomm_srv_sockfd, 1);	/* registering sdp record */	if((sdp_session = sdp_headset_register(rfcomm_channel)) == 0) {		goto error3;	}	/* FROM THIS POINT WE KNOW WE ARE GOOD */	hspd_sockets[IDX_PCM_APPL_SRV_SOCK] = _appl_srv_sockfd;	hspd_sockets[IDX_CTL_APPL_SRV_SOCK] = _appl_ctlsrv_sockfd;	hspd_sockets[IDX_RFCOMM_SRV_SOCK] = _rfcomm_srv_sockfd;	/* enter idle state */	HeadsetIdleState.enter(&HeadsetIdleState);	/* Initialising signal handlers */	struct sigaction sa;	/* setup sigterm handler. we must make sure to do a clean disconnect */	memset(&sa, 0, sizeof(sa));	sa.sa_flags = SA_NOCLDSTOP;	sa.sa_handler = sig_term;	sigaction(SIGTERM, &sa, NULL);	sigaction(SIGINT, &sa, NULL);	return 0;	error3:	close(_rfcomm_srv_sockfd);error2:	close(_appl_ctlsrv_sockfd);error:	close(_appl_srv_sockfd);	return -1;}static int daemon_dispatchEvents (struct Daemon *this, const short revents_tbl[], int pollrvalue){	short revents;	const int USLEEP_VALUE = 100000;	/* Checking if we have been interrupted */	if(terminate) {		/* exit from loop */		return 1;	}	/* Checking if timeout */	if (pollrvalue == 0) {		struct State *s = this->_cur_state;		if(s->timedout) {			s->timedout(s);			daemon_checkNewState(this);		}		else {	    		syslog(LOG_ERR, "unexpected Timeout happened in state %s", s->name);		}		return 0;	}	revents = revents_tbl[IDX_CTL_APPL_SRV_SOCK];	if(revents) {		struct State *s = this->_cur_state;		s->readCtlAppl(s, revents);		return 0;	}	revents = revents_tbl[IDX_PCM_APPL_SRV_SOCK];	if(revents) {		struct State *s = this->_cur_state;		if(s->handleApplConnReq) {			s->handleApplConnReq(s);			daemon_checkNewState(this);		}		else {	    		syslog(LOG_ERR, "unexpected event handleApplConnReq received in state %s", s->name);			/* Ending up here means there is a bug, and we have a very high chance			to end up looping on this forever. So we sleep a bit to avoid eating			100 % CPU */			usleep(USLEEP_VALUE);		}		return 0;	}	revents = revents_tbl[IDX_RFCOMM_SOCK];	if(revents) {		struct State *s = this->_cur_state;		if(s->readRfcomm) {			s->readRfcomm(s, revents);			daemon_checkNewState(this);		}		else {			syslog(LOG_ERR, "unexpected event readRfcomm received in state %s",				s->name);			/* Ending up here means there is a bug, and we have a very high chance			to end up looping on this forever. So we sleep a bit to avoid eating			100 % CPU */			usleep(USLEEP_VALUE);		}		return 0;	}	revents = revents_tbl[IDX_PCM_APPL_SOCK];	if(revents) {		struct State *s = this->_cur_state;		if(s->readPcmAppl) {			s->readPcmAppl(s, revents);			daemon_checkNewState(this);		}		else {			syslog(LOG_ERR, "unexpected event readPcmAppl received in state %s",				s->name);			/* Ending up here means there is a bug, and we have a very high chance			to end up looping on this forever. So we sleep a bit to avoid eating			100 % CPU */			usleep(USLEEP_VALUE);		}		return 0;	}	revents = revents_tbl[IDX_SCO_SOCK];	if(revents) {		struct State *s = this->_cur_state;		if(s->readSco) {			s->readSco(s, revents);			daemon_checkNewState(this);		}		else {			syslog(LOG_ERR, "unexpected event readSco received in state %s",				s->name);			/* Ending up here means there is a bug, and we have a very high chance			to end up looping on this forever. So we sleep a bit to avoid eating			100 % CPU */			usleep(USLEEP_VALUE);		}		return 0;	}	revents = revents_tbl[IDX_RFCOMM_SRV_SOCK];	if(revents) {		struct State *s = this->_cur_state;		if(s->handleRfcommConnReq) {			s->handleRfcommConnReq(s);			daemon_checkNewState(this);		}		else {			syslog(LOG_ERR, "unexpected event handleRfcommConnReq received in state %s",				s->name);			/* Ending up here means there is a bug, and we have a very high chance			to end up looping on this forever. So we sleep a bit to avoid eating			100 % CPU */			usleep(USLEEP_VALUE);		}		return 0;	}	revents = revents_tbl[IDX_SDP_SOCK];	if(revents) {		struct State *s = this->_cur_state;		if(s->readSdp) {			s->readSdp(s, revents);			daemon_checkNewState(this);		}		else {			syslog(LOG_ERR, "unexpected event handleRfcommConnReq received in state %s",				s->name);			/* Ending up here means there is a bug, and we have a very high chance			to end up looping on this forever. So we sleep a bit to avoid eating			100 % CPU */			usleep(USLEEP_VALUE);		}		return 0;	}	return 0;}void daemon_checkNewState  (struct Daemon *this){	struct State *s = this->_cur_state;	struct State *new = s->getNextState(s);	this->_cur_state = new;	if(new != s) {		syslog(LOG_INFO, "Changing state: %s-->%s", s->name, new->name);		if(new->enter) {			new->enter(new);			/* Transitionnal states may change their state in enter method,			   so we have to check recursively */			daemon_checkNewState(this);		}	}}void daemon_enterLoop(struct Daemon *this){	int done;	int timeout;	int ret;	int i;	nfds_t poll_nfds;	struct pollfd pollfds[DAEMON_NUM_SOCKS];	short revents[DAEMON_NUM_SOCKS];	do {		struct State *s = this->_cur_state;		/* Getting timeout */		if(s->getTimeout) {			timeout = s->getTimeout(s);		}		else {			timeout = -1;		}		/* Getting file descriptors to poll on */		poll_nfds = 0;		for(i = 0; i < DAEMON_NUM_SOCKS; i++) {		#ifndef NDEBUG				/* This may indicate an error, but not always - as such, we disable this			   warning for release */			if(hspd_sockets[i] == 0 && s->pollEvents[i] != 0) {				fprintf(stderr, "WARNING: polling on non existent socket idx=%d\n", i);			}		#endif			if(s->pollEvents[i] != 0) {				pollfds[poll_nfds].fd     = hspd_sockets[i];				pollfds[poll_nfds].events = s->pollEvents[i];				poll_nfds++;			}		}		ret  = poll(pollfds, poll_nfds, timeout);		/* Putting return events in order */		poll_nfds = 0;		for(i = 0; i < DAEMON_NUM_SOCKS; i++) {			if(s->pollEvents[i] == 0) {				revents[i] = 0;			}			else {				revents[i] = pollfds[poll_nfds].revents;				poll_nfds++;			}		}		done = daemon_dispatchEvents(this, revents, ret);	} while (!done);}void daemon_destroy(struct Daemon *this){	syslog(LOG_INFO, "exiting cleanly");	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;	}	close(hspd_sockets[IDX_PCM_APPL_SRV_SOCK]);	hspd_sockets[IDX_PCM_APPL_SRV_SOCK] = 0;	close(hspd_sockets[IDX_CTL_APPL_SRV_SOCK]);	hspd_sockets[IDX_CTL_APPL_SRV_SOCK] = 0;	close(hspd_sockets[IDX_RFCOMM_SRV_SOCK]);	hspd_sockets[IDX_RFCOMM_SRV_SOCK] = 0;	sdp_close(sdp_session);	sdp_session = 0;	volctl_release();}static void sig_term(int sig){	terminate = 1;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久美女毛片| 欧美精品久久久久久久久老牛影院| 亚洲欧美怡红院| 欧美另类一区二区三区| 丰满岳乱妇一区二区三区| 一区二区三区在线视频免费观看| 欧美日韩免费电影| 不卡一区二区三区四区| 美女精品自拍一二三四| 国产日韩欧美不卡在线| 91精品国产色综合久久不卡蜜臀 | 亚洲一区在线视频| 国产日韩精品一区二区三区| 欧美一区二区高清| 欧美中文字幕不卡| 成人精品一区二区三区四区 | 亚洲aaa精品| 亚洲人一二三区| 久久理论电影网| 日韩一区二区不卡| 欧美日韩视频在线观看一区二区三区 | 国产成人福利片| 麻豆91在线播放| 日韩国产高清在线| 亚洲午夜在线电影| 一区二区三区中文在线观看| 国产精品久久久久婷婷| 国产亚洲一区二区三区在线观看 | 欧美电影免费观看高清完整版| 欧美吻胸吃奶大尺度电影| 91婷婷韩国欧美一区二区| 国产69精品久久久久毛片| 激情图区综合网| 激情av综合网| 麻豆91在线播放免费| 久久国产精品一区二区| 九色|91porny| 日本成人在线不卡视频| 三级久久三级久久| 三级一区在线视频先锋| 日本欧美肥老太交大片| 秋霞电影一区二区| 奇米色777欧美一区二区| 奇米色777欧美一区二区| 日韩 欧美一区二区三区| 奇米亚洲午夜久久精品| 麻豆成人在线观看| 国产精品羞羞答答xxdd| 成人av先锋影音| 一本一道久久a久久精品综合蜜臀| 91丨porny丨最新| 精品视频999| 91麻豆精品国产91久久久久久| 制服丝袜在线91| 欧美成人艳星乳罩| 久久先锋资源网| 国产精品麻豆一区二区| 亚洲美女电影在线| 亚洲第一电影网| 六月丁香综合在线视频| 高清视频一区二区| 国产目拍亚洲精品99久久精品| 日韩在线一二三区| 中文字幕欧美国产| 亚洲欧美日韩一区二区| 亚洲国产日韩在线一区模特| 日韩激情在线观看| 国产乱子伦视频一区二区三区 | 久久理论电影网| 中文字幕亚洲不卡| 亚洲成av人影院| 国模冰冰炮一区二区| 99视频精品全部免费在线| 91官网在线免费观看| 欧美一区二区福利在线| 国产日产欧美一区| 亚洲午夜三级在线| 欧美性一级生活| 91精品国产色综合久久不卡电影| 久久久久久免费网| 亚洲资源在线观看| 韩国一区二区三区| 91麻豆蜜桃一区二区三区| 欧美一级久久久久久久大片| 欧美韩国日本不卡| 亚洲v中文字幕| 从欧美一区二区三区| 欧美日韩一区三区四区| 久久久99精品久久| 午夜精品久久久久久久99樱桃| 国产乱人伦精品一区二区在线观看 | 亚洲视频一区二区免费在线观看| 亚洲国产va精品久久久不卡综合| 国产尤物一区二区| 在线精品视频一区二区三四| 久久久国际精品| 性感美女极品91精品| 成人h动漫精品| 欧美大尺度电影在线| 亚洲综合色网站| 高清beeg欧美| 欧美xxxxx牲另类人与| 一区二区三区日韩欧美精品| 国产精品一区二区在线看| 欧美日本视频在线| 亚洲人123区| 国产成人免费视频一区| 欧美一区国产二区| 亚洲国产wwwccc36天堂| 成人av电影免费观看| 26uuu国产在线精品一区二区| 亚洲高清在线精品| 91美女蜜桃在线| 国产精品久久久久久久裸模| 狠狠狠色丁香婷婷综合激情 | 国内久久精品视频| 4438x亚洲最大成人网| 一区二区三区久久久| 成人网在线免费视频| 2021久久国产精品不只是精品| 亚洲国产精品一区二区www在线| 波多野结衣在线一区| 26uuu亚洲| 韩国女主播一区| 日韩午夜中文字幕| 日本欧美在线观看| 8v天堂国产在线一区二区| 午夜国产精品影院在线观看| 欧美综合亚洲图片综合区| 亚洲人成影院在线观看| av一本久道久久综合久久鬼色| 中文字幕av不卡| 成+人+亚洲+综合天堂| 欧美国产日韩在线观看| 国产精品综合网| 日本一区二区免费在线观看视频| 国产主播一区二区| 亚洲成人黄色影院| 在线观看网站黄不卡| 一区二区三区中文在线观看| 在线观看欧美日本| 一区二区日韩电影| 欧美三级蜜桃2在线观看| 午夜久久久久久久久| 欧美高清一级片在线| 日本最新不卡在线| 精品乱人伦小说| 国产成人在线影院 | 欧美xxx久久| 国产一区二区三区免费| 国产欧美一二三区| 99久久精品国产观看| 亚洲综合色视频| 日韩精品中午字幕| 国产 日韩 欧美大片| 亚洲天堂a在线| 欧美日韩午夜在线视频| 蜜桃视频在线观看一区| 久久综合九色综合97_久久久| 大白屁股一区二区视频| 一级做a爱片久久| 欧美一区二区三区日韩| 精彩视频一区二区三区| 国产精品水嫩水嫩| 欧美午夜电影在线播放| 捆绑变态av一区二区三区| 国产三级精品视频| 91电影在线观看| 日韩中文字幕av电影| 久久久高清一区二区三区| 99国产精品视频免费观看| 亚洲成人黄色影院| 久久久久国产免费免费| 色悠悠久久综合| 激情综合亚洲精品| 亚洲伦理在线免费看| 欧美一区二区私人影院日本| 国产成人aaaa| 五月婷婷欧美视频| 国产欧美精品一区二区色综合朱莉| 91在线视频18| 久久丁香综合五月国产三级网站| 中文字幕不卡在线观看| 6080国产精品一区二区| 成人做爰69片免费看网站| 午夜欧美视频在线观看| 国产区在线观看成人精品 | 欧美一区欧美二区| av电影天堂一区二区在线| 日韩av电影天堂| 国产在线精品一区二区三区不卡 | 亚洲123区在线观看| 日本一区二区三区久久久久久久久不 | 日韩电影网1区2区| 中文字幕一区二区三区乱码在线| 欧美人成免费网站| 国产成人av电影| 亚洲精品美国一| 欧美成人福利视频| 欧美私模裸体表演在线观看|