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

📄 register.c

📁 siproxd is a proxy/masquerading for the SIP protocal.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    Copyright (C) 2002  Thomas Ries <tries@gmx.net>    This file is part of Siproxd.        Siproxd 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.        Siproxd 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 Siproxd; if not, write to the Free Software    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "config.h"#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 "siproxd.h"#include "log.h"static char const ident[]="$Id: " __FILE__ ": " PACKAGE "-" VERSION "-"			  BUILDSTR " $";/* configuration storage */extern struct siproxd_config configuration;struct urlmap_s urlmap[URLMAP_SIZE];		/* URL mapping table     */extern int sip_socket;				/* sending SIP datagrams */extern int errno;/* * initialize the URL mapping table */void register_init(void) {   FILE *stream;   int sts, size, i;   char buff[128];   memset(urlmap, 0, sizeof(urlmap));   if (configuration.registrationfile) {      stream = fopen(configuration.registrationfile, "r");      if (!stream) {         /*          * the file does not exist, or the size was incorrect,          * delete it and start from scratch          */         unlink(configuration.registrationfile);         WARN("registration file not found, starting with empty table");      } else {         /* read the url table from file */         for (i=0;i < URLMAP_SIZE; i++) {            fgets(buff, sizeof(buff), stream);            sts=sscanf(buff, "***:%i:%i", &urlmap[i].active, &urlmap[i].expires);            if (urlmap[i].active) {               osip_uri_init(&urlmap[i].true_url);               osip_uri_init(&urlmap[i].masq_url);               osip_uri_init(&urlmap[i].reg_url);	       #define R(X) {\               fgets(buff, sizeof(buff), stream);\               buff[sizeof(buff)-1]='\0';\               if (strchr(buff, 10)) *strchr(buff, 10)='\0';\               if (strchr(buff, 13)) *strchr(buff, 13)='\0';\               if (strlen(buff) > 0) {\                  size = strlen(buff);\                  X    =(char*)malloc(size+1);\                  sts=sscanf(buff,"%s",X);\               } else {\                  X = NULL;\               }\               }               R(urlmap[i].true_url->scheme);               R(urlmap[i].true_url->username);               R(urlmap[i].true_url->host);               R(urlmap[i].true_url->port);               R(urlmap[i].masq_url->scheme);               R(urlmap[i].masq_url->username);               R(urlmap[i].masq_url->host);               R(urlmap[i].masq_url->port);               R(urlmap[i].reg_url->scheme);               R(urlmap[i].reg_url->username);               R(urlmap[i].reg_url->host);               R(urlmap[i].reg_url->port);            }         }         fclose(stream);      }   }   return;}/* * shut down the URL mapping table */void register_shut(void) {   int i;   FILE *stream;   if (configuration.registrationfile) {      /* write urlmap back to file */      stream = fopen(configuration.registrationfile, "w+");      if (!stream) {         /* try to unlink it and open again */         unlink(configuration.registrationfile);         stream = fopen(configuration.registrationfile, "w+");         /* open file for write failed, complain */         if (!stream) {            ERROR("unable to write registration file");            return;         }      }      for (i=0;i < URLMAP_SIZE; i++) {         fprintf(stream, "***:%i:%i\n", urlmap[i].active, urlmap[i].expires);         if (urlmap[i].active) {            #define W(X) fprintf(stream, "%s\n", (X)? X:"");            W(urlmap[i].true_url->scheme);            W(urlmap[i].true_url->username);            W(urlmap[i].true_url->host);            W(urlmap[i].true_url->port);            W(urlmap[i].masq_url->scheme);            W(urlmap[i].masq_url->username);            W(urlmap[i].masq_url->host);            W(urlmap[i].masq_url->port);            W(urlmap[i].reg_url->scheme);            W(urlmap[i].reg_url->username);            W(urlmap[i].reg_url->host);            W(urlmap[i].reg_url->port);         }      }      fclose(stream);   }   return;}/* * handles register requests and updates the URL mapping table * * RETURNS: *    STS_SUCCESS : successfully registered *    STS_FAILURE : registration failed *    STS_NEED_AUTH : authentication needed */int register_client(osip_message_t *my_msg, int force_lcl_masq) {   int i, j, n, sts;   int expires;   time_t time_now;   osip_uri_t *url1_to, *url1_contact;   osip_uri_t *url2_to, *url2_contact;   osip_header_t *expires_hdr;   osip_uri_param_t *expires_param=NULL;      /*    * RFC 3261, Section 16.3 step 6    * Proxy Behavior - Request Validation - Proxy-Authorization    */   sts = authenticate_proxy(my_msg);   if (sts == STS_FAILURE) {      /* failed */      WARN("proxy authentication failed for %s@%s",           (my_msg->to->url->username)? my_msg->to->url->username : "*NULL*",           my_msg->to->url->host);      return STS_FAILURE;   } else if (sts == STS_NEED_AUTH) {      /* needed */      DEBUGC(DBCLASS_REG,"proxy authentication needed for %s@%s",             my_msg->to->url->username,my_msg->to->url->host);      return STS_NEED_AUTH;   }/*   fetch 1st Via entry and remember this address. Incoming requests   for the registered address have to be passed on to that host.   To: -> address to be registered   Contact: -> host is reachable there      => Mapping is   To: <1--n> Contact   */   time(&time_now);   DEBUGC(DBCLASS_BABBLE,"sip_register:");   /* evaluate Expires Header field */   osip_message_get_expires(my_msg, 0, &expires_hdr);  /*   * look for an Contact expires parameter - in case of REGISTER   * these two are equal. The Contact expires has higher priority!   */   osip_contact_param_get_byname(           (osip_contact_t*) my_msg->contacts->node->element,           EXPIRES, &expires_param);   if (expires_param && expires_param->gvalue) {      /* get expires from contact Header */      expires=atoi(expires_param->gvalue);   } else if (expires_hdr && expires_hdr->hvalue) {      /* get expires from expires Header */      expires=atoi(expires_hdr->hvalue);   } else {      /* it seems, the expires field is not present everywhere... */      WARN("no 'expires' header found - set time to 600 sec");      expires=600;      osip_message_set_expires(my_msg, "600");   }   url1_to=my_msg->to->url;   url1_contact=((osip_contact_t*)(my_msg->contacts->node->element))->url;   DEBUGC(DBCLASS_REG,"register: %s@%s expires=%i seconds",          (url1_contact->username) ? url1_contact->username : "*NULL*",          (url1_contact->host) ? url1_contact->host : "*NULL*",          expires);/* Update registration. There are two possibilities: * - already registered, then update the existing record * - not registered, then create a new record */   j=-1;

⌨️ 快捷键说明

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