aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-10-01 21:18:14 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-10-01 21:18:14 +0000
commitcd372e32c76de742d9268f9cfc27fe47cfdd3e6a (patch)
tree9a6238e1a10bfecdf9204528fb9d3dd01c4a10d3 /channels
parent23d4b6f29c5684ecd10e8ebcb3da3a0534a12d7d (diff)
parent85bbd1354ca1a7d5d9c028fb7f2223b279696fe5 (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.c5
-rw-r--r--channels/chan_iax2.c99
-rw-r--r--channels/chan_local.c4
-rw-r--r--channels/chan_oss.c2
-rw-r--r--channels/chan_sip.c82
-rw-r--r--channels/chan_skinny.c18
-rw-r--r--channels/iax2-parser.c29
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) {