⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sl_stats.c

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 C
字号:
/* * * $Id: sl_stats.c,v 1.12 2004/08/24 09:00:38 janakj Exp $ * * * Copyright (C) 2001-2003 FhG Fokus * * This file is part of ser, a free SIP server. * * ser 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 * * For a license to use the ser software under conditions * other than those described here, or to purchase support for this * software, please contact iptel.org by e-mail at the following addresses: *    info@iptel.org * * ser 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "../../mem/shm_mem.h"#include "../../globals.h"#include "../../fifo_server.h"#include "../../unixsock_server.h"#include "../../config.h"#include "../../pt.h"#include "sl_stats.h"#include <strings.h>#include <stdio.h>static struct sl_stats *sl_stats;static void add_sl_stats( struct sl_stats *t, struct sl_stats *i){	enum reply_type rt;	for (rt=0; rt<RT_END; rt++) 		t->err[rt]+=i->err[rt];	t->failures+=i->failures;}static int print_sl_stats(FILE *reply_file){	struct sl_stats total;	int p;	memset(&total, 0, sizeof(struct sl_stats));	if (dont_fork) {		add_sl_stats(&total, &sl_stats[0]);	} else for (p=0; p<process_count(); p++)			add_sl_stats(&total, &sl_stats[p]);	fprintf(reply_file, "200: %ld 202: %ld 2xx: %ld" CLEANUP_EOL,		total.err[RT_200], total.err[RT_202], total.err[RT_2xx]);	fprintf(reply_file, "300: %ld 301: %ld 302: %ld"		" 3xx: %ld" CLEANUP_EOL,		total.err[RT_300], total.err[RT_301], total.err[RT_302], 		total.err[RT_3xx] );	fprintf(reply_file, "400: %ld 401: %ld 403: %ld"		" 404: %ld 407: %ld 408: %ld"		" 483: %ld 4xx: %ld" CLEANUP_EOL,		total.err[RT_400], total.err[RT_401], total.err[RT_403], 		total.err[RT_404], total.err[RT_407], total.err[RT_408],		total.err[RT_483], total.err[RT_4xx]);	fprintf(reply_file, "500: %ld 5xx: %ld" CLEANUP_EOL,		total.err[RT_500], total.err[RT_5xx] );	fprintf(reply_file, "6xx: %ld" CLEANUP_EOL,		total.err[RT_6xx] );	fprintf(reply_file, "xxx: %ld" CLEANUP_EOL,		total.err[RT_xxx] );	fprintf(reply_file, "failures: %ld" CLEANUP_EOL,		total.failures );	return 1;}int static sl_stats_cmd( FILE *pipe, char *response_file ){	FILE *reply_file;	reply_file=open_reply_pipe(response_file);	if (reply_file==0) {		LOG(L_ERR, "ERROR: sl_stats: file not opened\n");		return -1;	}	fputs( "200 ok\n", reply_file);	print_sl_stats( reply_file );	fclose(reply_file);	return 1;}int static sl_stats_cmd_unixsock( str* msg ){	struct sl_stats total;	int p;	unixsock_reply_asciiz( "200 OK\n");	memset(&total, 0, sizeof(struct sl_stats));	if (dont_fork) {		add_sl_stats(&total, &sl_stats[0]);	} else for (p=0; p<process_count(); p++)			add_sl_stats(&total, &sl_stats[p]);	if (unixsock_reply_printf("200: %ld 202: %ld 2xx: %ld" CLEANUP_EOL,				  total.err[RT_200], total.err[RT_202], 				  total.err[RT_2xx]) < 0) goto err;	if (unixsock_reply_printf("300: %ld 301: %ld 302: %ld"				  " 3xx: %ld" CLEANUP_EOL,				  total.err[RT_300], total.err[RT_301], 				  total.err[RT_302], total.err[RT_3xx]) < 0) goto err;	if (unixsock_reply_printf("400: %ld 401: %ld 403: %ld"				  " 404: %ld 407: %ld 408: %ld"				  " 483: %ld 4xx: %ld" CLEANUP_EOL,				  total.err[RT_400], total.err[RT_401], total.err[RT_403], 				  total.err[RT_404], total.err[RT_407], total.err[RT_408],				  total.err[RT_483], total.err[RT_4xx]) < 0) goto err;		if (unixsock_reply_printf("500: %ld 5xx: %ld" CLEANUP_EOL,				  total.err[RT_500], total.err[RT_5xx]) < 0) goto err;	if (unixsock_reply_printf("6xx: %ld" CLEANUP_EOL,				  total.err[RT_6xx]) < 0) goto err;	if (unixsock_reply_printf("xxx: %ld" CLEANUP_EOL,				  total.err[RT_xxx]) < 0) goto err;		if (unixsock_reply_printf("failures: %ld" CLEANUP_EOL,				  total.failures) < 0) goto err;	unixsock_reply_send();	return 0; err:	unixsock_reply_reset();	unixsock_reply_asciiz("500 Buffer too small\n");	unixsock_reply_send();	return -1;}void sl_stats_destroy(){	if (sl_stats) shm_free(sl_stats);}int init_sl_stats( void ) {	int len;	/* hack: we better allocate memory like if we had one	   more process to be safe in case some other module	   will crank the timer process later; otherwise we	   would allocate less than the stats collector	   iterates through using process_count()	*/	len=sizeof(struct sl_stats)*(process_count()+1);	sl_stats=shm_malloc(len);	if (sl_stats==0) {		LOG(L_ERR, "ERROR: init_sl_stats: no shmem\n");		return -1;	}	memset(sl_stats, 0, len);	if (register_fifo_cmd(sl_stats_cmd, "sl_stats", 0)<0) {		LOG(L_CRIT, "cannot register sl_stats\n");		return -1;	}		if (unixsock_register_cmd("sl_stats", sl_stats_cmd_unixsock) < 0) {		LOG(L_CRIT, "cannot register unixsock sl_stats\n");		return -1;	}	return 1;}void update_sl_failures( void ){	sl_stats[ process_no ].failures++;}void update_sl_stats( int code ) {	struct sl_stats *my_stats;	my_stats=&sl_stats[ process_no ];	if (code >=700 || code <200 ) {		my_stats->err[RT_xxx]++;	} else if (code>=600) {		my_stats->err[RT_6xx]++;	} else if (code>=500) {		switch(code) {			case 500:	my_stats->err[RT_500]++;						break;			default:	my_stats->err[RT_5xx]++;						break;		}	} else if (code>=400) {		switch(code) {			case 400:	my_stats->err[RT_400]++;						break;			case 401:	my_stats->err[RT_401]++;						break;			case 403:	my_stats->err[RT_403]++;						break;			case 404:	my_stats->err[RT_404]++;						break;			case 407:	my_stats->err[RT_407]++;						break;			case 408:	my_stats->err[RT_408]++;						break;			case 483:	my_stats->err[RT_483]++;						break;			default:	my_stats->err[RT_4xx]++;						break;		}	} else if (code>=300) {		switch(code) {			case 300:	my_stats->err[RT_300]++;						break;			case 301:	my_stats->err[RT_301]++;						break;			case 302:	my_stats->err[RT_302]++;						break;			default:	my_stats->err[RT_3xx]++;						break;		}	} else { /* 2xx */		switch(code) {			case 200:	my_stats->err[RT_200]++;						break;			case 202:	my_stats->err[RT_202]++;						break;			default:	my_stats->err[RT_2xx]++;						break;		}	}		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -