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

📄 plugin_shortdial.c

📁 这是一个C程序
💻 C
字号:
/*    Copyright (C) 2002-2008  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 <stdlib.h>#include <string.h>#include <netinet/in.h>#include <osipparser2/osip_parser.h>#include "siproxd.h"#include "log.h"static char const ident[]="$Id: plugin_shortdial.c,v 1.7 2008/01/19 16:07:14 hb9xar Exp $";/* configuration storage */extern struct siproxd_config configuration;/* local prototypes */static int plugin_shortdial_redirect(sip_ticket_t *ticket, int shortcut_no);/* returns STS_SIP_SENT if processing is to be terminated, * otherwise STS_SUCCESS (go on with processing) *//* code (entry point) */int plugin_shortdial(sip_ticket_t *ticket) {   int sts=STS_SUCCESS;   osip_uri_t *req_url;   int  shortcut_no=0;   if (!ticket || !ticket->sipmsg) return STS_FAILURE;   DEBUGC(DBCLASS_PLUGIN,"plugin entered");   req_url=osip_message_get_uri(ticket->sipmsg);   /* only outgoing direction is handled */   sip_find_direction(ticket, NULL);   if (ticket->direction != DIR_OUTGOING)      return STS_SUCCESS;   /* only INVITE and ACK are handled */   if (!MSG_IS_INVITE(ticket->sipmsg) && !MSG_IS_ACK(ticket->sipmsg))      return STS_SUCCESS;   /* REQ URI with username must exist, length as defined in config,    * shortdial must be enabled and short dial key must match */   if (!req_url || !req_url->username ||       !configuration.pi_shortdial_akey ||       (strlen(req_url->username) != strlen(configuration.pi_shortdial_akey)) ||       (req_url->username[0] != configuration.pi_shortdial_akey[0]))      return STS_SUCCESS; /* ignore */   shortcut_no = atoi(&(req_url->username[1]));   if ((shortcut_no <= 0) || (shortcut_no >= LONG_MAX)) return STS_SUCCESS; /* not a number */   /* requested number is not defined (out of range) */   if (shortcut_no > configuration.pi_shortdial_entry.used) {      DEBUGC(DBCLASS_PLUGIN, "shortdial: shortcut %i > available shortcuts (%i)",            shortcut_no, configuration.pi_shortdial_entry.used);      return STS_SUCCESS;   }   /* requested number is not defined (empty) */   if (!configuration.pi_shortdial_entry.string[shortcut_no-1]) {      DEBUGC(DBCLASS_PLUGIN, "shortdial: shortcut %i empty", shortcut_no);      return STS_SUCCESS;   }   /*    * called number does match the short dial specification    */   /* outgoing INVITE request */   if (MSG_IS_INVITE(ticket->sipmsg)) {      DEBUGC(DBCLASS_PLUGIN,"processing INVITE");      sts=plugin_shortdial_redirect(ticket, shortcut_no);   }   /* outgoing ACK request: is result of a local 3xx answer (moved...) */   else if (MSG_IS_ACK(ticket->sipmsg)) {      /* make sure we only catch ACKs caused by myself (**02 -> *02 legitime) */      DEBUGC(DBCLASS_PLUGIN,"processing ACK");      sts=STS_SIP_SENT; /* eat up the ACK that was directed to myself */   }   return sts;}/* private code */static int plugin_shortdial_redirect(sip_ticket_t *ticket, int shortcut_no) {   osip_uri_t *to_url=ticket->sipmsg->to->url;   char *to_user=to_url->username;   char *new_to_user=NULL;   int  i;   size_t len;   osip_contact_t *contact = NULL;   new_to_user=configuration.pi_shortdial_entry.string[shortcut_no-1];   if (!new_to_user) return STS_SUCCESS;   DEBUGC(DBCLASS_PLUGIN,"redirect: redirecting [%s]->[%s]",          to_user, new_to_user);   len=strlen(new_to_user)+1; /* include trailing "\0" */   /* use a "302 Moved temporarily" response back to the client */   /* new target is within the Contact Header */   /* remove all Contact headers in message */   for (i=0; (contact != NULL) || (i == 0); i++) {      osip_message_get_contact(ticket->sipmsg, 0, &contact);      if (contact) {         osip_list_remove(&(ticket->sipmsg->contacts),0);         osip_contact_free(contact);      }   } /* for i */   /* insert one new Contact header containing the new target address */   osip_contact_init(&contact);   osip_uri_clone(to_url, &contact->url);   osip_free(contact->url->username);   contact->url->username=osip_malloc(len);   strcpy(contact->url->username, new_to_user);   osip_list_add(&(ticket->sipmsg->contacts),contact,0);   /* sent redirect message back to local client */   sip_gen_response(ticket, 302 /*Moved temporarily*/);   return STS_SIP_SENT;}

⌨️ 快捷键说明

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