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

📄 sms_report.c

📁 性能优秀的SIP Proxy
💻 C
字号:
/* * $Id: sms_report.c,v 1.1.1.1 2005/06/13 16:47:45 bogdan_iancu Exp $ * * Copyright (C) 2001-2003 FhG Fokus * * This file is part of openser, a free SIP server. * * openser 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 * * openser 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 <time.h>#include <unistd.h>#include "../../mem/shm_mem.h"#include "../../timer.h"#include "sms_report.h"#include "sms_funcs.h"#define REPORT_TIMEOUT     1*60*60   // one hour#define START_ERR_MSG      "Your message (or part of it) couldn't be "\                           "delivered. The SMS Center said: "#define START_ERR_MSG_LEN  (strlen(START_ERR_MSG))#define END_ERR_MSG        ". The message was: "#define END_ERR_MSG_LEN    (strlen( END_ERR_MSG))struct report_cell {	int             status;	time_t          timeout;	char            *text;	unsigned int    text_len;	struct sms_msg  *sms;};struct report_cell *report_queue=0;typedef time_t (get_time_func)(void);get_time_func  *get_time;/*-------------- Function to set time - from ser or system ------------------*//* gets the time from ser */static time_t get_time_ser(void){	return  get_ticks();}/* gets the time from system */static time_t get_time_sys(void){	return time(0);}/* detects if the ser time function get_ticks works, and depending of that   sets the correct time function to be used */void set_gettime_function(){	unsigned int t1,t2;	t1 = get_ticks();	sleep(2);	t2 = get_ticks();	if (!t1 && !t2) {		get_time = get_time_sys;		LOG(L_INFO,"INFO:sms:set_gettime_function: using system time func.\n");	} else {		get_time = get_time_ser;		LOG(L_INFO,"INFO:sms:set_gettime_function: using ser time func.\n");	}}inline void free_report_cell(struct report_cell *cell){	if (!cell)		return;	if (cell->sms && !(--(cell->sms->ref)))		shm_free(cell->sms);	cell->sms = 0;	cell->status = 0;	cell->timeout = 0;	cell->text = 0;	cell->text_len = 0;}int init_report_queue(){	report_queue = (struct report_cell*)		shm_malloc(NR_CELLS*sizeof(struct report_cell));	if (!report_queue) {		LOG(L_ERR,"ERROR:sms:init_report_queue: no more free pkg_mem!\n");		return -1;	}	memset( report_queue , 0 , NR_CELLS*sizeof(struct report_cell) );	return 1;}void destroy_report_queue(){	int i;	if (report_queue){		for(i=0;i<NR_CELLS;i++)			if (report_queue[i].sms)				free_report_cell(&(report_queue[i]));		shm_free(report_queue);		report_queue = 0;	}}void add_sms_into_report_queue(int id, struct sms_msg *sms, char *p, int l){	if (report_queue[id].sms){		LOG(L_INFO,"INFO:sms:add_sms_into_report_queue: old message still "			"waiting for report at location %d -> discarding\n",id);		free_report_cell(&(report_queue[id]));	}	sms->ref++;	report_queue[id].status = -1;	report_queue[id].sms = sms;	report_queue[id].text = p;	report_queue[id].text_len = l;	report_queue[id].timeout = get_time() + REPORT_TIMEOUT;}int  relay_report_to_queue(int id, char *phone, int status, int *old_status){	struct report_cell *cell;	int    ret_code;	cell = &(report_queue[id]);	ret_code = 0;	/* first, do we have a match into the sms queue? */	if (!cell->sms) {		LOG(L_INFO,"INFO:sms:relay_report_to_queue: report received for cell"			" %d,  but the sms was already trashed from queue!\n",id);		goto done;	}	if (strlen(phone)!=cell->sms->to.len ||	strncmp(phone,cell->sms->to.s,cell->sms->to.len)) {		LOG(L_INFO,"INFO:sms:relay_report_to_queue: report received for cell"			" %d, but the phone nr is different->old report->ignored\n",id);		goto done;	}	if (old_status)		*old_status = cell->status;	cell->status = status;	if (status>=0 && status<32) {		DBG("DEBUG:sms:relay_report_to_queue:sms %d confirmed with code %d\n",			id, status);		ret_code = 2; /* success */	} else if (status<64) {		/* provisional report */		DBG("DEBUG:sms:relay_report_to_queue:sms %d received prov. report with"			" code %d\n",id, status);		ret_code = 1; /* provisional */	} else {		DBG("DEBUG:sms:relay_report_to_queue:sms %d received error report with"			" code %d\n",id, status);		ret_code = 3; /* error */	}done:	return ret_code;}void check_timeout_in_report_queue(){	int i;	time_t current_time;	current_time = get_time();	for(i=0;i<NR_CELLS;i++)		if (report_queue[i].sms && report_queue[i].timeout<=current_time) {			LOG(L_INFO,"INFO:sms:check_timeout_in_report_queue: [%lu,%lu] "				"record %d is discarded (timeout), having status %d\n",				(long unsigned int)current_time,				(long unsigned int)report_queue[i].timeout,				i,report_queue[i].status);			free_report_cell(&(report_queue[i]));		}}void remove_sms_from_report_queue(int id){	free_report_cell(&(report_queue[id]));}str* get_text_from_report_queue(int id){	static str text;	text.s = report_queue[id].text;	text.len = report_queue[id].text_len;	return &text;}struct sms_msg* get_sms_from_report_queue(int id){	return ( report_queue[id].sms);}str* get_error_str(int status){	static str err_str;	switch (status) {		/*		case 0: strcat(sms->ascii,"Ok,short message received by the SME");			break;		case 1: strcat(sms->ascii,"Ok,short message forwarded by the SC to"			" the SME but the SC is unable to confirm delivery");			break;		case 2: strcat(sms->ascii,"Ok,short message replaced by the SC");			break;		case 32: strcat(sms->ascii,"Still trying,congestion");			break;		case 33: strcat(sms->ascii,"Still trying,SME busy");			break;		case 34: strcat(sms->ascii,"Still trying,no response from SME");			break;		case 35: strcat(sms->ascii,"Still trying,service rejected");			break;		case 36: strcat(sms->ascii,"Still trying,quality of service not"			" available");			break;		case 37: strcat(sms->ascii,"Still trying,error in SME");			break;		case 48:			err_str.s =			START_ERR_MSG"Delivery is not possible"END_ERR_MSG;			err_str.len = 24 + START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		*/		case 64:			err_str.s =			START_ERR_MSG"Error, remote procedure error"END_ERR_MSG;			err_str.len = 29 + START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 65: 			err_str.s =			START_ERR_MSG"Error,incompatible destination"END_ERR_MSG;			err_str.len = 30 + START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 66: 			err_str.s =			START_ERR_MSG"Error,connection rejected by SME"END_ERR_MSG;			err_str.len = 32 + START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 67:			err_str.s = START_ERR_MSG"Error,not obtainable"END_ERR_MSG;			err_str.len = 20 + START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 68:			err_str.s =			START_ERR_MSG"Error,quality of service not available"END_ERR_MSG;			err_str.len = 38 + START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 69:			err_str.s =			START_ERR_MSG"Error,no interworking available"END_ERR_MSG;			err_str.len = 31 + START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 70:			err_str.s =			START_ERR_MSG"Error,SM validity period expired"END_ERR_MSG;			err_str.len = 32 + START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 71:			err_str.s =			START_ERR_MSG"Error,SM deleted by originating SME"END_ERR_MSG;			err_str.len = 35 + START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 72:			err_str.s =			START_ERR_MSG"Error,SM deleted by SC administration"END_ERR_MSG;			err_str.len = 37+ START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 73:			err_str.s = START_ERR_MSG"Error,SM does not exist"END_ERR_MSG;			err_str.len = 29+ START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 96:			err_str.s = START_ERR_MSG"Error,congestion"END_ERR_MSG;			err_str.len = 23+ START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 97:			err_str.s = START_ERR_MSG"Error,SME busy"END_ERR_MSG;			err_str.len = 14+ START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 98:			err_str.s = START_ERR_MSG"Error,no response from SME"END_ERR_MSG;			err_str.len = 26+ START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 99:			err_str.s = START_ERR_MSG"Error,service rejected"END_ERR_MSG;			err_str.len = 22+ START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 100:			err_str.s =			START_ERR_MSG"Error,quality of service not available"END_ERR_MSG;			err_str.len = 38+ START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		case 101:			err_str.s = START_ERR_MSG"Error,error in SME"END_ERR_MSG;			err_str.len = 18+ START_ERR_MSG_LEN + END_ERR_MSG_LEN;			break;		default:			err_str.s = START_ERR_MSG"Unknown error code"END_ERR_MSG;			err_str.len = 18+ START_ERR_MSG_LEN + END_ERR_MSG_LEN;	}	return &err_str;}

⌨️ 快捷键说明

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