chan_h323.c

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

C
2,305
字号
      {         strncpy(gAccountcode, v->value, sizeof(gAccountcode)-1);      }else if (!strcasecmp(v->name, "disallow"))       {         ast_parse_allow_disallow(&gPrefs, &gCapability, v->value, 0);      }else if (!strcasecmp(v->name, "allow"))       {         ast_parse_allow_disallow(&gPrefs, &gCapability, v->value, 1);      } else if (!strcasecmp(v->name, "dtmfmode"))       {         if (!strcasecmp(v->value, "inband"))            gDTMFMode=H323_DTMF_INBAND;         else if (!strcasecmp(v->value, "rfc2833"))            gDTMFMode = H323_DTMF_RFC2833;         else if (!strcasecmp(v->value, "q931keypad"))            gDTMFMode = H323_DTMF_Q931;         else if (!strcasecmp(v->value, "h245alphanumeric"))            gDTMFMode = H323_DTMF_H245ALPHANUMERIC;         else if (!strcasecmp(v->value, "h245signal"))            gDTMFMode = H323_DTMF_H245SIGNAL;         else {            ast_log(LOG_WARNING, "Unknown dtmf mode '%s', using rfc2833\n",                                                                     v->value);            gDTMFMode = H323_DTMF_RFC2833;         }      }        v = v->next;	   }	   cat = ast_category_browse(cfg, NULL);   while(cat)    {      if(strcasecmp(cat, "general"))       {         utype = ast_variable_retrieve(cfg, cat, "type");         if(utype)         {            if(!strcmp(utype, "user") || !strcasecmp(utype, "friend"))            {               user = build_user(cat, ast_variable_browse(cfg, cat));               if (user)                {                  ast_mutex_lock(&userl.lock);                  user->next = userl.users;                  userl.users = user;                  ast_mutex_unlock(&userl.lock);               }else {                  ast_log(LOG_WARNING, "Failed to build user %s\n", cat);               }            }            if(!strcasecmp(utype, "peer") || !strcasecmp(utype, "friend"))            {               peer = build_peer(cat, ast_variable_browse(cfg, cat));               if(peer)               {                  ast_mutex_lock(&userl.lock);                  peer->next = peerl.peers;                  peerl.peers = peer;                  ast_mutex_unlock(&userl.lock);               }else {                  ast_log(LOG_WARNING, "Failed to build peer %s\n", cat);               }            }         }      }      cat = ast_category_browse(cfg, cat);   }   ast_config_destroy(cfg);   /* Determine ip address if neccessary */   if(!strlen(gIP))   {      ooGetLocalIPAddress(gIP);      if(!strcmp(gIP, "127.0.0.1"))      {         ast_log(LOG_NOTICE, "Failed to determine local ip address. Please "                            "specify it in ooh323.conf. OOH323 Disabled\n");         return 1;      }   }   if(gH323Debug)      ast_verbose("+++   reload_config\n");   return 0;}static int ooh323_show_peer(int fd, int argc, char *argv[]){   struct ooh323_peer *prev=NULL, *peer=NULL;   char formats[512];   char ip_port[30];   if(argc !=  4)      return RESULT_SHOWUSAGE;     ast_mutex_lock(&peerl.lock);   peer = peerl.peers;   while(peer)   {      ast_mutex_lock(&peer->lock);      if(!strcmp(peer->name, argv[3]))         break;      else{         prev = peer;         peer = peer->next;         ast_mutex_unlock(&prev->lock);      }   }   if(peer)   {      sprintf(ip_port, "%s:%d", peer->ip, peer->port);      ast_cli(fd, "%-15.15s%s\n", "Name: ", peer->name);      ast_codec_pref_string(&peer->prefs, formats, 512);      ast_cli(fd, "%-15.15s%s\n", "Format Prefs: ", formats);      ast_cli(fd, "%-15.15s", "DTMF Mode: ");      if(peer->dtmfmode & H323_DTMF_RFC2833)	 ast_cli(fd, "%s\n", "rfc2833");      else if(peer->dtmfmode & H323_DTMF_Q931)         ast_cli(fd, "%s\n", "q931keypad");      else if(peer->dtmfmode & H323_DTMF_H245ALPHANUMERIC)         ast_cli(fd, "%s\n", "h245alphanumeric");      else if(peer->dtmfmode & H323_DTMF_H245SIGNAL)         ast_cli(fd, "%s\n", "h245signal");      else         ast_cli(fd, "%s\n", "unknown");      ast_cli(fd, "%-15.15s%s\n", "AccountCode: ", peer->accountcode);      ast_cli(fd, "%-15.15s%s\n", "AMA flags: ",                                             ast_cdr_flags2str(peer->amaflags));      ast_cli(fd, "%-15.15s%s\n", "Ip:Port: ", ip_port);      ast_cli(fd, "%-15.15s%d\n", "OutgoingLimit: ", peer->outgoinglimit);      ast_cli(fd, "%-15.15s%d\n", "rtptimeout: ", peer->rtptimeout);      ast_mutex_unlock(&peer->lock);   }   else{     ast_cli(fd, "Peer %s not found\n", argv[3]);     ast_cli(fd, "\n");   }   ast_mutex_unlock(&peerl.lock);   return RESULT_SUCCESS;}static int ooh323_show_peers(int fd, int argc, char *argv[]){   struct ooh323_peer *prev = NULL, *peer=NULL;   char formats[512];   char ip_port[30];#define FORMAT  "%-15.15s  %-15.15s  %-23.23s  %-s\n"   if (argc != 3)      return RESULT_SHOWUSAGE;	   ast_cli(fd, FORMAT, "Name", "Accountcode", "ip:port", "Formats");      ast_mutex_lock(&peerl.lock);   peer = peerl.peers;   while(peer)   {     ast_mutex_lock(&peer->lock);     sprintf(ip_port, "%s:%d", peer->ip, peer->port);     ast_cli(fd, FORMAT, peer->name,                  peer->accountcode,                 ip_port,                 ast_getformatname_multiple(formats,512,peer->capability));     prev = peer;     peer = peer->next;     ast_mutex_unlock(&prev->lock);   }   ast_mutex_unlock(&peerl.lock);#undef FORMAT   return RESULT_SUCCESS;}static int ooh323_show_user(int fd, int argc, char *argv[]){   struct ooh323_user *prev=NULL, *user=NULL;   char formats[512];   if(argc !=  4)      return RESULT_SHOWUSAGE;     ast_mutex_lock(&userl.lock);   user = userl.users;   while(user)   {      ast_mutex_lock(&user->lock);      if(!strcmp(user->name, argv[3]))         break;      else{         prev = user;         user = user->next;         ast_mutex_unlock(&prev->lock);      }   }   if(user)   {      ast_cli(fd, "%-15.15s%s\n", "Name: ", user->name);      ast_codec_pref_string(&user->prefs, formats, 512);      ast_cli(fd, "%-15.15s%s\n", "Format Prefs: ",formats);      ast_cli(fd, "%-15.15s", "DTMF Mode: ");      if(user->dtmfmode & H323_DTMF_RFC2833)	 ast_cli(fd, "%s\n", "rfc2833");      else if(user->dtmfmode & H323_DTMF_Q931)         ast_cli(fd, "%s\n", "q931keypad");      else if(user->dtmfmode & H323_DTMF_H245ALPHANUMERIC)         ast_cli(fd, "%s\n", "h245alphanumeric");      else if(user->dtmfmode & H323_DTMF_H245SIGNAL)         ast_cli(fd, "%s\n", "h245signal");      else         ast_cli(fd, "%s\n", "unknown");      ast_cli(fd, "%-15.15s%s\n", "AccountCode: ", user->accountcode);      ast_cli(fd, "%-15.15s%s\n", "AMA flags: ",                                             ast_cdr_flags2str(user->amaflags));      ast_cli(fd, "%-15.15s%s\n", "Context: ", user->context);      ast_cli(fd, "%-15.15s%d\n", "IncomingLimit: ", user->incominglimit);      ast_cli(fd, "%-15.15s%d\n", "rtptimeout: ", user->rtptimeout);      ast_mutex_unlock(&user->lock);   }   else{     ast_cli(fd, "User %s not found\n", argv[3]);     ast_cli(fd, "\n");   }   ast_mutex_unlock(&userl.lock);   return RESULT_SUCCESS;}static int ooh323_show_users(int fd, int argc, char *argv[]){   struct ooh323_user *prev = NULL, *user=NULL;   char formats[512];#define FORMAT1  "%-15.15s  %-15.15s  %-15.15s  %-s\n"   if (argc != 3)      return RESULT_SHOWUSAGE;	   ast_cli(fd, FORMAT1, "Username", "Accountcode", "Context", "Formats");      ast_mutex_lock(&userl.lock);   user = userl.users;   while(user)   {     ast_mutex_lock(&user->lock);     ast_cli(fd, FORMAT1, user->name,                  user->accountcode, user->context,                 ast_getformatname_multiple(formats,512,user->capability));     prev = user;     user = user->next;     ast_mutex_unlock(&prev->lock);   }   ast_mutex_unlock(&userl.lock);#undef FORMAT1   return RESULT_SUCCESS;}static int ooh323_do_debug(int fd, int argc, char *argv[]){   if (argc != 2)      return RESULT_SHOWUSAGE;   gH323Debug = TRUE;   ast_cli(fd, "OOH323 Debugging Enabled\n");   return RESULT_SUCCESS;}static int ooh323_no_debug(int fd, int argc, char *argv[]){   if (argc != 3)      return RESULT_SHOWUSAGE;   gH323Debug = FALSE;   ast_cli(fd, "OOH323 Debugging Disabled\n");   return RESULT_SUCCESS;}static int ooh323_show_channels(int fd, int argc, char *argv[]){   return RESULT_SUCCESS;}static int ooh323_show_config(int fd, int argc, char *argv[]){   char value[512];   ooAliases *pAlias = NULL, *pAliasNext=NULL;;   ast_cli(fd, "\nObjective Open H.323 Channel Driver's Config:\n");   sprintf(value, "%s:%d", gIP, gPort);   ast_cli(fd, "%-15s%s\n", "IP:Port: ", value);   ast_cli(fd, "%-15s%s\n", "FastStart", gFastStart?"yes":"no");   ast_cli(fd, "%-15s%s\n", "Tunneling", gTunneling?"yes":"no");   ast_cli(fd, "%-15s%s\n", "CallerId", gCallerID);   if(gRasGkMode == RasNoGatekeeper)      sprintf(value, "%s", "No Gatekeeper");   else if(gRasGkMode == RasDiscoverGatekeeper)      sprintf(value, "%s", "Discover");   else     sprintf(value, "%s", gGatekeeper);   ast_cli(fd,  "%-15s%s\n", "Gatekeeper:", value);   ast_cli(fd,  "%-15s%s\n", "H.323 LogFile:", gLogFile);      ast_cli(fd,  "%-15s%s\n", "Context:", gContext);      ast_cli(fd,  "%-15s%s\n", "Capability:",                            ast_getformatname_multiple(value,512,gCapability));   ast_cli(fd, "%-15s", "DTMF Mode: ");   if(gDTMFMode & H323_DTMF_RFC2833)      ast_cli(fd, "%s\n", "rfc2833");   else if (gDTMFMode & H323_DTMF_Q931)      ast_cli(fd, "%s\n", "q931keypad");   else if(gDTMFMode & H323_DTMF_H245ALPHANUMERIC)      ast_cli(fd, "%s\n", "h245alphanumeric");   else if(gDTMFMode & H323_DTMF_H245SIGNAL)      ast_cli(fd, "%s\n", "h245signal");   else      ast_cli(fd, "%s\n", "unknown");   ast_cli(fd, "%-15s%s\n", "AccountCode: ", gAccountcode);   ast_cli(fd, "%-15s%s\n", "AMA flags: ", ast_cdr_flags2str(gAMAFLAGS));   pAlias = gAliasList;   if(pAlias)   {     ast_cli(fd, "%-15s\n", "Aliases: ");   }   while(pAlias)   {      pAliasNext = pAlias->next;      if(pAliasNext)      {         ast_cli(fd,"\t%-30s\t%-30s\n",pAlias->value, pAliasNext->value);         pAlias = pAliasNext->next;      }else{         ast_cli(fd,"\t%-30s\n",pAlias->value);         pAlias = pAlias->next;      }   }            return RESULT_SUCCESS;}static char show_config_usage[]="Usage: ooh323 show config\n""       Shows global configuration of H.323 channel driver\n";static char debug_usage[] = "Usage: ooh323 debug\n""       Enables debugging of OOH323 channel driver\n";static struct ast_cli_entry  cli_debug =	{ { "ooh323", "debug", NULL }, ooh323_do_debug, "Enable OOH323 debugging", debug_usage };static char no_debug_usage[] = "Usage: ooh323 no debug\n""       Disables debugging of OOH323 channel driver\n";static struct ast_cli_entry  cli_no_debug =	{ { "ooh323", "no", "debug", NULL }, ooh323_no_debug, "Disable OOH323 debugging", no_debug_usage };static char show_users_usage[] = "Usage: ooh323 show users \n""       Lists all known OOH323 users.\n";static struct ast_cli_entry  cli_show_users = 	{ { "ooh323", "show", "users", NULL }, ooh323_show_users, "Show defined OOH323 users", show_users_usage };static char show_user_usage[] = "Usage: ooh323 show user <name> \n""       List details of specific OOH323 user.\n";static struct ast_cli_entry  cli_show_user =	{ { "ooh323", "show", "user", NULL }, ooh323_show_user, "Show details on specific OOH323 user", show_user_usage };static char show_peers_usage[] = "Usage: ooh323 show peers \n""       Lists all known OOH323 peers.\n";static struct ast_cli_entry  cli_show_peers = 	{ { "ooh323", "show", "peers", NULL }, ooh323_show_peers, "Show defined OOH323 peers", show_peers_usage };static char show_peer_usage[] = "Usage: ooh323 show peer <name> \n""       List details of specific OOH323 peer.\n";static struct ast_cli_entry  cli_show_peer =	{ { "ooh323", "show", "peer", NULL }, ooh323_show_peer, "Show details on specific OOH323 peer", show_peer_usage };static struct ast_cli_entry cli_show_config =        { { "ooh323", "show", "config", NULL }, ooh323_show_config, "Show details on global configuration of H.323 channel driver", show_config_usage };         int load_module(void){   int res;   struct ooAliases * pNewAlias=NULL;   struct ooh323_peer *peer=NULL;   OOH225MsgCallbacks h225Callbacks = {0, 0, 0, 0};   OOH323CALLBACKS h323Callbacks ={     .onNewCallCreated = onNewCallCreated,     .onAlerting = onAlerting,     .onIncomingCall = NULL,     .onOutgoingCall = NULL,     .onCallEstablished = onCallEstablished,     .onCallCleared = onCallCleared,     .openLogicalChannels=NULL,     .onReceivedDTMF = &ooh323_onReceivedDigit   };   h225Callbacks.onReceivedSetup = &ooh323_onReceivedSetup;   userl.users = NULL;   ast_mutex_init(&userl.lock);   peerl.peers = NULL;   ast_mutex_init(&peerl.lock);            sched = sched_context_create();   if (!sched) {      ast_log(LOG_WARNING, "Unable to create schedule context\n");   }   io = io_context_create();   if (!io) {      ast_log(LOG_WARNING, "Unable to create I/O context\n");   }   res = reload_config();   if (!res) {      /* Make sure we can register our OOH323 channel type */      if (ast_channel_register(&ooh323_tech)) {         ast_log(LOG_ERROR, "Unable to register channel class %s\n", type);         return 0;      }      ast_rtp_proto_register(&ooh323_rtp);      ast_cli_register(&cli_show_users);      ast_cli_register(&cli_show_user);      ast_cli_register(&cli_show_peers);      ast_cli_register(&cli_show_peer);      ast_cli_register(&cli_show_config);      ast_cli_register(&cli_debug);      ast_cli_register(&cli_no_debug);       /* fire up the H.

⌨️ 快捷键说明

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