📄 regctl.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(®ctl_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(®ctl_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 + -