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 + -
显示快捷键?