chan_h323.c

来自「一个非常美妙的proxy。功能强大。基于sip的协议。如果还要的话」· C语言 代码 · 共 2,305 行 · 第 1/5 页

C
2,305
字号
   c = p->owner;   if (c) {            if(!ast_test_flag(p, H323_ALREADYGONE))      { /* NOTE Channel is not detached yet */         ast_set_flag(p, H323_ALREADYGONE);         p->owner->hangupcause = ooh323_convert_hangupcause_h323ToAsterisk(                                                          call->callEndReason);         p->owner->_softhangup |= AST_SOFTHANGUP_DEV;         ast_queue_hangup(p->owner);         ast_mutex_unlock(&p->owner->lock);         ast_mutex_unlock(&p->lock);         return OO_OK;      }   }   ast_set_flag(p, H323_NEEDDESTROY);   ast_mutex_unlock(&p->lock);   if(gH323Debug)      ast_verbose("+++   onCallCleared\n");  return OO_OK;}static void ooh323_delete_user(struct ooh323_user *user){   struct ooh323_user *prev=NULL, *cur=NULL;   if(gH323Debug)      ast_verbose("---   ooh323_delete_user\n");   if(user)   {         cur = userl.users;      ast_mutex_lock(&userl.lock);      while(cur)      {         if(cur==user) break;         prev = cur;         cur = cur->next;      }      if(cur)      {         if(prev)            prev->next = cur->next;         else            userl.users = cur->next;      }      ast_mutex_unlock(&userl.lock);      free(user);   }     if(gH323Debug)      ast_verbose("+++   ooh323_delete_user\n");}void ooh323_delete_peer(struct ooh323_peer *peer){   struct ooh323_peer *prev=NULL, *cur=NULL;   if(gH323Debug)      ast_verbose("---   ooh323_delete_peer\n");   if(peer)   {         cur = peerl.peers;      ast_mutex_lock(&peerl.lock);      while(cur)      {         if(cur==peer) break;         prev = cur;         cur = cur->next;      }      if(cur)      {         if(prev)            prev->next = cur->next;         else            peerl.peers = cur->next;      }      ast_mutex_unlock(&peerl.lock);      if(peer->h323id)   free(peer->h323id);      if(peer->email)    free(peer->email);      if(peer->url)      free(peer->url);      if(peer->e164)     free(peer->e164);      free(peer);   }     if(gH323Debug)      ast_verbose("+++   ooh323_delete_peer\n");}static struct ooh323_user *build_user(const char *name, struct ast_variable *v){   struct ooh323_user *user=NULL;   if(gH323Debug)      ast_verbose("---   build_user\n");   user = (struct ooh323_user *)malloc(sizeof(struct ooh323_user));   if (user) {      memset(user, 0, sizeof(struct ooh323_user));      ast_mutex_init(&user->lock);      strncpy(user->name, name, sizeof(user->name)-1);      user->capability = gCapability;      memcpy(&user->prefs, &gPrefs, sizeof(struct ast_codec_pref));      user->rtptimeout = gRTPTimeout;      user->dtmfmode = gDTMFMode;      /* set default context */      strncpy(user->context, gContext, sizeof(user->context)-1);      strncpy(user->accountcode, gAccountcode, sizeof(user->accountcode)-1);      user->amaflags = gAMAFLAGS;      while(v) {         if (!strcasecmp(v->name, "context")) {            strncpy(user->context, v->value, sizeof(user->context) - 1);         } else if (!strcasecmp(v->name, "incominglimit")) {            user->incominglimit = atoi(v->value);            if (user->incominglimit < 0)               user->incominglimit = 0;         } else if (!strcasecmp(v->name, "accountcode")) {            strncpy(user->accountcode, v->value, sizeof(user->accountcode)-1);         }  else if (!strcasecmp(v->name, "rtptimeout")) {            user->rtptimeout = atoi(v->value);            if(user->rtptimeout < 0)               user->rtptimeout = gRTPTimeout;	 } else if (!strcasecmp(v->name, "disallow")) {            ast_parse_allow_disallow(&user->prefs, &user->capability,                                      v->value, 0);         }else if (!strcasecmp(v->name, "allow")) {            ast_parse_allow_disallow(&user->prefs, &user->capability,                                      v->value, 1);         }else if (!strcasecmp(v->name, "amaflags")) {            user->amaflags = ast_cdr_amaflags2int(v->value);         } else if (!strcasecmp(v->name, "dtmfmode")) {            if(!strcasecmp(v->value, "rfc2833"))               user->dtmfmode = H323_DTMF_RFC2833;            else if(!strcasecmp(v->value, "q931keypad"))               user->dtmfmode = H323_DTMF_Q931;            else if(!strcasecmp(v->value, "h245alphanumeric"))               user->dtmfmode = H323_DTMF_H245ALPHANUMERIC;            else if(!strcasecmp(v->value, "h245signal"))               user->dtmfmode = H323_DTMF_H245SIGNAL;         }          v = v->next;      }   }   if(gH323Debug)      ast_verbose("+++   build_user\n");   return user;}static struct ooh323_peer *build_peer(const char *name, struct ast_variable *v){   struct ooh323_peer *peer=NULL;   if(gH323Debug)      ast_verbose("---   build_peer\n");   peer = (struct ooh323_peer *)malloc(sizeof(struct ooh323_peer));   if (peer) {      memset(peer, 0, sizeof(struct ooh323_peer));      ast_mutex_init(&peer->lock);      strncpy(peer->name, name, sizeof(peer->name)-1);      peer->capability = gCapability;      memcpy(&peer->prefs, &gPrefs, sizeof(struct ast_codec_pref));      peer->rtptimeout = gRTPTimeout;      strncpy(peer->accountcode, gAccountcode, sizeof(peer->accountcode)-1);      peer->amaflags = gAMAFLAGS;      peer->dtmfmode = gDTMFMode;      while(v) {         if (!strcasecmp(v->name, "h323id")) {            peer->h323id = (char*)malloc(strlen(v->value)+1);            if(!peer->h323id)            {	       ast_log(LOG_ERROR, "Could not allocate memory for h323id of "                                  "peer %s\n", name);               ooh323_delete_peer(peer);               return NULL;            }            strcpy(peer->h323id, v->value);         } else if (!strcasecmp(v->name, "e164")) {            peer->e164 = (char*)malloc(strlen(v->value)+1);            if(!peer->e164)            {	       ast_log(LOG_ERROR, "Could not allocate memory for e164 of "                                  "peer %s\n", name);               ooh323_delete_peer(peer);               return NULL;            }            strcpy(peer->e164, v->value);         } else  if (!strcasecmp(v->name, "email")) {            peer->email = (char*)malloc(strlen(v->value)+1);            if(!peer->email)            {	       ast_log(LOG_ERROR, "Could not allocate memory for email of "                                  "peer %s\n", name);               ooh323_delete_peer(peer);               return NULL;            }            strcpy(peer->email, v->value);         } else if (!strcasecmp(v->name, "url")) {            peer->url = (char*)malloc(strlen(v->value)+1);            if(!peer->url)            {	       ast_log(LOG_ERROR, "Could not allocate memory for h323id of "                                  "peer %s\n", name);               ooh323_delete_peer(peer);               return NULL;            }            strcpy(peer->url, v->value);         }else if (!strcasecmp(v->name, "port")) {            peer->port = atoi(v->value);         } else if (!strcasecmp(v->name, "ip")) {            strncpy(peer->ip, v->value, sizeof(peer->ip)-1);         } else if (!strcasecmp(v->name, "outgoinglimit")) {            peer->outgoinglimit = atoi(v->value);            if (peer->outgoinglimit < 0)               peer->outgoinglimit = 0;         } else if (!strcasecmp(v->name, "accountcode")) {            strncpy(peer->accountcode, v->value, sizeof(peer->accountcode)-1);         }  else if (!strcasecmp(v->name, "rtptimeout")) {            peer->rtptimeout = atoi(v->value);            if(peer->rtptimeout < 0)               peer->rtptimeout = gRTPTimeout;	 } else if (!strcasecmp(v->name, "disallow")) {            ast_parse_allow_disallow(&peer->prefs, &peer->capability,                                      v->value, 0);          } else if (!strcasecmp(v->name, "allow")) {            ast_parse_allow_disallow(&peer->prefs, &peer->capability,                                      v->value, 1);                      } else if (!strcasecmp(v->name,  "amaflags")) {            peer->amaflags = ast_cdr_amaflags2int(v->value);         } else if (!strcasecmp(v->name, "dtmfmode")) {            if(!strcasecmp(v->value, "rfc2833"))               peer->dtmfmode = H323_DTMF_RFC2833;            else if(!strcasecmp(v->value, "q931keypad"))               peer->dtmfmode = H323_DTMF_Q931;            else if(!strcasecmp(v->value, "h245alphanumeric"))               peer->dtmfmode = H323_DTMF_H245ALPHANUMERIC;            else if(!strcasecmp(v->value, "h245signal"))               peer->dtmfmode = H323_DTMF_H245SIGNAL;         }         v = v->next;      }   }   if(gH323Debug)      ast_verbose("+++   build_peer\n");   return peer;}static int ooh323_do_reload(void){   if(gH323Debug)      ast_verbose("---   ooh323_do_reload\n");   delete_users();   delete_peers();   reload_config();   if(gH323Debug)      ast_verbose("+++   ooh323_do_reload\n");   return 0;}/*--- h323_reload: Force reload of module from cli ---*/static int ooh323_reload(int fd, int argc, char *argv[]){   if(gH323Debug)      ast_verbose("---   ooh323_reload\n");   ast_mutex_lock(&h323_reload_lock);   if (h323_reloading) {      ast_verbose("Previous OOH323 reload not yet done\n");   } else      h323_reloading = 1;   ast_mutex_unlock(&h323_reload_lock);   restart_monitor();   if(gH323Debug)      ast_verbose("+++   ooh323_reload\n");   return 0;}int reload(void){   return ooh323_reload(0, 0, NULL);}int reload_config(void){   int format;   struct ooAliases * pNewAlias=NULL;   struct ast_config *cfg;   struct ast_variable *v;   struct ooh323_user *user   = NULL;   struct ooh323_peer *peer=NULL;   char *cat, *utype;   if(gH323Debug)      ast_verbose("---   reload_config\n");   cfg = ast_config_load((char*)config);   /* We *must* have a config file otherwise stop immediately */   if (!cfg) {      ast_log(LOG_NOTICE, "Unable to load config %s, OOH323 disabled\n",config);      return 1;   }   /* Inintialize everything to default */   strcpy(gLogFile, DEFAULT_LOGFILE);   gPort = 1720;   gIP[0]='\0';   strcpy(gCallerID, DEFAULT_H323ID);   gCapability = AST_FORMAT_ULAW;   memset(&gPrefs, 0, sizeof(struct ast_codec_pref));   gDTMFMode = H323_DTMF_RFC2833;   gRasGkMode = RasNoGatekeeper;   gGatekeeper[0] = '\0';   gRTPTimeout = 60;   strcpy(gAccountcode, DEFAULT_H323ACCNT);   gFastStart = 1;   gTunneling = 1;   gTOS = 0;   strcpy(gContext, DEFAULT_CONTEXT);   gAliasList = NULL;   v = ast_variable_browse(cfg, "general");   while(v) {         if (!strcasecmp(v->name, "port"))       {         gPort = (int)strtol(v->value, NULL, 10);      }       else if (!strcasecmp(v->name, "bindaddr"))       {         strncpy(gIP, v->value, sizeof(gIP)-1);      } else if (!strcasecmp(v->name, "gateway"))       {         gIsGateway = ast_true(v->value);      } else if (!strcasecmp(v->name, "faststart"))       {         gFastStart = ast_true(v->value);      } else if (!strcasecmp(v->name, "h245tunneling"))       {         gTunneling = ast_true(v->value);      }else if (!strcasecmp(v->name, "h323id"))       {	 pNewAlias = malloc(sizeof(struct ooAliases));         if(!pNewAlias){            ast_log(LOG_ERROR, "Failed to allocate memory for h323id alias\n");            return 1;         }         pNewAlias->type =  T_H225AliasAddress_h323_ID;         pNewAlias->value = strdup(v->value);         pNewAlias->next = gAliasList;         gAliasList = pNewAlias;         pNewAlias = NULL;      }else if (!strcasecmp(v->name, "e164"))       {         pNewAlias = malloc(sizeof(struct ooAliases));         if(!pNewAlias){            ast_log(LOG_ERROR, "Failed to allocate memory for e164 alias\n");            return 1;         }         pNewAlias->type =  T_H225AliasAddress_dialedDigits;         pNewAlias->value = strdup(v->value);         pNewAlias->next = gAliasList;         gAliasList = pNewAlias;         pNewAlias = NULL;      }else if (!strcasecmp(v->name, "email"))       {	 pNewAlias = malloc(sizeof(struct ooAliases));         if(!pNewAlias){            ast_log(LOG_ERROR, "Failed to allocate memory for email alias\n");            return 1;         }         pNewAlias->type =  T_H225AliasAddress_email_ID;         pNewAlias->value = strdup(v->value);         pNewAlias->next = gAliasList;         gAliasList = pNewAlias;         pNewAlias = NULL;      }      else if (!strcasecmp(v->name, "callerid"))       {         strncpy(gCallerID, v->value, sizeof(gCallerID)-1);      }else if (!strcasecmp(v->name, "incominglimit"))      {         gIncomingLimit = atoi(v->value);      }else if (!strcasecmp(v->name, "outgoinglimit"))      {         gOutgoingLimit = atoi(v->value);      }      else if (!strcasecmp(v->name, "gatekeeper"))       {         if (!strcasecmp(v->value, "DISABLE"))          {            gRasGkMode = RasNoGatekeeper;         } else if (!strcasecmp(v->value, "DISCOVER"))          {	    gRasGkMode = RasDiscoverGatekeeper;         } else          {            gRasGkMode = RasUseSpecificGatekeeper;            strncpy(gGatekeeper, v->value, sizeof(gGatekeeper)-1);         }      }else if (!strcasecmp(v->name, "logfile"))      {         strncpy(gLogFile, v->name, sizeof(gLogFile)-1);      }else if (!strcasecmp(v->name, "context"))       {         strncpy(gContext, v->value, sizeof(gContext)-1);         ast_verbose(VERBOSE_PREFIX_3 "  == Setting default context to %s\n",                                                       gContext);	      }else if (!strcasecmp(v->name, "rtptimeout"))       {         gRTPTimeout = atoi(v->value);         if(gRTPTimeout <= 0)            gRTPTimeout = 60;      } else if (!strcasecmp(v->name, "tos"))       {         if (sscanf(v->value, "%i", &format) == 1)            gTOS = format & 0xff;         else if (!strcasecmp(v->value, "lowdelay"))            gTOS = IPTOS_LOWDELAY;         else if (!strcasecmp(v->value, "throughput"))            gTOS = IPTOS_THROUGHPUT;         else if (!strcasecmp(v->value, "reliability"))            gTOS = IPTOS_RELIABILITY;         else if (!strcasecmp(v->value, "mincost"))            gTOS = IPTOS_MINCOST;         else if (!strcasecmp(v->value, "none"))            gTOS = 0;         else            ast_log(LOG_WARNING, "Invalid tos value at line %d, should be "                                 "'lowdelay', 'throughput', 'reliability', "                                 "'mincost', or 'none'\n", v->lineno);      }else if(!strcasecmp(v->name, "amaflags"))      {         gAMAFLAGS = ast_cdr_amaflags2int(v->value);      }else if(!strcasecmp(v->name, "accountcode"))

⌨️ 快捷键说明

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