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

📄 sessctl.c

📁 简单的基于SIP的会话边界控制器
💻 C
字号:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>

#include <netinet/in.h>
#include <arpa/inet.h>

#include <osipparser2/osip_parser.h>

#include "nsrsbc.h"
#include "sessctl.h"

/* initialize sessctl table */

/* Find element based on call id
 * Return:
 *	-1	not found
 *	index number	found
 */
int sessctl_find(const struct sip_sess_ctl_t sessctl_queue[], char *cid, int num) {
	int i, index;
	index = -1;
	
	if (SESSCTL_DEBUG) printf("Begin sessctl_find() call id = %s\n", cid);
	for (i = 0; i < num; i++) {
		if (sessctl_queue[i].active) {
			if ((!strcmp(sessctl_queue[i].cid_new, cid)) || (!strcmp(sessctl_queue[i].cid_old, cid))) {
					index = i;
					break;
			}
		}
	}
	
	return index;
}

/* New Session Information
 * Return 
 * 	0	success
 *	-1	failed
 */
int sessctl_new(struct sip_sess_ctl_t sessctl_queue[], char *old_cid, char *new_cid, 
			char *from, char *port, int num) {
	int i;
	
	for (i = 0; i < num; i++)
		if (!(sessctl_queue[i].active))	break;
	
	/* there is no space in queue */
	if (i >= num)	{
		if (SESSCTL_DEBUG) printf("There is no space in queue");
		return -1;
	}
	
	sessctl_queue[i].active = 1;
	
	if (old_cid) {
		strcpy(sessctl_queue[i].cid_old, old_cid);
	} else {
		sessctl_queue[i].cid_old[0]='\0';
	}
	
	if (new_cid) {
		strcpy(sessctl_queue[i].cid_new, new_cid);
	} else {
		sessctl_queue[i].cid_new[0]='\0';
	}
	
	if (from) {
		strcpy(sessctl_queue[i].from_host, from);
	} else {
		sessctl_queue[i].from_host[0] = '\0';
	}
	
	if (port) {
		strcpy(sessctl_queue[i].from_port, port);
	} else {
		sessctl_queue[i].from_port[0]='\0';
	}
	
	return 0;
}

/* Free Session Information 
 * Return:
 *	0	success
 * 	-1	failed
 */
int sessctl_free(struct sip_sess_ctl_t sessctl_queue[],  int idx) {
//	int i;
	
//	i = sessctl_find(sessctl_queue, cid, num);
//	if (i < 0)	return -1;
       if((idx < 0) || (idx >= SESSNUM_SIZE))
       	return -1;
	sessctl_queue[idx].active = 0;
	memset(sessctl_queue[idx].cid_old, 0, CALLID_SIZE);
	memset(sessctl_queue[idx].cid_new, 0, CALLID_SIZE);
	memset(sessctl_queue[idx].from_host, 0, HOSTNAME_SIZE);
	memset(sessctl_queue[idx].from_port, 0, PORT_SIZE);
	
	return 0;
}	

/* Update Session Informaiton 
 * Return:
 *	0	success
 *	-1	failed
 */
int sessctl_update(struct sip_sess_ctl_t sessctl_queue[], char *old_cid, char *new_cid, 
			char *from, char *port, int num) {
	int i = num;
	
	if (old_cid) {
		memset(sessctl_queue[i].cid_old, 0, CALLID_SIZE);
		strcpy(sessctl_queue[i].cid_old, old_cid);
	}
	
	if (new_cid) {
		memset(sessctl_queue[i].cid_new, 0, CALLID_SIZE);
		strcpy(sessctl_queue[i].cid_new, new_cid);
	}
	
	if (from) {
		memset(sessctl_queue[i].from_host, 0, HOSTNAME_SIZE);
		strcpy(sessctl_queue[i].from_host, from);
	}
	
	if (port) {
		memset(sessctl_queue[i].from_port, 0, PORT_SIZE);
		strcpy(sessctl_queue[i].from_port, port);
	}
	
	return 0;	
}

⌨️ 快捷键说明

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