aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authormurf <murf@f38db490-d61c-443f-a65b-d21fe96a405b>2006-11-07 23:46:41 +0000
committermurf <murf@f38db490-d61c-443f-a65b-d21fe96a405b>2006-11-07 23:46:41 +0000
commitc25499d6c75ea145820465178ef982d256432bc6 (patch)
treede5d3b24e69a5cd86813ecf37bdeb5c9f87059a9 /channels
parentb3c737f0114f072f2c01eab99cfd6265fd6a1264 (diff)
These mods are to solve the problem in bug 7506. It's a lot of rework to solve a fairly small problem... such is life.
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@47303 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_agent.c10
-rw-r--r--channels/chan_alsa.c4
-rw-r--r--channels/chan_features.c24
-rw-r--r--channels/chan_gtalk.c19
-rw-r--r--channels/chan_h323.c32
-rw-r--r--channels/chan_iax2.c10
-rw-r--r--channels/chan_local.c9
-rw-r--r--channels/chan_mgcp.c5
-rw-r--r--channels/chan_misdn.c20
-rw-r--r--channels/chan_nbs.c4
-rw-r--r--channels/chan_oss.c10
-rw-r--r--channels/chan_phone.c5
-rw-r--r--channels/chan_sip.c38
-rw-r--r--channels/chan_skinny.c6
-rw-r--r--channels/chan_vpb.cc5
-rw-r--r--channels/chan_zap.c47
16 files changed, 126 insertions, 122 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c
index 23ef874f1..4d614e945 100644
--- a/channels/chan_agent.c
+++ b/channels/chan_agent.c
@@ -910,7 +910,10 @@ static struct ast_channel *agent_new(struct agent_pvt *p, int state)
return NULL;
}
#endif
- tmp = ast_channel_alloc(0);
+ if (p->pending)
+ tmp = ast_channel_alloc(0, state, 0, 0, "Agent/P%s-%d", p->agent, ast_random() & 0xffff);
+ else
+ tmp = ast_channel_alloc(0, state, 0, 0, "Agent/%s", p->agent);
if (!tmp) {
ast_log(LOG_WARNING, "Unable to allocate agent channel structure\n");
return NULL;
@@ -934,12 +937,7 @@ static struct ast_channel *agent_new(struct agent_pvt *p, int state)
tmp->readformat = AST_FORMAT_SLINEAR;
tmp->rawreadformat = AST_FORMAT_SLINEAR;
}
- if (p->pending)
- ast_string_field_build(tmp, name, "Agent/P%s-%d", p->agent, ast_random() & 0xffff);
- else
- ast_string_field_build(tmp, name, "Agent/%s", p->agent);
/* Safe, agentlock already held */
- ast_setstate(tmp, state);
tmp->tech_pvt = p;
p->owner = tmp;
/* XXX: this needs fixing */
diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c
index 6d4617a6c..3d819bb32 100644
--- a/channels/chan_alsa.c
+++ b/channels/chan_alsa.c
@@ -783,11 +783,10 @@ static struct ast_channel *alsa_new(struct chan_alsa_pvt *p, int state)
{
struct ast_channel *tmp = NULL;
- if (!(tmp = ast_channel_alloc(1)))
+ if (!(tmp = ast_channel_alloc(1, state, 0, 0, "ALSA/%s", indevname)))
return NULL;
tmp->tech = &alsa_tech;
- ast_string_field_build(tmp, name, "ALSA/%s", indevname);
tmp->fds[0] = readdev;
tmp->nativeformats = AST_FORMAT_SLINEAR;
tmp->readformat = AST_FORMAT_SLINEAR;
@@ -800,7 +799,6 @@ static struct ast_channel *alsa_new(struct chan_alsa_pvt *p, int state)
if (!ast_strlen_zero(language))
ast_string_field_set(tmp, language, language);
p->owner = tmp;
- ast_setstate(tmp, state);
ast_mutex_lock(&usecnt_lock);
usecnt++;
ast_mutex_unlock(&usecnt_lock);
diff --git a/channels/chan_features.c b/channels/chan_features.c
index 4e3d8ec31..b41867fa2 100644
--- a/channels/chan_features.c
+++ b/channels/chan_features.c
@@ -451,6 +451,7 @@ static struct ast_channel *features_new(struct feature_pvt *p, int state, int in
{
struct ast_channel *tmp;
int x,y;
+ char *b2 = 0;
if (!p->subchan) {
ast_log(LOG_WARNING, "Called upon channel with no subchan:(\n");
return NULL;
@@ -459,24 +460,29 @@ static struct ast_channel *features_new(struct feature_pvt *p, int state, int in
ast_log(LOG_WARNING, "Called to put index %d already there!\n", index);
return NULL;
}
- tmp = ast_channel_alloc(0);
- if (!tmp) {
- ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
- return NULL;
- }
- tmp->tech = &features_tech;
+ /* figure out what you want the name to be */
for (x=1;x<4;x++) {
- ast_string_field_build(tmp, name, "Feature/%s/%s-%d", p->tech, p->dest, x);
+ if (b2)
+ free(b2);
+ b2 = ast_safe_string_alloc("Feature/%s/%s-%d", p->tech, p->dest, x);
for (y=0;y<3;y++) {
if (y == index)
continue;
- if (p->subs[y].owner && !strcasecmp(p->subs[y].owner->name, tmp->name))
+ if (p->subs[y].owner && !strcasecmp(p->subs[y].owner->name, b2))
break;
}
if (y >= 3)
break;
}
- ast_setstate(tmp, state);
+ tmp = ast_channel_alloc(0, state, 0,0, b2);
+ /* free up the name, it was copied into the channel name */
+ if (b2)
+ free(b2);
+ if (!tmp) {
+ ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
+ return NULL;
+ }
+ tmp->tech = &features_tech;
tmp->writeformat = p->subchan->writeformat;
tmp->rawwriteformat = p->subchan->rawwriteformat;
tmp->readformat = p->subchan->readformat;
diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c
index a3588a97d..f8284e722 100644
--- a/channels/chan_gtalk.c
+++ b/channels/chan_gtalk.c
@@ -896,8 +896,13 @@ static struct ast_channel *gtalk_new(struct gtalk *client, struct gtalk_pvt *i,
struct ast_channel *tmp;
int fmt;
int what;
+ char *n2;
- tmp = ast_channel_alloc(1);
+ if (title)
+ n2 = title;
+ else
+ n2 = i->us;
+ tmp = ast_channel_alloc(1, state, i->cid_num, i->cid_name, "Gtalk/%s-%04lx", n2, ast_random() & 0xffff);
if (!tmp) {
ast_log(LOG_WARNING, "Unable to allocate Gtalk channel structure!\n");
return NULL;
@@ -916,11 +921,6 @@ static struct ast_channel *gtalk_new(struct gtalk *client, struct gtalk_pvt *i,
tmp->nativeformats = ast_codec_choose(&i->prefs, what, 1) | (i->jointcapability & AST_FORMAT_VIDEO_MASK);
fmt = ast_best_codec(tmp->nativeformats);
- if (title)
- ast_string_field_build(tmp, name, "Gtalk/%s-%04lx", title, ast_random() & 0xffff);
- else
- ast_string_field_build(tmp, name, "Gtalk/%s-%04lx", i->us, ast_random() & 0xffff);
-
if (i->rtp) {
tmp->fds[0] = ast_rtp_fd(i->rtp);
tmp->fds[1] = ast_rtcp_fd(i->rtp);
@@ -955,11 +955,14 @@ static struct ast_channel *gtalk_new(struct gtalk *client, struct gtalk_pvt *i,
ast_mutex_unlock(&usecnt_lock);
ast_copy_string(tmp->context, client->context, sizeof(tmp->context));
ast_copy_string(tmp->exten, i->exten, sizeof(tmp->exten));
- ast_set_callerid(tmp, i->cid_num, i->cid_name, i->cid_num);
+ /* Don't use ast_set_callerid() here because it will
+ * generate a needless NewCallerID event */
+ tmp->cid.cid_num = ast_strdup(l->cid_num);
+ tmp->cid.cid_ani = ast_strdup(l->cid_num);
+ tmp->cid.cid_name = ast_strdup(l->cid_name);
if (!ast_strlen_zero(i->exten) && strcmp(i->exten, "s"))
tmp->cid.cid_dnid = ast_strdup(i->exten);
tmp->priority = 1;
- ast_setstate(tmp, state);
if (i->rtp)
ast_jb_configure(tmp, &global_jbconf);
if (state != AST_STATE_DOWN && ast_pbx_start(tmp)) {
diff --git a/channels/chan_h323.c b/channels/chan_h323.c
index 7163d1aa0..98d82094e 100644
--- a/channels/chan_h323.c
+++ b/channels/chan_h323.c
@@ -998,17 +998,27 @@ static int __oh323_rtp_create(struct oh323_pvt *pvt)
static struct ast_channel *__oh323_new(struct oh323_pvt *pvt, int state, const char *host)
{
struct ast_channel *ch;
+ char *cid_num, *cid_name;
int fmt;
+ if (!ast_strlen_zero(pvt->options.cid_num))
+ cid_num = pvt->options.cid_num;
+ else
+ cid_num = pvt->cd.call_source_e164;
+
+ if (!ast_strlen_zero(pvt->options.cid_name))
+ cid_name = pvt->options.cid_name;
+ else
+ cid_name = pvt->cd.call_source_name;
+
/* Don't hold a oh323_pvt lock while we allocate a chanel */
ast_mutex_unlock(&pvt->lock);
- ch = ast_channel_alloc(1);
+ ch = ast_channel_alloc(1, state, cid_num, cid_name, "H323/%s", host);
/* Update usage counter */
ast_module_ref(ast_module_info->self);
ast_mutex_lock(&pvt->lock);
if (ch) {
ch->tech = &oh323_tech;
- ast_string_field_build(ch, name, "H323/%s", host);
if (!(fmt = pvt->jointcapability) && !(fmt = pvt->options.capability))
fmt = global_options.capability;
ch->nativeformats = ast_codec_choose(&pvt->options.prefs, fmt, 1)/* | (pvt->jointcapability & AST_FORMAT_VIDEO_MASK)*/;
@@ -1057,18 +1067,11 @@ static struct ast_channel *__oh323_new(struct oh323_pvt *pvt, int state, const c
}
/* Don't use ast_set_callerid() here because it will
- * generate a NewCallerID event before the NewChannel event */
- if (!ast_strlen_zero(pvt->options.cid_num)) {
- ch->cid.cid_num = ast_strdup(pvt->options.cid_num);
- ch->cid.cid_ani = ast_strdup(pvt->options.cid_num);
- } else {
- ch->cid.cid_num = ast_strdup(pvt->cd.call_source_e164);
- ch->cid.cid_ani = ast_strdup(pvt->cd.call_source_e164);
- }
- if (!ast_strlen_zero(pvt->options.cid_name))
- ch->cid.cid_name = ast_strdup(pvt->options.cid_name);
- else
- ch->cid.cid_name = ast_strdup(pvt->cd.call_source_name);
+ * generate a needless NewCallerID event */
+ ch->cid.cid_num = ast_strdup(cid_num);
+ ch->cid.cid_ani = ast_strdup(cid_num);
+ ch->cid.cid_name = ast_strdup(cid_name);
+
if (pvt->cd.redirect_reason >= 0) {
ch->cid.cid_rdnis = ast_strdup(pvt->cd.redirect_number);
pbx_builtin_setvar_helper(ch, "PRIREDIRECTREASON", redirectingreason2str(pvt->cd.redirect_reason));
@@ -1081,7 +1084,6 @@ static struct ast_channel *__oh323_new(struct oh323_pvt *pvt, int state, const c
}
if (pvt->cd.transfer_capability >= 0)
ch->transfercapability = pvt->cd.transfer_capability;
- ast_setstate(ch, state);
if (state != AST_STATE_DOWN) {
if (ast_pbx_start(ch)) {
ast_log(LOG_WARNING, "Unable to start PBX on %s\n", ch->name);
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 5bb88d9b2..dee7f84a1 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -3231,12 +3231,11 @@ static struct ast_channel *ast_iax2_new(int callno, int state, int capability)
/* Don't hold call lock */
ast_mutex_unlock(&iaxsl[callno]);
- tmp = ast_channel_alloc(1);
+ tmp = ast_channel_alloc(1, state, i->cid_num, i->cid_name, "IAX2/%s-%d", i->host, i->callno);
ast_mutex_lock(&iaxsl[callno]);
if (!tmp)
return NULL;
tmp->tech = &iax2_tech;
- ast_string_field_build(tmp, name, "IAX2/%s-%d", i->host, i->callno);
/* We can support any format by default, until we get restricted */
tmp->nativeformats = capability;
tmp->readformat = ast_best_codec(capability);
@@ -3270,7 +3269,6 @@ static struct ast_channel *ast_iax2_new(int callno, int state, int capability)
tmp->adsicpe = AST_ADSI_UNAVAILABLE;
i->owner = tmp;
i->capability = capability;
- ast_setstate(tmp, state);
if (state != AST_STATE_DOWN) {
if (ast_pbx_start(tmp)) {
ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
@@ -6072,10 +6070,9 @@ static int iax_park(struct ast_channel *chan1, struct ast_channel *chan2)
struct iax_dual *d;
struct ast_channel *chan1m, *chan2m;
pthread_t th;
- chan1m = ast_channel_alloc(0);
- chan2m = ast_channel_alloc(0);
+ chan1m = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, "Parking/%s", chan1->name);
+ chan2m = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, "IAXPeer/%s",chan2->name);
if (chan2m && chan1m) {
- ast_string_field_build(chan1m, name, "Parking/%s", chan1->name);
/* Make formats okay */
chan1m->readformat = chan1->readformat;
chan1m->writeformat = chan1->writeformat;
@@ -6087,7 +6084,6 @@ static int iax_park(struct ast_channel *chan1, struct ast_channel *chan2)
/* We make a clone of the peer channel too, so we can play
back the announcement */
- ast_string_field_build(chan2m, name, "IAXPeer/%s",chan2->name);
/* Make formats okay */
chan2m->readformat = chan2->readformat;
chan2m->writeformat = chan2->writeformat;
diff --git a/channels/chan_local.c b/channels/chan_local.c
index db6081a53..fe821363d 100644
--- a/channels/chan_local.c
+++ b/channels/chan_local.c
@@ -549,7 +549,8 @@ static struct ast_channel *local_new(struct local_pvt *p, int state)
int randnum = ast_random() & 0xffff, fmt = 0;
/* Allocate two new Asterisk channels */
- if (!(tmp = ast_channel_alloc(1)) || !(tmp2 = ast_channel_alloc(1))) {
+ if (!(tmp = ast_channel_alloc(1, state, 0, 0, "Local/%s@%s-%04x,1", p->exten, p->context, randnum))
+ || !(tmp2 = ast_channel_alloc(1, AST_STATE_RING, 0, 0, "Local/%s@%s-%04x,2", p->exten, p->context, randnum))) {
if (tmp)
ast_channel_free(tmp);
if (tmp2)
@@ -563,12 +564,6 @@ static struct ast_channel *local_new(struct local_pvt *p, int state)
tmp->nativeformats = p->reqformat;
tmp2->nativeformats = p->reqformat;
- ast_string_field_build(tmp, name, "Local/%s@%s-%04x,1", p->exten, p->context, randnum);
- ast_string_field_build(tmp2, name, "Local/%s@%s-%04x,2", p->exten, p->context, randnum);
-
- ast_setstate(tmp, state);
- ast_setstate(tmp2, AST_STATE_RING);
-
/* Determine our read/write format and set it on each channel */
fmt = ast_best_codec(p->reqformat);
tmp->writeformat = fmt;
diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c
index 9c7c26e13..3ff791a6f 100644
--- a/channels/chan_mgcp.c
+++ b/channels/chan_mgcp.c
@@ -1427,7 +1427,7 @@ static struct ast_channel *mgcp_new(struct mgcp_subchannel *sub, int state)
struct mgcp_endpoint *i = sub->parent;
int fmt;
- tmp = ast_channel_alloc(1);
+ tmp = ast_channel_alloc(1, state, i->cid_num, i->cid_name, "MGCP/%s@%s-%d", i->name, i->parent->name, sub->id);
if (tmp) {
tmp->tech = &mgcp_tech;
tmp->nativeformats = i->capability;
@@ -1445,7 +1445,6 @@ static struct ast_channel *mgcp_new(struct mgcp_subchannel *sub, int state)
} else {
i->dsp = NULL;
}
- ast_setstate(tmp, state);
if (state == AST_STATE_RING)
tmp->rings = 1;
tmp->writeformat = fmt;
@@ -1468,7 +1467,7 @@ static struct ast_channel *mgcp_new(struct mgcp_subchannel *sub, int state)
ast_copy_string(tmp->exten, i->exten, sizeof(tmp->exten));
/* Don't use ast_set_callerid() here because it will
- * generate a NewCallerID event before the NewChannel event */
+ * generate a needless NewCallerID event */
tmp->cid.cid_num = ast_strdup(i->cid_num);
tmp->cid.cid_ani = ast_strdup(i->cid_num);
tmp->cid.cid_name = ast_strdup(i->cid_name);
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index a8fef6ca0..139435866 100644
--- a/channels/chan_misdn.c
+++ b/channels/chan_misdn.c
@@ -3097,14 +3097,25 @@ static void update_name(struct ast_channel *tmp, int port, int c)
static struct ast_channel *misdn_new(struct chan_list *chlist, int state, char *exten, char *callerid, int format, int port, int c)
{
struct ast_channel *tmp;
+ char *cid_name = 0, *cid_num = 0;
+ int chan_offset=0;
+ int tmp_port = misdn_cfg_get_next_port(0);
+
+ for (; tmp_port > 0; tmp_port=misdn_cfg_get_next_port(tmp_port)) {
+ if (tmp_port == port) break;
+ chan_offset+=misdn_lib_port_is_pri(tmp_port)?30:2;
+ }
+ if (c<0) c=0;
+
- tmp = ast_channel_alloc(1);
+ if (callerid)
+ ast_callerid_parse(callerid, &cid_name, &cid_num);
+
+ tmp = ast_channel_alloc(1, state, cid_num, cid_name, "%s/%d-u%d", misdn_type, chan_offset + c, glob_channel++);
if (tmp) {
chan_misdn_log(2, 0, " --> * NEW CHANNEL dad:%s oad:%s\n",exten,callerid);
- update_name(tmp,port,c);
-
tmp->nativeformats = prefformat;
tmp->readformat = format;
@@ -3135,7 +3146,7 @@ static struct ast_channel *misdn_new(struct chan_list *chlist, int state, char
ast_callerid_parse(callerid, &cid_name, &cid_num);
/* Don't use ast_set_callerid() here because it will
- * generate a NewCallerID event before the NewChannel event */
+ * generate a needless NewCallerID event */
tmp->cid.cid_num = ast_strdup(cid_num);
tmp->cid.cid_ani = ast_strdup(cid_num);
tmp->cid.cid_name = ast_strdup(cid_name);
@@ -3149,7 +3160,6 @@ static struct ast_channel *misdn_new(struct chan_list *chlist, int state, char
}
- ast_setstate(tmp, state);
if (state == AST_STATE_RING)
tmp->rings = 1;
else
diff --git a/channels/chan_nbs.c b/channels/chan_nbs.c
index 6b06529d6..6d4c955e3 100644
--- a/channels/chan_nbs.c
+++ b/channels/chan_nbs.c
@@ -232,17 +232,15 @@ static int nbs_xwrite(struct ast_channel *ast, struct ast_frame *frame)
static struct ast_channel *nbs_new(struct nbs_pvt *i, int state)
{
struct ast_channel *tmp;
- tmp = ast_channel_alloc(1);
+ tmp = ast_channel_alloc(1, state, 0, 0, "NBS/%s", i->stream);
if (tmp) {
tmp->tech = &nbs_tech;
- ast_string_field_build(tmp, name, "NBS/%s", i->stream);
tmp->fds[0] = nbs_fd(i->nbs);
tmp->nativeformats = prefformat;
tmp->rawreadformat = prefformat;
tmp->rawwriteformat = prefformat;
tmp->writeformat = prefformat;
tmp->readformat = prefformat;
- ast_setstate(tmp, state);
if (state == AST_STATE_RING)
tmp->rings = 1;
tmp->tech_pvt = i;
diff --git a/channels/chan_oss.c b/channels/chan_oss.c
index 02ba5ad7e..b431f8288 100644
--- a/channels/chan_oss.c
+++ b/channels/chan_oss.c
@@ -997,11 +997,10 @@ static struct ast_channel *oss_new(struct chan_oss_pvt *o, char *ext, char *ctx,
{
struct ast_channel *c;
- c = ast_channel_alloc(1);
+ c = ast_channel_alloc(1, state, o->cid_num, o->cid_name, "OSS/%s", o->device + 5);
if (c == NULL)
return NULL;
c->tech = &oss_tech;
- ast_string_field_build(c, name, "OSS/%s", o->device + 5);
if (o->sounddev < 0)
setformat(o, O_RDWR);
c->fds[0] = o->sounddev; /* -1 if device closed, override later */
@@ -1016,12 +1015,15 @@ static struct ast_channel *oss_new(struct chan_oss_pvt *o, char *ext, char *ctx,
ast_copy_string(c->exten, ext, sizeof(c->exten));
if (!ast_strlen_zero(o->language))
ast_string_field_set(c, language, o->language);
- ast_set_callerid(c, o->cid_num, o->cid_name, o->cid_num);
+ /* Don't use ast_set_callerid() here because it will
+ * generate a needless NewCallerID event */
+ c->cid.cid_num = ast_strdup(o->cid_num);
+ c->cid.cid_ani = ast_strdup(o->cid_num);
+ c->cid.cid_name = ast_strdup(o->cid_name);
if (!ast_strlen_zero(ext))
c->cid.cid_dnid = ast_strdup(ext);
o->owner = c;
- ast_setstate(c, state);
ast_mutex_lock(&usecnt_lock);
usecnt++;
ast_mutex_unlock(&usecnt_lock);
diff --git a/channels/chan_phone.c b/channels/chan_phone.c
index 91854b7ad..73c97386c 100644
--- a/channels/chan_phone.c
+++ b/channels/chan_phone.c
@@ -837,10 +837,9 @@ static struct ast_channel *phone_new(struct phone_pvt *i, int state, char *conte
{
struct ast_channel *tmp;
struct phone_codec_data codec;
- tmp = ast_channel_alloc(1);
+ tmp = ast_channel_alloc(1, state, i->cid_num, i->cid_name, "Phone/%s", i->dev + 5);
if (tmp) {
tmp->tech = cur_tech;
- ast_string_field_build(tmp, name, "Phone/%s", i->dev + 5);
tmp->fds[0] = i->fd;
/* XXX Switching formats silently causes kernel panics XXX */
if (i->mode == MODE_FXS &&
@@ -862,7 +861,7 @@ static struct ast_channel *phone_new(struct phone_pvt *i, int state, char *conte
tmp->rawreadformat = prefformat;
tmp->rawwriteformat = prefformat;
}
- ast_setstate(tmp, state);
+ /* no need to call ast_setstate: the channel_alloc already did its job */
if (state == AST_STATE_RING)
tmp->rings = 1;
tmp->tech_pvt = i;
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 9b744f076..bbcb91829 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -3686,10 +3686,21 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
int fmt;
int what;
int needvideo = 0;
-
- ast_mutex_unlock(&i->lock);
- /* Don't hold a sip pvt lock while we allocate a channel */
- tmp = ast_channel_alloc(1);
+ {
+ const char *my_name; /* pick a good name */
+
+ if (title)
+ my_name = title;
+ else if ( (my_name = strchr(i->fromdomain,':')) )
+ my_name++; /* skip ':' */
+ else
+ my_name = i->fromdomain;
+
+ ast_mutex_unlock(&i->lock);
+ /* Don't hold a sip pvt lock while we allocate a channel */
+ tmp = ast_channel_alloc(1, state, i->cid_num, i->cid_name, "SIP/%s-%08x", my_name, (int)(long) i);
+
+ }
ast_mutex_lock(&i->lock);
if (!tmp) {
ast_log(LOG_WARNING, "Unable to allocate AST channel structure for SIP channel\n");
@@ -3740,16 +3751,6 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
}
- {
- const char *my_name; /* pick a good name */
- if (title)
- my_name = title;
- else if ( (my_name = strchr(i->fromdomain,':')) )
- my_name++; /* skip ':' */
- else
- my_name = i->fromdomain;
- ast_string_field_build(tmp, name, "SIP/%s-%08x", my_name, (int)(long) i);
- }
if (ast_test_flag(&i->flags[0], SIP_DTMF) == SIP_DTMF_INBAND) {
i->vad = ast_dsp_new();
@@ -3793,7 +3794,7 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
ast_copy_string(tmp->exten, i->exten, sizeof(tmp->exten));
/* Don't use ast_set_callerid() here because it will
- * generate a NewCallerID event before the NewChannel event */
+ * generate an unnecessary NewCallerID event */
tmp->cid.cid_num = ast_strdup(i->cid_num);
tmp->cid.cid_ani = ast_strdup(i->cid_num);
tmp->cid.cid_name = ast_strdup(i->cid_name);
@@ -3812,7 +3813,6 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
pbx_builtin_setvar_helper(tmp, "SIPUSERAGENT", i->useragent);
if (!ast_strlen_zero(i->callid))
pbx_builtin_setvar_helper(tmp, "SIPCALLID", i->callid);
- ast_setstate(tmp, state);
if (i->rtp)
ast_jb_configure(tmp, &global_jbconf);
if (state != AST_STATE_DOWN && ast_pbx_start(tmp)) {
@@ -12316,8 +12316,8 @@ static int sip_park(struct ast_channel *chan1, struct ast_channel *chan2, struct
/* Chan2m: The transferer, chan1m: The transferee */
pthread_t th;
- transferee = ast_channel_alloc(0);
- transferer = ast_channel_alloc(0);
+ transferee = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, "Parking/%s", chan1->name);
+ transferer = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, "SIPPeer/%s", chan2->name);
if ((!transferer) || (!transferee)) {
if (transferee) {
transferee->hangupcause = AST_CAUSE_SWITCH_CONGESTION;
@@ -12329,7 +12329,6 @@ static int sip_park(struct ast_channel *chan1, struct ast_channel *chan2, struct
}
return -1;
}
- ast_string_field_build(transferee, name, "Parking/%s", chan1->name);
/* Make formats okay */
transferee->readformat = chan1->readformat;
@@ -12345,7 +12344,6 @@ static int sip_park(struct ast_channel *chan1, struct ast_channel *chan2, struct
/* We make a clone of the peer channel too, so we can play
back the announcement */
- ast_string_field_build(transferer, name, "SIPPeer/%s", chan2->name);
/* Make formats okay */
transferer->readformat = chan2->readformat;
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c
index 2fb6d1203..599101286 100644
--- a/channels/chan_skinny.c
+++ b/channels/chan_skinny.c
@@ -2700,7 +2700,7 @@ static struct ast_channel *skinny_new(struct skinny_line *l, int state)
struct skinny_device *d = l->parent;
int fmt;
- tmp = ast_channel_alloc(1);
+ tmp = ast_channel_alloc(1, state, l->cid_num, l->cid_name, "Skinny/%s@%s-%d", l->name, d->name, callnums);
if (!tmp) {
ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
return NULL;
@@ -2732,11 +2732,9 @@ static struct ast_channel *skinny_new(struct skinny_line *l, int state)
fmt = ast_best_codec(tmp->nativeformats);
if (skinnydebug)
ast_verbose("skinny_new: tmp->nativeformats=%d fmt=%d\n", tmp->nativeformats, fmt);
- ast_string_field_build(tmp, name, "Skinny/%s@%s-%d", l->name, d->name, sub->callid);
if (sub->rtp) {
tmp->fds[0] = ast_rtp_fd(sub->rtp);
}
- ast_setstate(tmp, state);
if (state == AST_STATE_RING) {
tmp->rings = 1;
}
@@ -2762,7 +2760,7 @@ static struct ast_channel *skinny_new(struct skinny_line *l, int state)
ast_copy_string(tmp->exten, l->exten, sizeof(tmp->exten));
/* Don't use ast_set_callerid() here because it will
- * generate a NewCallerID event before the NewChannel event */
+ * generate a needless NewCallerID event */
tmp->cid.cid_num = ast_strdup(l->cid_num);
tmp->cid.cid_ani = ast_strdup(l->cid_num);
tmp->cid.cid_name = ast_strdup(l->cid_name);
diff --git a/channels/chan_vpb.cc b/channels/chan_vpb.cc
index 3d9707a77..1fe026e05 100644
--- a/channels/chan_vpb.cc
+++ b/channels/chan_vpb.cc
@@ -2634,7 +2634,7 @@ static struct ast_channel *vpb_new(struct vpb_pvt *me, enum ast_channel_state st
if (option_verbose > 3)
ast_verbose("%s: New call for context [%s]\n",me->dev,context);
- tmp = ast_channel_alloc(1);
+ tmp = ast_channel_alloc(1, state, 0, 0, me->dev);
if (tmp) {
if (use_ast_ind == 1){
tmp->tech = &vpb_tech_indicate;
@@ -2643,8 +2643,6 @@ static struct ast_channel *vpb_new(struct vpb_pvt *me, enum ast_channel_state st
tmp->tech = &vpb_tech;
}
- ast_string_field_set(tmp, name, me->dev);
-
tmp->callgroup = me->callgroup;
tmp->pickupgroup = me->pickupgroup;
@@ -2655,7 +2653,6 @@ static struct ast_channel *vpb_new(struct vpb_pvt *me, enum ast_channel_state st
tmp->nativeformats = prefformat;
tmp->rawreadformat = AST_FORMAT_SLINEAR;
tmp->rawwriteformat = AST_FORMAT_SLINEAR;
- ast_setstate(tmp, state);
if (state == AST_STATE_RING) {
tmp->rings = 1;
cid_name[0] = '\0';
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index 7ee774656..9ab10e593 100644
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -5160,12 +5160,35 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int
int res;
int x,y;
int features;
+ char *b2 = 0;
ZT_PARAMS ps;
if (i->subs[index].owner) {
ast_log(LOG_WARNING, "Channel %d already has a %s call\n", i->channel,subnames[index]);
return NULL;
}
- if (!(tmp = ast_channel_alloc(0)))
+ y = 1;
+ do {
+ if (b2)
+ free(b2);
+#ifdef HAVE_PRI
+ if (i->bearer || (i->pri && (i->sig == SIG_FXSKS)))
+ b2 = ast_safe_string_alloc("Zap/%d:%d-%d", i->pri->trunkgroup, i->channel, y);
+ else
+#endif
+ if (i->channel == CHAN_PSEUDO)
+ b2 = ast_safe_string_alloc("Zap/pseudo-%d", ast_random());
+ else
+ b2 = ast_safe_string_alloc("Zap/%d-%d", i->channel, y);
+ for (x = 0; x < 3; x++) {
+ if ((index != x) && i->subs[x].owner && !strcasecmp(b2, i->subs[x].owner->name))
+ break;
+ }
+ y++;
+ } while (x < 3);
+ tmp = ast_channel_alloc(0, state, 0, 0, b2);
+ if (b2) /*!> b2 can be freed now, it's been copied into the channel structure */
+ free(b2);
+ if (!tmp)
return NULL;
tmp->tech = &zap_tech;
ps.channo = i->channel;
@@ -5184,23 +5207,6 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int
else
deflaw = AST_FORMAT_ULAW;
}
- y = 1;
- do {
-#ifdef HAVE_PRI
- if (i->bearer || (i->pri && (i->sig == SIG_FXSKS)))
- ast_string_field_build(tmp, name, "Zap/%d:%d-%d", i->pri->trunkgroup, i->channel, y);
- else
-#endif
- if (i->channel == CHAN_PSEUDO)
- ast_string_field_build(tmp, name, "Zap/pseudo-%d", ast_random());
- else
- ast_string_field_build(tmp, name, "Zap/%d-%d", i->channel, y);
- for (x = 0; x < 3; x++) {
- if ((index != x) && i->subs[x].owner && !strcasecmp(tmp->name, i->subs[x].owner->name))
- break;
- }
- y++;
- } while (x < 3);
tmp->fds[0] = i->subs[index].zfd;
tmp->nativeformats = AST_FORMAT_SLINEAR | deflaw;
/* Start out assuming ulaw since it's smaller :) */
@@ -5290,9 +5296,9 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int
if (!ast_strlen_zero(i->dnid))
tmp->cid.cid_dnid = ast_strdup(i->dnid);
-#ifdef PRI_ANI
/* Don't use ast_set_callerid() here because it will
- * generate a NewCallerID event before the NewChannel event */
+ * generate a needless NewCallerID event */
+#ifdef PRI_ANI
tmp->cid.cid_num = ast_strdup(i->cid_num);
tmp->cid.cid_name = ast_strdup(i->cid_name);
if (!ast_strlen_zero(i->cid_ani))
@@ -5319,7 +5325,6 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int
i->fake_event = 0;
/* Assure there is no confmute on this channel */
zt_confmute(i, 0);
- ast_setstate(tmp, state);
/* Configure the new channel jb */
ast_jb_configure(tmp, &global_jbconf);
if (startpbx) {