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

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

?? pri.c

?? Q921的LINUX下的驅(qū)動源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * libpri: An implementation of Primary Rate ISDN * * Written by Mark Spencer <markster@digium.com> * * Copyright (C) 2001-2005, Digium * All Rights Reserved. * * 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., 675 Mass Ave, Cambridge, MA 02139, USA.  * */#include <unistd.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/select.h>#include <stdarg.h>#include "compat.h"#include "libpri.h"#include "pri_internal.h"#include "pri_facility.h"#include "pri_q921.h"#include "pri_q931.h"#include "pri_timers.h"char *pri_node2str(int node){	switch(node) {	case PRI_UNKNOWN:		return "Unknown node type";	case PRI_NETWORK:		return "Network";	case PRI_CPE:		return "CPE";	default:		return "Invalid value";	}}char *pri_switch2str(int sw){	switch(sw) {	case PRI_SWITCH_NI2:		return "National ISDN";	case PRI_SWITCH_DMS100:		return "Nortel DMS100";	case PRI_SWITCH_LUCENT5E:		return "Lucent 5E";	case PRI_SWITCH_ATT4ESS:		return "AT&T 4ESS";	case PRI_SWITCH_NI1:		return "National ISDN 1";	case PRI_SWITCH_EUROISDN_E1:		return "EuroISDN";	case PRI_SWITCH_GR303_EOC:		return "GR303 EOC";	case PRI_SWITCH_GR303_TMC:		return "GR303 TMC";	case PRI_SWITCH_QSIG:		return "Q.SIG switch";	default:		return "Unknown switchtype";	}}static void pri_default_timers(struct pri *pri, int switchtype){	int defaulttimers[20][PRI_MAX_TIMERS] = PRI_TIMERS_ALL;	int x;	for (x = 0; x<PRI_MAX_TIMERS; x++) {		pri->timers[x] = defaulttimers[switchtype][x];	}}int pri_set_timer(struct pri *pri, int timer, int value){	if (timer < 0 || timer > PRI_MAX_TIMERS || value < 0)		return -1;	pri->timers[timer] = value;	return 0;}int pri_get_timer(struct pri *pri, int timer){	if (timer < 0 || timer > PRI_MAX_TIMERS)		return -1;	return pri->timers[timer];}int pri_timer2idx(char *timer){	if (!strcasecmp(timer, "N200"))		return PRI_TIMER_N200;	else if (!strcasecmp(timer, "N201"))		return PRI_TIMER_N201;	else if (!strcasecmp(timer, "N202"))		return PRI_TIMER_N202;	else if (!strcasecmp(timer, "K"))		return PRI_TIMER_K;	else if (!strcasecmp(timer, "T200"))		return PRI_TIMER_T200;	else if (!strcasecmp(timer, "T202"))		return PRI_TIMER_T202;	else if (!strcasecmp(timer, "T203"))		return PRI_TIMER_T203;	else if (!strcasecmp(timer, "T300"))		return PRI_TIMER_T300;	else if (!strcasecmp(timer, "T301"))		return PRI_TIMER_T301;	else if (!strcasecmp(timer, "T302"))		return PRI_TIMER_T302;	else if (!strcasecmp(timer, "T303"))		return PRI_TIMER_T303;	else if (!strcasecmp(timer, "T304"))		return PRI_TIMER_T304;	else if (!strcasecmp(timer, "T305"))		return PRI_TIMER_T305;	else if (!strcasecmp(timer, "T306"))		return PRI_TIMER_T306;	else if (!strcasecmp(timer, "T307"))		return PRI_TIMER_T307;	else if (!strcasecmp(timer, "T308"))		return PRI_TIMER_T308;	else if (!strcasecmp(timer, "T309"))		return PRI_TIMER_T309;	else if (!strcasecmp(timer, "T310"))		return PRI_TIMER_T310;	else if (!strcasecmp(timer, "T313"))		return PRI_TIMER_T313;	else if (!strcasecmp(timer, "T314"))		return PRI_TIMER_T314;	else if (!strcasecmp(timer, "T316"))		return PRI_TIMER_T316;	else if (!strcasecmp(timer, "T317"))		return PRI_TIMER_T317;	else if (!strcasecmp(timer, "T318"))		return PRI_TIMER_T318;	else if (!strcasecmp(timer, "T319"))		return PRI_TIMER_T319;	else if (!strcasecmp(timer, "T320"))		return PRI_TIMER_T320;	else if (!strcasecmp(timer, "T321"))		return PRI_TIMER_T321;	else if (!strcasecmp(timer, "T322"))		return PRI_TIMER_T322;	else		return -1;}static int __pri_read(struct pri *pri, void *buf, int buflen){	int res = read(pri->fd, buf, buflen);	if (res < 0) {		if (errno != EAGAIN)			pri_error(pri, "Read on %d failed: %s\n", pri->fd, strerror(errno));		return 0;	}	return res;}static int __pri_write(struct pri *pri, void *buf, int buflen){	int res = write(pri->fd, buf, buflen);	if (res < 0) {		if (errno != EAGAIN)			pri_error(pri, "Write to %d failed: %s\n", pri->fd, strerror(errno));		return 0;	}	return res;}static struct pri *__pri_new(int fd, int node, int switchtype, struct pri *master, pri_io_cb rd, pri_io_cb wr, void *userdata){	struct pri *p;	p = malloc(sizeof(struct pri));	if (p) {		memset(p, 0, sizeof(struct pri));		p->fd = fd;		p->read_func = rd;		p->write_func = wr;		p->userdata = userdata;		p->localtype = node;		p->switchtype = switchtype;		p->cref = 1;		p->sapi = Q921_SAPI_CALL_CTRL;		p->tei = 0;		p->nsf = PRI_NSF_NONE;		p->protodisc = Q931_PROTOCOL_DISCRIMINATOR;		p->master = master;		p->callpool = &p->localpool;		pri_default_timers(p, switchtype);#ifdef LIBPRI_COUNTERS		p->q921_rxcount = 0;		p->q921_txcount = 0;		p->q931_rxcount = 0;		p->q931_txcount = 0;#endif		if (switchtype == PRI_SWITCH_GR303_EOC) {			p->protodisc = GR303_PROTOCOL_DISCRIMINATOR;			p->sapi = Q921_SAPI_GR303_EOC;			p->tei = Q921_TEI_GR303_EOC_OPS;			p->subchannel = __pri_new(-1, node, PRI_SWITCH_GR303_EOC_PATH, p, NULL, NULL, NULL);			if (!p->subchannel) {				free(p);				p = NULL;			}		} else if (switchtype == PRI_SWITCH_GR303_TMC) {			p->protodisc = GR303_PROTOCOL_DISCRIMINATOR;			p->sapi = Q921_SAPI_GR303_TMC_CALLPROC;			p->tei = Q921_TEI_GR303_TMC_CALLPROC;			p->subchannel = __pri_new(-1, node, PRI_SWITCH_GR303_TMC_SWITCHING, p, NULL, NULL, NULL);			if (!p->subchannel) {				free(p);				p = NULL;			}		} else if (switchtype == PRI_SWITCH_GR303_TMC_SWITCHING) {			p->protodisc = GR303_PROTOCOL_DISCRIMINATOR;			p->sapi = Q921_SAPI_GR303_TMC_SWITCHING;			p->tei = Q921_TEI_GR303_TMC_SWITCHING;		} else if (switchtype == PRI_SWITCH_GR303_EOC_PATH) {			p->protodisc = GR303_PROTOCOL_DISCRIMINATOR;			p->sapi = Q921_SAPI_GR303_EOC;			p->tei = Q921_TEI_GR303_EOC_PATH;		}		/* Start Q.921 layer, Wait if we're the network */		if (p)			q921_start(p, p->localtype == PRI_CPE);	}	return p;}void pri_call_set_useruser(q931_call *c, const char *userchars){	if (userchars)		libpri_copy_string(c->useruserinfo, userchars, sizeof(c->useruserinfo));}void pri_sr_set_useruser(struct pri_sr *sr, const char *userchars){	sr->useruserinfo = userchars;}int pri_restart(struct pri *pri){	/* Restart Q.921 layer */	if (pri) {		q921_reset(pri);		q921_start(pri, pri->localtype == PRI_CPE);		}	return 0;}struct pri *pri_new(int fd, int nodetype, int switchtype){	return __pri_new(fd, nodetype, switchtype, NULL, __pri_read, __pri_write, NULL);}struct pri *pri_new_cb(int fd, int nodetype, int switchtype, pri_io_cb io_read, pri_io_cb io_write, void *userdata){	if (!io_read)		io_read = __pri_read;	if (!io_write)		io_write = __pri_write;	return __pri_new(fd, nodetype, switchtype, NULL, io_read, io_write, userdata);}void *pri_get_userdata(struct pri *pri){	return pri ? pri->userdata : NULL;}void pri_set_userdata(struct pri *pri, void *userdata){	if (pri)		pri->userdata = userdata;}void pri_set_nsf(struct pri *pri, int nsf){	if (pri)		pri->nsf = nsf;}char *pri_event2str(int id){	switch(id) {	case PRI_EVENT_DCHAN_UP:		return "D-Channel Up";	case PRI_EVENT_DCHAN_DOWN:		return "D-channel Down";	case PRI_EVENT_RESTART:		return "Restart channel";	case PRI_EVENT_RING:		return "Ring";	case PRI_EVENT_HANGUP:		return "Hangup";	case PRI_EVENT_RINGING:		return "Ringing";	case PRI_EVENT_ANSWER:		return "Answer";	case PRI_EVENT_HANGUP_ACK:		return "Hangup ACK";	case PRI_EVENT_RESTART_ACK:		return "Restart ACK";	case PRI_EVENT_FACNAME:		return "FacName";	case PRI_EVENT_INFO_RECEIVED:		return "Info Received";	case PRI_EVENT_PROCEEDING:		return "Proceeding";	case PRI_EVENT_SETUP_ACK:		return "Setup ACK";	case PRI_EVENT_HANGUP_REQ:		return "Hangup Req";	case PRI_EVENT_NOTIFY:		return "Notify";	case PRI_EVENT_PROGRESS:		return "Progress";	case PRI_EVENT_CONFIG_ERR:		return "Configuration Error";	default:		return "Unknown Event";	}}pri_event *pri_check_event(struct pri *pri){	char buf[1024];	int res;	pri_event *e;	res = pri->read_func ? pri->read_func(pri, buf, sizeof(buf)) : 0;	if (!res)		return NULL;	/* Receive the q921 packet */	e = q921_receive(pri, (q921_h *)buf, res);	return e;}static int wait_pri(struct pri *pri){		struct timeval *tv, real;	fd_set fds;	int res;	FD_ZERO(&fds);	FD_SET(pri->fd, &fds);	tv = pri_schedule_next(pri);	if (tv) {		gettimeofday(&real, NULL);		real.tv_sec = tv->tv_sec - real.tv_sec;		real.tv_usec = tv->tv_usec - real.tv_usec;		if (real.tv_usec < 0) {			real.tv_usec += 1000000;			real.tv_sec -= 1;		}		if (real.tv_sec < 0) {			real.tv_sec = 0;			real.tv_usec = 0;		}	}	res = select(pri->fd + 1, &fds, NULL, NULL, tv ? &real : tv);	if (res < 0) 		return -1;	return res;}pri_event *pri_mkerror(struct pri *pri, char *errstr){	/* Return a configuration error */	pri->ev.err.e = PRI_EVENT_CONFIG_ERR;	libpri_copy_string(pri->ev.err.err, errstr, sizeof(pri->ev.err.err));	return &pri->ev;}pri_event *pri_dchannel_run(struct pri *pri, int block){	pri_event *e;	int res;	if (!pri)		return NULL;	if (block) {		do {			e =  NULL;			res = wait_pri(pri);			/* Check for error / interruption */			if (res < 0)				return NULL;			if (!res)				e = pri_schedule_run(pri);			else				e = pri_check_event(pri);		} while(!e);	} else {		e = pri_check_event(pri);		return e;	}	return e;}void pri_set_debug(struct pri *pri, int debug){	if (!pri)		return;	pri->debug = debug;	if (pri->subchannel)		pri_set_debug(pri->subchannel, debug);}int pri_get_debug(struct pri *pri){	if (!pri)		return -1;	if (pri->subchannel)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费看日韩a级影片| 蜜臀精品一区二区三区在线观看| 五月婷婷久久综合| 一本一本大道香蕉久在线精品| 中文字幕欧美区| 一本色道a无线码一区v| 尤物av一区二区| 欧美一区三区二区| 韩国毛片一区二区三区| 中文字幕日韩欧美一区二区三区| 99久久99久久综合| 亚洲成a人v欧美综合天堂| 欧美一区二区三区人| 国产精品一区二区男女羞羞无遮挡 | 成人午夜精品在线| 最新高清无码专区| 欧美日韩精品综合在线| 激情小说欧美图片| 日韩毛片在线免费观看| 欧美日韩国产影片| 粉嫩av一区二区三区粉嫩| 亚洲欧洲中文日韩久久av乱码| 欧美日韩在线电影| 国产精品一区二区不卡| 亚洲精选在线视频| 26uuu亚洲婷婷狠狠天堂| a在线播放不卡| 日本不卡一区二区三区| 国产欧美精品区一区二区三区 | 欧美日韩不卡一区| 国产91丝袜在线播放九色| 伊人色综合久久天天人手人婷| 日韩亚洲欧美成人一区| 99精品国产91久久久久久| 日日夜夜精品视频免费| 国产精品免费网站在线观看| 欧美精品在线视频| eeuss国产一区二区三区| 久久精品av麻豆的观看方式| 亚洲视频一区二区在线| 精品国产sm最大网站免费看 | 4hu四虎永久在线影院成人| 国产成人av电影在线观看| 亚洲va天堂va国产va久| 国产精品久久久久三级| 日韩一区二区不卡| 色噜噜狠狠成人中文综合| 国产一区二区女| 丝袜美腿一区二区三区| 国产精品久久久久一区二区三区 | 国产一区二区三区黄视频 | 国产精品久久久久三级| 久久综合九色综合97婷婷女人| 欧美视频在线观看一区二区| 国产91露脸合集magnet| 一区二区三区日韩欧美| 国产精品国产自产拍高清av| 久久欧美一区二区| 欧美精品99久久久**| 在线视频一区二区免费| 91丝袜美腿高跟国产极品老师| 国产综合色精品一区二区三区| 亚洲1区2区3区4区| 中文字幕一区在线| 久久久久9999亚洲精品| 日韩亚洲国产中文字幕欧美| 26uuu色噜噜精品一区| 制服.丝袜.亚洲.中文.综合| 欧美日韩三级在线| 欧美日韩一区二区不卡| 欧洲一区在线电影| 色综合咪咪久久| 91同城在线观看| 色嗨嗨av一区二区三区| 色偷偷88欧美精品久久久| 91在线国内视频| 91免费视频观看| 在线中文字幕不卡| 91福利精品第一导航| 色综合天天狠狠| 在线观看国产日韩| 欧美福利视频一区| 91精品一区二区三区久久久久久| 欧美一区二区大片| 精品国免费一区二区三区| 精品国产乱码久久| 国产精品午夜久久| 中文字幕乱码一区二区免费| ㊣最新国产の精品bt伙计久久| 亚洲天堂免费看| 亚洲午夜电影网| 午夜日韩在线观看| 韩国成人在线视频| 国产东北露脸精品视频| 高清不卡一区二区| 欧美午夜精品久久久| 国产91精品欧美| 国产精品人成在线观看免费| 久久精品一级爱片| 国产农村妇女精品| 一区二区欧美精品| 日韩vs国产vs欧美| av资源网一区| 欧美日韩美少妇| 欧美高清在线视频| 丝袜亚洲另类丝袜在线| 成人av集中营| 激情国产一区二区| 中文在线免费一区三区高中清不卡| 欧美一级久久久久久久大片| 精品国产sm最大网站| 亚洲人成伊人成综合网小说| 午夜精品一区二区三区免费视频| 91香蕉视频mp4| 欧美精品一二三四| 欧美tickling挠脚心丨vk| 国产精品麻豆欧美日韩ww| 亚洲精品成人悠悠色影视| 青青草成人在线观看| 成人免费av网站| 欧美一级生活片| 中文字幕中文字幕一区二区| 日韩电影免费一区| 豆国产96在线|亚洲| 欧美精品日韩一本| 国产欧美日韩综合精品一区二区| 亚洲一二三四在线观看| 久久99精品久久久久婷婷| 国产成人综合在线观看| 欧美日韩一区成人| 国产精品免费视频观看| 麻豆91免费观看| 在线精品视频一区二区三四| 久久久久久久久久美女| 五月天精品一区二区三区| 91影院在线免费观看| 久久久国际精品| 久久www免费人成看片高清| 色丁香久综合在线久综合在线观看 | 精品成人一区二区三区四区| 一区二区三区久久| 日韩欧美国产综合| 亚洲精选视频免费看| 成人午夜av电影| 国产亚洲精品7777| 男女性色大片免费观看一区二区| 一本一道波多野结衣一区二区| 亚洲国产精品v| 国产老妇另类xxxxx| 久久国产精品免费| 国产精品素人一区二区| 5月丁香婷婷综合| 欧美福利视频导航| 一区二区久久久久久| 成人动漫在线一区| 国产日产欧美一区二区三区| 久久精品国产一区二区三区免费看| 欧美丝袜第三区| 亚洲午夜精品一区二区三区他趣| jlzzjlzz亚洲日本少妇| 精品成人在线观看| 国产九色sp调教91| 日韩三级视频在线观看| 蜜桃在线一区二区三区| 制服丝袜亚洲网站| 丝袜美腿亚洲一区二区图片| 欧美精品vⅰdeose4hd| 亚洲成人久久影院| 色婷婷综合五月| 亚洲精品成人精品456| 色综合久久中文综合久久97| 亚洲精品你懂的| 欧美在线观看18| 亚洲国产裸拍裸体视频在线观看乱了| 99久精品国产| 亚洲色图视频免费播放| 91麻豆福利精品推荐| 久久久精品综合| 成人黄色一级视频| 国产精品免费视频一区| 国产成人免费视频| 日本一区二区三级电影在线观看| 99久久婷婷国产综合精品| 一区二区三区高清| 日韩一区二区三区视频| 国产乱色国产精品免费视频| 国产精品毛片久久久久久| 91久久精品日日躁夜夜躁欧美| 亚洲成av人片一区二区三区| 91精品国产黑色紧身裤美女| 国模套图日韩精品一区二区| 国产欧美一区二区精品性色超碰| 91片在线免费观看| 免费欧美日韩国产三级电影| 久久你懂得1024| 91国产福利在线| 韩国女主播一区二区三区| 亚洲欧洲精品一区二区三区| 欧美肥妇毛茸茸| 国产99一区视频免费|