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

📄 regctl.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 "regctl.h"


/*  Allocates and initialises new queue structure */
int regctl_newq(struct sip_reg_ctl_t **regctl_queue) {
	if (REGCTL_DEBUG) printf("regctl_new()!\n");
	*regctl_queue = malloc(REGNUM_SIZE * sizeof(struct sip_reg_ctl_t));
	if (*regctl_queue) return 0;
	else return EOF;
}

/*  Deallocates queue structure */
int regctl_freeq(struct sip_reg_ctl_t *regctl_queue) {
	if (REGCTL_DEBUG) printf("regctl_free()!\n");
	free(regctl_queue);
	return 0;
}

/* Find element based on ip address after nat translation
 * Return:
 *	-1	not found
 *	index number	found
 */
int regctl_find(const struct sip_reg_ctl_t regctl_queue[], struct in_addr true_ip, 
			int true_port, int num) {
	int i, index;
	index = -1;
	
	if (REGCTL_DEBUG) printf("Begin regctl_find() ip = %s\n", inet_ntoa(true_ip));
	for (i = 0; i < num; i++) {
		if ((regctl_queue[i].active) 
		    && (!memcmp(&regctl_queue[i].nat_ip, &true_ip, sizeof(struct in_addr)))
		    && (regctl_queue[i].nat_port == ntohs(true_port))) {
			index = i;
			break;
		}
	}
	
	return index;
}

/* New Client Register Information
 * Return 
 * 	0	success
 *	-1	failed
 */
int regctl_new(struct sip_reg_ctl_t regctl_queue[], int expires, struct in_addr true_ip,
			int true_port, char *rhost, char *ruser, char *rport, int num) {
	int i;
	time_t time_now;
	
	time(&time_now);
	
	for (i = 0; i < num; i++)
		if (!(regctl_queue[i].active))	break;
	
	/* there is no space in queue */
	if (i >= num)	return -1;
	
	regctl_queue[i].active = 1;
	regctl_queue[i].nat_port = true_port;
	regctl_queue[i].nat_ip.s_addr = true_ip.s_addr;
	if (rhost) {
		strcpy(regctl_queue[i].reg_host, rhost);
	} else {
		regctl_queue[i].reg_host[0]='\0';
	}
	if (ruser) {
		strcpy(regctl_queue[i].reg_username, ruser);
	} else {
		regctl_queue[i].reg_username[0]='\0';
	}
	if (rport) {
		strcpy(regctl_queue[i].reg_port, rport);
	} else {
		regctl_queue[i].reg_port[0]='\0';
	}
	regctl_queue[i].expires = time_now + expires;
	
	return 0;
}

/* Free Client Register Information 
 * Return:
 *	0	success
 * 	-1	failed
 */
int regctl_free(struct sip_reg_ctl_t regctl_queue[], struct in_addr true_ip, 
			int true_port, int num) {
	int i;
	
	i = regctl_find(regctl_queue, true_ip, true_port, num);
	if (i < 0)	return -1;
	
	regctl_queue[i].active = 0;
	regctl_queue[i].nat_port = 0;
	memset(&regctl_queue[i].nat_ip, 0, sizeof(struct in_addr));
	memset(regctl_queue[i].reg_host, 0, HOSTNAME_SIZE);
	memset(regctl_queue[i].reg_port, 0, PORT_SIZE);
	memset(regctl_queue[i].reg_username, 0, USERNAME_SIZE);
	regctl_queue[i].expires = 0;
	
	return 0;
}	

/* Update client register informaiton 
 * Return:
 *	0	success
 *	-1	failed
 */
int regctl_update(struct sip_reg_ctl_t regctl_queue[], int expires, char *rhost, char *rport,
			char *ruser, int num) {
	int i = num;
	time_t time_now;
	
	//i = regctl_find(regctl_queue, true_ip, true_port, num);
	//if (i < 0)	return -1;
	
	time(&time_now);
	if (rhost) {
		memset(regctl_queue[i].reg_host, 0, HOSTNAME_SIZE);	
		strcpy(regctl_queue[i].reg_host, rhost);
	}
	if (rport) {
		memset(regctl_queue[i].reg_port, 0, PORT_SIZE);	
		strcpy(regctl_queue[i].reg_port, rport);
	}
	if (ruser) {
		memset(regctl_queue[i].reg_username, 0, USERNAME_SIZE);	
		strcpy(regctl_queue[i].reg_username, ruser);
	}
	regctl_queue[i].expires = time_now + expires;
	
	return 0;	
}

/* Find the nat ip address and port of internal client
 * Return
 *	0	success
 *	-1	failed
 */
int regctl_findaddr(const struct sip_reg_ctl_t regctl_queue[], char *username, 
			struct in_addr *destip, int *destport, int num) {
	int i;
	
	for (i = 0; i < num; i++)
		if (!strcmp(regctl_queue[i].reg_username, username))	break;
	
	if (i >= num) return -1;
	destip->s_addr = regctl_queue[i].nat_ip.s_addr;
	*destport = regctl_queue[i].nat_port;
	
	return 0;
}
	  
/* Find user by username
 * Return
 *	index number	found
 *	-1		not found
 */
int regctl_finduser(const struct sip_reg_ctl_t regctl_queue[], char *req_user, int num) {
	int i;
	for (i = 0; i < num; i++) {
		if (sip_reg_ctl[i].active == 0) continue;
		if (!strcmp(req_user, sip_reg_ctl[i].reg_username))	break;
	}
	
	if (i >= num)	i = -1;
	
	return i;	
}

/*
 * cyclically called to do the aging of the Regctl table entries
 * and throw out expired entries.
 */
void register_agemap(void) {
   int i;
   time_t t;
   
   /* expire old entries */
   time(&t);
   for (i=0; i<REGNUM_SIZE; i++) {
      if ((sip_reg_ctl[i].active == 1) && (sip_reg_ctl[i].expires < t)) {
         printf("cleaned entry:%i %s@%s\n", i,
                sip_reg_ctl[i].reg_username,  sip_reg_ctl[i].reg_host);
         sip_reg_ctl[i].active=0;
         sip_reg_ctl[i].nat_port = 0;
	  memset(&sip_reg_ctl[i].nat_ip, 0, sizeof(struct in_addr));
	  memset(sip_reg_ctl[i].reg_host, 0, HOSTNAME_SIZE);
	  memset(sip_reg_ctl[i].reg_port, 0, PORT_SIZE);
	  memset(sip_reg_ctl[i].reg_username, 0, USERNAME_SIZE);
	  sip_reg_ctl[i].expires = 0;
      }
   }
   return;
}


⌨️ 快捷键说明

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