diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-10-01 21:18:14 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-10-01 21:18:14 +0000 |
commit | cd372e32c76de742d9268f9cfc27fe47cfdd3e6a (patch) | |
tree | 9a6238e1a10bfecdf9204528fb9d3dd01c4a10d3 /channels | |
parent | 23d4b6f29c5684ecd10e8ebcb3da3a0534a12d7d (diff) | |
parent | 85bbd1354ca1a7d5d9c028fb7f2223b279696fe5 (diff) |
Copy 1.6.0-rc6 -> 1.6.0
git-svn-id: http://svn.digium.com/svn/asterisk/tags/1.6.0@145555 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_agent.c | 5 | ||||
-rw-r--r-- | channels/chan_iax2.c | 99 | ||||
-rw-r--r-- | channels/chan_local.c | 4 | ||||
-rw-r--r-- | channels/chan_oss.c | 2 | ||||
-rw-r--r-- | channels/chan_sip.c | 82 | ||||
-rw-r--r-- | channels/chan_skinny.c | 18 | ||||
-rw-r--r-- | channels/iax2-parser.c | 29 |
7 files changed, 46 insertions, 193 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c index f0d913ff3..f582b7287 100644 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -2492,10 +2492,7 @@ static int unload_module(void) /* First, take us out of the channel loop */ ast_channel_unregister(&agent_tech); /* Delete devicestate subscription */ - if (agent_devicestate_sub) { - ast_event_unsubscribe(agent_devicestate_sub); - agent_devicestate_sub = NULL; - } + ast_event_unsubscribe(agent_devicestate_sub); /* Unregister dialplan functions */ ast_custom_function_unregister(&agent_function); /* Unregister CLI commands */ diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 0c6fa73ee..ea45d7a82 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -628,10 +628,7 @@ struct chan_iax2_pvt { int calling_pres; int amaflags; AST_LIST_HEAD_NOLOCK(, iax2_dpcache) dpentries; - /*! variables inherited from the user definition */ struct ast_variable *vars; - /*! variables transmitted in a NEW packet */ - struct ast_variable *iaxvars; /*! last received remote rr */ struct iax_rr remote_rr; /*! Current base time: (just for stats) */ @@ -3685,12 +3682,10 @@ static int iax2_call(struct ast_channel *c, char *dest, int timeout) /* Add remote vars */ if (variablestore) { AST_LIST_HEAD(, ast_var_t) *variablelist = variablestore->data; - ast_debug(1, "Found an IAX variable store on this channel\n"); AST_LIST_LOCK(variablelist); AST_LIST_TRAVERSE(variablelist, var, entries) { char tmp[256]; int i; - ast_debug(1, "Found IAXVAR '%s' with value '%s' (to transmit)\n", ast_var_name(var), ast_var_value(var)); /* Automatically divide the value up into sized chunks */ for (i = 0; i < strlen(ast_var_value(var)); i += 255 - (strlen(ast_var_name(var)) + 1)) { snprintf(tmp, sizeof(tmp), "%s=%s", ast_var_name(var), ast_var_value(var) + i); @@ -4099,8 +4094,8 @@ static struct ast_channel *ast_iax2_new(int callno, int state, int capability) tmp->tech = &iax2_tech; /* We can support any format by default, until we get restricted */ tmp->nativeformats = capability; - tmp->readformat = tmp->rawreadformat = ast_best_codec(capability); - tmp->writeformat = tmp->rawwriteformat = ast_best_codec(capability); + tmp->readformat = ast_best_codec(capability); + tmp->writeformat = ast_best_codec(capability); tmp->tech_pvt = CALLNO_TO_PTR(i->callno); /* Don't use ast_set_callerid() here because it will @@ -4134,42 +4129,6 @@ static struct ast_channel *ast_iax2_new(int callno, int state, int capability) for (v = i->vars ; v ; v = v->next) pbx_builtin_setvar_helper(tmp, v->name, v->value); } - if (i->iaxvars) { - struct ast_datastore *variablestore; - struct ast_variable *var, *prev = NULL; - AST_LIST_HEAD(, ast_var_t) *varlist; - ast_debug(1, "Loading up the channel with IAXVARs\n"); - varlist = ast_calloc(1, sizeof(*varlist)); - variablestore = ast_channel_datastore_alloc(&iax2_variable_datastore_info, NULL); - if (variablestore && varlist) { - variablestore->data = varlist; - variablestore->inheritance = DATASTORE_INHERIT_FOREVER; - AST_LIST_HEAD_INIT(varlist); - for (var = i->iaxvars; var; var = var->next) { - struct ast_var_t *newvar = ast_var_assign(var->name, var->value); - if (prev) - ast_free(prev); - prev = var; - if (!newvar) { - /* Don't abort list traversal, as this would leave i->iaxvars in an inconsistent state. */ - ast_log(LOG_ERROR, "Memory allocation error while processing IAX2 variables\n"); - } else { - AST_LIST_INSERT_TAIL(varlist, newvar, entries); - } - } - if (prev) - ast_free(prev); - i->iaxvars = NULL; - ast_channel_datastore_add(i->owner, variablestore); - } else { - if (variablestore) { - ast_channel_datastore_free(variablestore); - } - if (varlist) { - ast_free(varlist); - } - } - } if (state != AST_STATE_DOWN) { if (ast_pbx_start(tmp)) { @@ -8290,10 +8249,8 @@ static int socket_process(struct iax2_thread *thread) } f.data = NULL; f.datalen = 0; - } else { + } else f.data = thread->buf + sizeof(*fh); - memset(&ies, 0, sizeof(ies)); - } } else { if (f.frametype == AST_FRAME_IAX) f.data = NULL; @@ -8313,26 +8270,20 @@ static int socket_process(struct iax2_thread *thread) if (!ast_iax2_new(fr->callno, AST_STATE_RING, iaxs[fr->callno]->chosenformat)) { ast_mutex_unlock(&iaxsl[fr->callno]); return 1; - } - } - - if (ies.vars) { - struct ast_datastore *variablestore; - struct ast_variable *var, *prev = NULL; - AST_LIST_HEAD(, ast_var_t) *varlist; - if ((c = iaxs[fr->callno]->owner)) { + } else if (ies.vars) { + struct ast_datastore *variablestore; + struct ast_variable *var, *prev = NULL; + AST_LIST_HEAD(, ast_var_t) *varlist; varlist = ast_calloc(1, sizeof(*varlist)); variablestore = ast_channel_datastore_alloc(&iax2_variable_datastore_info, NULL); if (variablestore && varlist) { variablestore->data = varlist; variablestore->inheritance = DATASTORE_INHERIT_FOREVER; AST_LIST_HEAD_INIT(varlist); - ast_debug(1, "I can haz IAX vars?\n"); for (var = ies.vars; var; var = var->next) { struct ast_var_t *newvar = ast_var_assign(var->name, var->value); - if (prev) { + if (prev) ast_free(prev); - } prev = var; if (!newvar) { /* Don't abort list traversal, as this would leave ies.vars in an inconsistent state. */ @@ -8341,38 +8292,21 @@ static int socket_process(struct iax2_thread *thread) AST_LIST_INSERT_TAIL(varlist, newvar, entries); } } - if (prev) { + if (prev) ast_free(prev); - } ies.vars = NULL; ast_channel_datastore_add(c, variablestore); } else { ast_log(LOG_ERROR, "Memory allocation error while processing IAX2 variables\n"); - if (variablestore) { + if (variablestore) ast_channel_datastore_free(variablestore); - } - if (varlist) { + if (varlist) ast_free(varlist); - } - } - } else { - /* No channel yet, so transfer the variables directly over to the pvt, - * for later inheritance. */ - ast_debug(1, "No channel, so populating IAXVARs to the pvt, as an intermediate step.\n"); - for (var = ies.vars; var && var->next; var = var->next); - if (var) { - var->next = iaxs[fr->callno]->iaxvars; - iaxs[fr->callno]->iaxvars = ies.vars; - ies.vars = NULL; } } } } - if (ies.vars) { - ast_debug(1, "I have IAX variables, but they were not processed\n"); - } - if (f.frametype == AST_FRAME_VOICE) { if (f.subclass != iaxs[fr->callno]->voiceformat) { iaxs[fr->callno]->voiceformat = f.subclass; @@ -8396,11 +8330,8 @@ retryowner: } else { ast_debug(1, "Neat, somebody took away the channel at a magical time but i found it!\n"); /* Free remote variables (if any) */ - if (ies.vars) { + if (ies.vars) ast_variables_destroy(ies.vars); - ast_debug(1, "I can haz iaxvars, but they is no good. :-(\n"); - ies.vars = NULL; - } ast_mutex_unlock(&iaxsl[fr->callno]); return 1; } @@ -9124,7 +9055,6 @@ retryowner2: variablestore->data = varlist; variablestore->inheritance = DATASTORE_INHERIT_FOREVER; AST_LIST_HEAD_INIT(varlist); - ast_debug(1, "I can haz IAX vars? w00t\n"); for (var = ies.vars; var; var = var->next) { struct ast_var_t *newvar = ast_var_assign(var->name, var->value); if (prev) @@ -9423,11 +9353,8 @@ retryowner2: send_command(iaxs[fr->callno], AST_FRAME_IAX, IAX_COMMAND_UNSUPPORT, 0, ied0.buf, ied0.pos, -1); } /* Free remote variables (if any) */ - if (ies.vars) { + if (ies.vars) ast_variables_destroy(ies.vars); - ast_debug(1, "I can haz IAX vars, but they is no good :-(\n"); - ies.vars = NULL; - } /* Don't actually pass these frames along */ if ((f.subclass != IAX_COMMAND_ACK) && diff --git a/channels/chan_local.c b/channels/chan_local.c index 3dd9fff1a..f5a6ca142 100644 --- a/channels/chan_local.c +++ b/channels/chan_local.c @@ -175,10 +175,6 @@ static int local_queue_frame(struct local_pvt *p, int isoutbound, struct ast_fra /* Recalculate outbound channel */ other = isoutbound ? p->owner : p->chan; - /* do not queue frame if generator is on both local channels */ - if (us && us->generator && other->generator) - return 0; - /* Set glare detection */ ast_set_flag(p, LOCAL_GLARE_DETECT); if (ast_test_flag(p, LOCAL_CANCEL_QUEUE)) { diff --git a/channels/chan_oss.c b/channels/chan_oss.c index 9cfd6449e..12800d975 100644 --- a/channels/chan_oss.c +++ b/channels/chan_oss.c @@ -1292,7 +1292,7 @@ static void store_mixer(struct chan_oss_pvt *o, const char *s) int i; for (i = 0; i < strlen(s); i++) { - if (!isalnum(s[i]) && strchr(" \t-/", s[i]) == NULL) { + if (!isalnum(s[i]) && index(" \t-/", s[i]) == NULL) { ast_log(LOG_WARNING, "Suspect char %c in mixer cmd, ignoring:\n\t%s\n", s[i], s); return; } diff --git a/channels/chan_sip.c b/channels/chan_sip.c index ae3f7b3aa..fb30e2baf 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -733,10 +733,6 @@ static int global_max_se; /*!< Highest threshold for session /*@}*/ -/*! \brief Global list of addresses dynamic peers are not allowed to use */ -static struct ast_ha *global_contact_ha = NULL; -static int global_dynamic_exclude_static = 0; - /*! \name Object counters @{ * \bug These counters are not handled in a thread-safe way ast_atomic_fetchadd_int() * should be used to modify these values. */ @@ -1501,7 +1497,6 @@ struct sip_peer { struct timeval ps; /*!< Time for sending SIP OPTION in sip_pke_peer() */ struct sockaddr_in defaddr; /*!< Default IP address, used until registration */ struct ast_ha *ha; /*!< Access control list */ - struct ast_ha *contactha; /*!< Restrict what IPs are allowed in the Contact header (for registration) */ struct ast_variable *chanvars; /*!< Variables to set for channel created by user */ struct sip_pvt *mwipvt; /*!< Subscription for MWI */ int autoframing; @@ -9855,7 +9850,7 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st const char *useragent; struct hostent *hp; struct ast_hostent ahp; - struct sockaddr_in oldsin, testsin; + struct sockaddr_in oldsin; ast_copy_string(contact, get_header(req, "Contact"), sizeof(contact)); @@ -9929,26 +9924,13 @@ static enum parse_register_result parse_register_contact(struct sip_pvt *pvt, st } oldsin = peer->addr; - - /* Check that they're allowed to register at this IP */ - /* XXX This could block for a long time XXX */ - hp = ast_gethostbyname(host, &ahp); - if (!hp) { - ast_log(LOG_WARNING, "Invalid host '%s'\n", host); - *peer->fullcontact = '\0'; - ast_string_field_set(pvt, our_contact, ""); - return PARSE_REGISTER_FAILED; - } - memcpy(&testsin.sin_addr, hp->h_addr, sizeof(testsin.sin_addr)); - if ( ast_apply_ha(global_contact_ha, &testsin) != AST_SENSE_ALLOW || - ast_apply_ha(peer->contactha, &testsin) != AST_SENSE_ALLOW) { - ast_log(LOG_WARNING, "Host '%s' disallowed by rule\n", host); - *peer->fullcontact = '\0'; - ast_string_field_set(pvt, our_contact, ""); - return PARSE_REGISTER_FAILED; - } - if (!ast_test_flag(&peer->flags[0], SIP_NAT_ROUTE)) { + /* XXX This could block for a long time XXX */ + hp = ast_gethostbyname(host, &ahp); + if (!hp) { + ast_log(LOG_WARNING, "Invalid host '%s'\n", host); + return PARSE_REGISTER_FAILED; + } peer->addr.sin_family = AF_INET; memcpy(&peer->addr.sin_addr, hp->h_addr, sizeof(peer->addr.sin_addr)); peer->addr.sin_port = htons(port); @@ -14595,7 +14577,6 @@ static void parse_moved_contact(struct sip_pvt *p, struct sip_request *req) p->socket.type = transport; if (ast_test_flag(&p->flags[0], SIP_PROMISCREDIR)) { - char *host = NULL; if (!strncasecmp(s, "sip:", 4)) s += 4; else if (!strncasecmp(s, "sips:", 5)) @@ -14603,16 +14584,9 @@ static void parse_moved_contact(struct sip_pvt *p, struct sip_request *req) e = strchr(s, '/'); if (e) *e = '\0'; - if ((host = strchr(s, '@'))) { - *host++ = '\0'; - ast_debug(2, "Found promiscuous redirection to 'SIP/%s::::%s@%s'\n", s, get_transport(transport), host); - if (p->owner) - ast_string_field_build(p->owner, call_forward, "SIP/%s::::%s@%s", s, get_transport(transport), host); - } else { - ast_debug(2, "Found promiscuous redirection to 'SIP/::::%s@%s'\n", get_transport(transport), s); - if (p->owner) - ast_string_field_build(p->owner, call_forward, "SIP/::::%s@%s", get_transport(transport), s); - } + ast_debug(2, "Found promiscuous redirection to 'SIP/::::%s@%s'\n", get_transport(transport), s); + if (p->owner) + ast_string_field_build(p->owner, call_forward, "SIP/::::%s@%s", get_transport(transport), s); } else { e = strchr(tmp, '@'); if (e) { @@ -15718,12 +15692,10 @@ static void *sip_park_thread(void *stuff) transferee = d->chan1; transferer = d->chan2; copy_request(&req, &d->req); + ast_free(d); if (!transferee || !transferer) { ast_log(LOG_ERROR, "Missing channels for parking! Transferer %s Transferee %s\n", transferer ? "<available>" : "<missing>", transferee ? "<available>" : "<missing>" ); - if (d->req.data) - ast_free(d->req.data); - free(d); return NULL; } ast_debug(4, "SIP Park: Transferer channel %s, Transferee %s\n", transferer->name, transferee->name); @@ -15733,9 +15705,6 @@ static void *sip_park_thread(void *stuff) ast_log(LOG_WARNING, "Masquerade failed.\n"); transmit_response(transferer->tech_pvt, "503 Internal error", &req); ast_channel_unlock(transferee); - if (d->req.data) - ast_free(d->req.data); - free(d); return NULL; } ast_channel_unlock(transferee); @@ -15769,9 +15738,6 @@ static void *sip_park_thread(void *stuff) ast_debug(1, "SIP Call parked failed \n"); /* Do not hangup call */ } - if (d->req.data) - ast_free(d->req.data); - free(d); return NULL; } @@ -19647,8 +19613,6 @@ static struct ast_channel *sip_request_call(const char *type, int format, void * ast_log(LOG_WARNING, "'%s' is not a valid transport option to Dial() for SIP calls, using udp by default.\n", trans); transport = SIP_TRANSPORT_UDP; } - } else { /* use default */ - transport = SIP_TRANSPORT_UDP; } if (!host) { @@ -20438,13 +20402,6 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str AST_SCHED_DEL(sched, peer->expire); peer->host_dynamic = FALSE; srvlookup = v->value; - if (global_dynamic_exclude_static) { - int err = 0; - global_contact_ha = ast_append_ha("deny", (char *)ast_inet_ntoa(peer->addr.sin_addr), global_contact_ha, &err); - if (err) { - ast_log(LOG_ERROR, "Bad ACL entry in configuration line %d : %s\n", v->lineno, v->value); - } - } } } else if (!strcasecmp(v->name, "defaultip")) { if (ast_get_ip(&peer->defaddr, v->value)) { @@ -20457,12 +20414,6 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str peer->ha = ast_append_ha(v->name, v->value, peer->ha, &ha_error); if (ha_error) ast_log(LOG_ERROR, "Bad ACL entry in configuration line %d : %s\n", v->lineno, v->value); - } else if (!strcasecmp(v->name, "contactpermit") || !strcasecmp(v->name, "contactdeny")) { - int ha_error = 0; - peer->contactha = ast_append_ha(v->name + 7, v->value, peer->contactha, &ha_error); - if (ha_error) { - ast_log(LOG_ERROR, "Bad ACL entry in configuration line %d : %s\n", v->lineno, v->value); - } } else if (!strcasecmp(v->name, "port")) { if (!realtime && peer->host_dynamic) peer->defaddr.sin_port = htons(atoi(v->value)); @@ -20754,9 +20705,6 @@ static int reload_config(enum channelreloadreason reason) memset(&sip_tcp_desc.sin, 0, sizeof(sip_tcp_desc.sin)); memset(&sip_tls_desc.sin, 0, sizeof(sip_tls_desc.sin)); - ast_free_ha(global_contact_ha); - global_contact_ha = NULL; - default_tls_cfg.enabled = FALSE; /* Default: Disable TLS */ sip_tcp_desc.sin.sin_port = htons(STANDARD_SIP_PORT); @@ -20991,14 +20939,6 @@ static int reload_config(enum channelreloadreason reason) } else if (!strcasecmp(v->name, "tlsbindaddr")) { if (ast_parse_arg(v->value, PARSE_INADDR, &sip_tls_desc.sin)) ast_log(LOG_WARNING, "Invalid %s '%s' at line %d of %s\n", v->name, v->value, v->lineno, config); - } else if (!strcasecmp(v->name, "dynamic_exclude_static") || !strcasecmp(v->name, "dynamic_excludes_static")) { - global_dynamic_exclude_static = ast_true(v->value); - } else if (!strcasecmp(v->name, "contactpermit") || !strcasecmp(v->name, "contactdeny")) { - int ha_error = 0; - global_contact_ha = ast_append_ha(v->name + 7, v->value, global_contact_ha, &ha_error); - if (ha_error) { - ast_log(LOG_ERROR, "Bad ACL entry in configuration line %d : %s\n", v->lineno, v->value); - } } else if (!strcasecmp(v->name, "rtautoclear")) { int i = atoi(v->value); if (i > 0) diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index f415ad6ca..cf0838eec 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -1845,7 +1845,7 @@ static int transmit_response(struct skinnysession *s, struct skinny_req *req) memcpy(s->outbuf+skinny_header_size, &req->data, letohl(req->len)); res = write(s->fd, s->outbuf, letohl(req->len)+8); - + if (res != letohl(req->len)+8) { ast_log(LOG_WARNING, "Transmit: write only sent %d out of %d bytes: %s\n", res, letohl(req->len)+8, strerror(errno)); if (res == -1) { @@ -1856,7 +1856,6 @@ static int transmit_response(struct skinnysession *s, struct skinny_req *req) } - ast_free(req); ast_mutex_unlock(&s->lock); return 1; } @@ -1954,11 +1953,9 @@ static void transmit_tone(struct skinnysession *s, int tone, int instance, int r req->data.stoptone.reference = htolel(reference); } - //Bad, tone is already set so this is redundant and a change to the if above - //may lead to issues where we try to set a tone to a stop_tone_message - //if (tone > 0) { - // req->data.starttone.tone = htolel(tone); - //} + if (tone > 0) { + req->data.starttone.tone = htolel(tone); + } transmit_response(s, req); } @@ -2022,10 +2019,8 @@ static void transmit_displaymessage(struct skinnysession *s, const char *text, i if (!(req = req_alloc(0, CLEAR_DISPLAY_MESSAGE))) return; - //what do we want hear CLEAR_DISPLAY_MESSAGE or CLEAR_PROMPT_STATUS??? - //if we are clearing the display, it appears there is no instance and refernece info (size 0) - //req->data.clearpromptstatus.lineInstance = instance; - //req->data.clearpromptstatus.callReference = reference; + req->data.clearpromptstatus.lineInstance = instance; + req->data.clearpromptstatus.callReference = reference; if (skinnydebug) ast_debug(1, "Clearing Display\n"); @@ -3449,7 +3444,6 @@ static int skinny_hangup(struct ast_channel *ast) sub->rtp = NULL; } ast_mutex_unlock(&sub->lock); - ast_free(sub); return 0; } diff --git a/channels/iax2-parser.c b/channels/iax2-parser.c index 127e205d4..cdd4bc31f 100644 --- a/channels/iax2-parser.c +++ b/channels/iax2-parser.c @@ -913,21 +913,20 @@ int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen) *tmp2++ = '\0'; else tmp2 = ""; - { - struct ast_str *str = ast_str_create(16); - /* Existing variable or new variable? */ - for (var2 = ies->vars, prev = NULL; var2; prev = var2, var2 = var2->next) { - if (strcmp(tmp, var2->name) == 0) { - ast_str_set(&str, 0, "%s%s", var2->value, tmp2); - var = ast_variable_new(tmp, str->str, var2->file); - var->next = var2->next; - if (prev) - prev->next = var; - else - ies->vars = var; - ast_free(var2); - break; - } + /* Existing variable or new variable? */ + for (var2 = ies->vars, prev = NULL; var2; prev = var2, var2 = var2->next) { + if (strcmp(tmp, var2->name) == 0) { + int len = strlen(var2->value) + strlen(tmp2) + 1; + char *tmp3 = alloca(len); + snprintf(tmp3, len, "%s%s", var2->value, tmp2); + var = ast_variable_new(tmp, tmp3, var2->file); + var->next = var2->next; + if (prev) + prev->next = var; + else + ies->vars = var; + ast_free(var2); + break; } } if (!var2) { |