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

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

?? pritest.c

?? This a software PBX driver
?? C
字號:
/* * libpri: An implementation of Primary Rate ISDN * * Written by Mark Spencer <markster@linux-support.net> * * Copyright (C) 2001, Linux Support Services, Inc. * 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.  * *//* * This program tests libpri call reception using a zaptel interface. * Its state machines are setup for RECEIVING CALLS ONLY, so if you * are trying to both place and receive calls you have to a bit more. */#include <fcntl.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <sys/ioctl.h>#include <stdlib.h>#include <unistd.h>#include <sys/signal.h>#include <sys/select.h>#include <sys/wait.h>#include <sys/resource.h>#include <sys/time.h>#if defined(__linux__)#include <linux/zaptel.h>#elif defined(__FreeBSD__)#include <zaptel.h>#endif#include <zap.h>#include "libpri.h"#define PRI_DEF_NODETYPE	PRI_CPE#define PRI_DEF_SWITCHTYPE	PRI_SWITCH_NI2#define MAX_CHAN		32#define	DCHANNEL_TIMESLOT	16static int offset = 0;static void do_channel(ZAP *z){	/* This is the part that runs on a given channel */	zap_playf(z, "raw.ulaw", 0);}struct pri_chan {	pid_t pid;	int needhangup;	int alreadyhungup;	q931_call *call;} chans[MAX_CHAN];static int str2node(char *node){	if (!strcasecmp(node, "cpe"))		return PRI_CPE;	if (!strcasecmp(node, "network"))		return PRI_NETWORK;	return -1;}static void chan_ended(int sig){	int status;	int x;	struct rusage rusage;	pid_t pid;	pid = wait4(-1, &status, WNOHANG, &rusage);	for (x=0;x<MAX_CHAN;x++) {		if (pid == chans[x].pid) {			printf("-- PID %d ended, channel %d\n", pid, x);			chans[x].pid = 0;			if (!chans[x].alreadyhungup) {				/* It died, we need to hangup now */				chans[x].needhangup = 1;			} else {				/* We've already been hungup, just clear it */				chans[x].alreadyhungup = 0;				chans[x].call = NULL;			}			return;		}	}	if (pid > -1) {		fprintf(stderr, "--!! Unknown PID %d exited\n", pid);		return;	}}static int str2switch(char *swtype){	if (!strcasecmp(swtype, "ni2"))		return PRI_SWITCH_NI2;	if (!strcasecmp(swtype, "dms100"))		return PRI_SWITCH_DMS100;	if (!strcasecmp(swtype, "lucent5e"))		return PRI_SWITCH_LUCENT5E;	if (!strcasecmp(swtype, "att4ess"))		return PRI_SWITCH_ATT4ESS;	if (!strcasecmp(swtype, "euroisdn"))		return PRI_SWITCH_EUROISDN_E1;	if (!strcasecmp(swtype, "gr303eoc"))		return PRI_SWITCH_GR303_EOC;	if (!strcasecmp(swtype, "gr303tmc"))		return PRI_SWITCH_GR303_TMC;	return -1;}static void hangup_channel(int channo){	if (chans[channo].pid) {#if 0		printf("Killing channel %d (pid = %d)\n", channo, chans[channo].pid);#endif		chans[channo].alreadyhungup = 1;		kill(chans[channo].pid, SIGTERM);	} else if (chans[channo].needhangup)		chans[channo].needhangup = 0;}static void launch_channel(int channo){	pid_t pid;	ZAP *z;	char ch[80];	/* Make sure hangup state is reset */	chans[channo].needhangup = 0;	chans[channo].alreadyhungup = 0;	pid = fork();	if (pid < 0) {		fprintf(stderr, "--!! Unable to fork\n");		chans[channo].needhangup = 1;	}	if (pid) {		printf("-- Launching process %d to handle channel %d\n", pid, channo);		chans[channo].pid = pid;	} else {		sprintf(ch, "%d", channo + offset);		z = zap_open(ch, 0);		if (z) {			do_channel(z);			exit(0);		} else {			fprintf(stderr, "--!! Unable to open channel %d\n", channo);			exit(1);		}	}	}static int get_free_channel(int channo){	channo--;	if((channo>MAX_CHAN)||(channo<0)) {		fprintf(stderr, "Invalid Bchannel RANGE <%d", channo);		return 0;	};		while(chans[channo].pid) {		channo--;	}	return channo;}/* place here criteria for completion of destination number */static int number_incommplete(char *number){  return strlen(number) < 3;}static void start_channel(struct pri *pri, pri_event *e){	int channo = e->ring.channel;	int		flag = 1;	pri_event_ring	*ring = &e->ring;	if(channo == -1) {		channo = e->ring.channel = get_free_channel(MAX_CHAN);		if(channo == DCHANNEL_TIMESLOT)			channo = e->ring.channel = get_free_channel(MAX_CHAN);		  				fprintf(stdout, "Any channel selected: %d\n", channo);		if(!channo) {		  pri_release(pri, ring->call, PRI_CAUSE_REQUESTED_CHAN_UNAVAIL);		  fprintf(stdout, "Abort call due to no avl B channels\n");		  return;		}		flag = 0;	}	/* Make sure it's a valid number */	if ((channo >= MAX_CHAN) || (channo < 0)) { 		fprintf(stderr, "--!! Channel %d is out of range\n", channo);		return;	}	/* Make sure nothing is there */	if (chans[channo].pid) {		fprintf(stderr, "--!! Channel %d still has a call on it, ending it...\n", channo);		hangup_channel(channo);		/* Wait for it to die */		while(chans[channo].pid)			usleep(100);	}	/* Record call number */	chans[channo].call = e->ring.call;	/* Answer the line */	if(flag) {		pri_answer(pri, chans[channo].call, channo, 1);	} else {		pri_need_more_info(pri, chans[channo].call, channo, 1);	}	/* Launch a process to handle it */	launch_channel(channo);}static void handle_pri_event(struct pri *pri, pri_event *e){	switch(e->e) {	case PRI_EVENT_DCHAN_UP:		printf("-- D-Channel is now up!  :-)\n");		break;	case PRI_EVENT_DCHAN_DOWN:		printf("-- D-Channel is now down! :-(\n");		break;	case PRI_EVENT_RESTART:		printf("-- Restarting channel %d\n", e->restart.channel);		hangup_channel(e->restart.channel);		break;	case PRI_EVENT_CONFIG_ERR:		printf("-- Configuration error detected: %s\n", e->err.err);		break;	case PRI_EVENT_RING:		printf("-- Ring on channel %d (from %s to %s), answering...\n", e->ring.channel, e->ring.callingnum, e->ring.callednum);		start_channel(pri, e);		break;	case PRI_EVENT_HANGUP:		printf("-- Hanging up channel %d\n", e->hangup.channel);		hangup_channel(e->hangup.channel);		break;	case PRI_EVENT_RINGING:	case PRI_EVENT_ANSWER:		fprintf(stderr, "--!! What?  We shouldn't be making any calls...\n");		break;	case PRI_EVENT_HANGUP_ACK:		/* Ignore */		break;	case PRI_EVENT_INFO_RECEIVED:		fprintf(stdout, "number is: %s\n", e->ring.callednum);		if(!number_incommplete(e->ring.callednum)) {			fprintf(stdout, "final number is: %s\n", e->ring.callednum);			pri_answer(pri, e->ring.call, 0, 1);		}				break;	default:		fprintf(stderr, "--!! Unknown PRI event %d\n", e->e);	}}static int run_pri(int dfd, int swtype, int node){	struct pri *pri;	pri_event *e;	struct timeval tv = {0,0}, *next;	fd_set rfds, efds;	int res,x;	pri = pri_new(dfd, node, swtype);	if (!pri) {		fprintf(stderr, "Unable to create PRI\n");		return -1;	}	pri_set_debug(pri, -1);	for (;;) {				/* Run the D-Channel */		FD_ZERO(&rfds);		FD_ZERO(&efds);		FD_SET(dfd, &rfds);		FD_SET(dfd, &efds);		if ((next = pri_schedule_next(pri))) {			gettimeofday(&tv, NULL);			tv.tv_sec = next->tv_sec - tv.tv_sec;			tv.tv_usec = next->tv_usec - tv.tv_usec;			if (tv.tv_usec < 0) {				tv.tv_usec += 1000000;				tv.tv_sec -= 1;			}			if (tv.tv_sec < 0) {				tv.tv_sec = 0;				tv.tv_usec = 0;			}		}		res = select(dfd + 1, &rfds, NULL, &efds, next ? &tv : NULL);		e = NULL;		if (!res) {			e = pri_schedule_run(pri);		} else if (res > 0) {			e = pri_check_event(pri);		} else if (errno == ELAST) {			res = ioctl(dfd, ZT_GETEVENT, &x);			printf("Got Zaptel event: %d\n", x);		} else if (errno != EINTR) 			fprintf(stderr, "Error (%d) on select: %s\n", ELAST, strerror(errno));		if (e) {			handle_pri_event(pri, e);		}		res = ioctl(dfd, ZT_GETEVENT, &x);		if (!res && x) {			fprintf(stderr, "Got event on PRI interface: %d\n", x);		}		/* Check for lines that need hangups */		for (x=0;x<MAX_CHAN;x++)			if (chans[x].needhangup) {				chans[x].needhangup = 0;				pri_release(pri, chans[x].call, PRI_CAUSE_NORMAL_CLEARING);			}	}	return 0;}int main(int argc, char *argv[]) {	int dfd;	int swtype = PRI_DEF_SWITCHTYPE;	int node = PRI_DEF_NODETYPE;	struct zt_params p;	if (argc < 2) {		fprintf(stderr, "Usage: pritest <dchannel> [swtypetype] [nodetype]\n");		exit(1);	}	dfd = open(argv[1], O_RDWR);	if (dfd < 0) {		fprintf(stderr, "Failed to open dchannel '%s': %s\n", argv[1], strerror(errno));		exit(1);	}	if (ioctl(dfd, ZT_GET_PARAMS, &p)) {		fprintf(stderr, "Unable to get parameters on '%s': %s\n", argv[1], strerror(errno));		exit(1);	}	if ((p.sigtype != ZT_SIG_HDLCRAW) && (p.sigtype != ZT_SIG_HDLCFCS)) {		fprintf(stderr, "%s is in %d signalling, not FCS HDLC or RAW HDLC mode\n", argv[1], p.sigtype);		exit(1);	}	if (argc > 2) {		swtype = str2switch(argv[2]);		if (swtype < 0) {			fprintf(stderr, "Valid switchtypes are: ni2, dms100, lucent5e, att4ess, and euroisdn\n");				exit(1);		}	}	if (argc > 3) {		node = str2node(argv[3]);		if (node < 0) {			fprintf(stderr, "Valid node types are: network and cpe\n");				exit(1);		}	}	signal(SIGCHLD, chan_ended);	if (run_pri(dfd, swtype, node))		exit(1);	exit(0);	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成a人片在线观看中文| 91浏览器入口在线观看| 99热精品一区二区| 欧美日韩国产经典色站一区二区三区| 精品日韩欧美一区二区| 亚洲欧美日韩久久精品| 国产精品亚洲午夜一区二区三区 | 不卡电影免费在线播放一区| 欧美性猛交一区二区三区精品| 欧美大肚乱孕交hd孕妇| 夜夜嗨av一区二区三区网页| 国产成人日日夜夜| 欧美成人一级视频| 午夜欧美2019年伦理| 91在线porny国产在线看| www国产成人| 蜜臀91精品一区二区三区| 欧美在线不卡视频| 亚洲欧洲成人精品av97| 韩日av一区二区| 91麻豆精品国产自产在线| 亚洲欧美日韩一区| www.日韩精品| 国产精品乱人伦| 高清不卡一区二区| 久久综合色8888| 久久99久久久久久久久久久| 欧美日韩免费视频| 亚洲女人的天堂| 97se亚洲国产综合在线| 国产精品免费视频一区| 国产成人av电影在线| 国产日韩亚洲欧美综合| 欧美日韩精品一二三区| 亚洲啪啪综合av一区二区三区| 国产成人丝袜美腿| 久久久www免费人成精品| 激情综合网激情| 26uuu精品一区二区| 国内国产精品久久| 国产日产精品一区| 成人h动漫精品| 亚洲另类春色校园小说| 日本精品一区二区三区高清 | 成人国产精品免费观看动漫 | 亚洲一二三四区不卡| 91小视频免费观看| 亚洲视频一区在线| 欧美吞精做爰啪啪高潮| 亚洲va天堂va国产va久| 欧美一区二区三区在线电影| 免费在线欧美视频| 欧美大白屁股肥臀xxxxxx| 国产麻豆精品视频| 专区另类欧美日韩| 精品视频资源站| 久久99精品久久久久久国产越南| 2023国产精品视频| 日韩精品一区二| 国产精品白丝jk白祙喷水网站| 欧美国产日韩一二三区| 色呦呦国产精品| 蜜桃av一区二区在线观看| 久久久久久久久久电影| 一本久久a久久精品亚洲| 婷婷久久综合九色综合绿巨人| 日韩欧美国产综合| 成人动漫视频在线| 日韩国产欧美在线播放| 欧美国产乱子伦| 欧美美女一区二区在线观看| 国产成人啪免费观看软件| 亚洲欧美另类综合偷拍| 日韩欧美成人午夜| 94-欧美-setu| 久久99精品网久久| 亚洲精品视频观看| 久久久久高清精品| 欧美日韩国产影片| k8久久久一区二区三区 | 欧美日韩在线观看一区二区| 精品一区二区三区在线视频| 国产精品二三区| 欧美大片顶级少妇| 欧美午夜电影在线播放| 成人高清免费在线播放| 青青草成人在线观看| 一区二区理论电影在线观看| 欧美精品一区二区三区蜜桃| 欧美亚洲国产一卡| av午夜一区麻豆| 国产精品99久久久| 国内外成人在线| 日韩经典一区二区| 一区二区在线电影| 亚洲欧美日韩一区二区| 国产精品美女久久久久久久 | 在线观看免费成人| www.av亚洲| k8久久久一区二区三区| 国产在线精品一区二区不卡了 | 国内精品免费**视频| 婷婷丁香激情综合| 亚洲妇熟xx妇色黄| 亚洲婷婷国产精品电影人久久| 久久精品亚洲国产奇米99| 6080yy午夜一二三区久久| 欧美三级视频在线播放| 色哟哟精品一区| 99国产精品久| av一区二区不卡| av中文字幕一区| 97精品久久久久中文字幕| 成人av在线网站| 成人免费黄色在线| 成人国产视频在线观看| 成人精品视频一区| heyzo一本久久综合| 国产99久久精品| 成人开心网精品视频| 成人网在线播放| 99精品国产视频| 91国内精品野花午夜精品| 色婷婷综合久色| 欧美少妇bbb| 884aa四虎影成人精品一区| 欧美日韩大陆一区二区| 欧美一区二区在线视频| 精品黑人一区二区三区久久 | 国产精品久久久久aaaa樱花 | 91香蕉视频在线| 欧美专区亚洲专区| 777奇米四色成人影色区| 欧美一区二区日韩| 日韩欧美成人午夜| 中文字幕不卡在线播放| 最新日韩在线视频| 午夜欧美大尺度福利影院在线看 | 精品入口麻豆88视频| wwwwxxxxx欧美| 国产精品久久夜| 午夜亚洲福利老司机| 久久激五月天综合精品| 成人精品小蝌蚪| 欧美色国产精品| 久久久久久久一区| 一区二区三区资源| 精品一区二区三区影院在线午夜| 国产成人av影院| 91九色02白丝porn| 日韩久久精品一区| 亚洲色图欧美在线| 青青国产91久久久久久| 成人av资源站| 欧美一区二区三区免费大片| 欧美国产在线观看| 天堂av在线一区| 不卡免费追剧大全电视剧网站| 欧美日韩三级在线| 国产精品久久毛片a| 日韩精品成人一区二区三区 | 日韩毛片精品高清免费| 青草国产精品久久久久久| 不卡电影免费在线播放一区| 欧美一区二区三区免费在线看| 中文字幕中文字幕中文字幕亚洲无线| 丝袜诱惑制服诱惑色一区在线观看| 国产成人精品三级麻豆| 欧美日韩国产影片| 综合分类小说区另类春色亚洲小说欧美| 热久久国产精品| 在线观看日韩国产| 国产精品久久久久久户外露出 | 久久综合99re88久久爱| 亚洲尤物在线视频观看| 成人中文字幕在线| 精品久久久久久久久久久久久久久| 一区二区三区中文免费| 成人激情视频网站| 久久精品人人做人人爽人人 | 亚洲女同一区二区| 国产成人av电影在线观看| 日韩精品一区二区在线| 午夜成人在线视频| 欧美午夜一区二区三区免费大片| 亚洲国产精华液网站w| 国产乱码精品一区二区三区五月婷| 欧美日韩另类一区| 亚洲综合色丁香婷婷六月图片| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 一本一道波多野结衣一区二区| 国产日韩欧美不卡在线| 国产在线精品国自产拍免费| 欧美成人一区二区| 日韩电影免费在线观看网站| 欧美电影在哪看比较好| 丝袜美腿亚洲综合| 欧美人与性动xxxx| 视频在线在亚洲| 制服丝袜在线91|