[svn-commits] murf: branch 1.4 r47303 - in /branches/1.4: apps/ channels/ include/asterisk/...

svn-commits at lists.digium.com svn-commits at lists.digium.com
Tue Nov 7 16:46:42 MST 2006


Author: murf
Date: Tue Nov  7 17:46:41 2006
New Revision: 47303

URL: http://svn.digium.com/view/asterisk?rev=47303&view=rev
Log:
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.

Modified:
    branches/1.4/apps/app_voicemail.c
    branches/1.4/channels/chan_agent.c
    branches/1.4/channels/chan_alsa.c
    branches/1.4/channels/chan_features.c
    branches/1.4/channels/chan_gtalk.c
    branches/1.4/channels/chan_h323.c
    branches/1.4/channels/chan_iax2.c
    branches/1.4/channels/chan_local.c
    branches/1.4/channels/chan_mgcp.c
    branches/1.4/channels/chan_misdn.c
    branches/1.4/channels/chan_nbs.c
    branches/1.4/channels/chan_oss.c
    branches/1.4/channels/chan_phone.c
    branches/1.4/channels/chan_sip.c
    branches/1.4/channels/chan_skinny.c
    branches/1.4/channels/chan_vpb.cc
    branches/1.4/channels/chan_zap.c
    branches/1.4/include/asterisk/channel.h
    branches/1.4/include/asterisk/stringfields.h
    branches/1.4/main/channel.c
    branches/1.4/main/pbx.c
    branches/1.4/main/utils.c
    branches/1.4/res/res_features.c

Modified: branches/1.4/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/apps/app_voicemail.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/apps/app_voicemail.c (original)
+++ branches/1.4/apps/app_voicemail.c Tue Nov  7 17:46:41 2006
@@ -1867,7 +1867,7 @@
 
 	if (*fromstring) {
 		struct ast_channel *ast;
-		if ((ast = ast_channel_alloc(0))) {
+		if ((ast = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, 0))) {
 			char *passdata;
 			int vmlen = strlen(fromstring)*3 + 200;
 			if ((passdata = alloca(vmlen))) {
@@ -1885,7 +1885,7 @@
 	fprintf(p, "To: %s <%s>\r\n", vmu->fullname, vmu->email);
 	if (emailsubject) {
 		struct ast_channel *ast;
-		if ((ast = ast_channel_alloc(0))) {
+		if ((ast = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, 0))) {
 			char *passdata;
 			int vmlen = strlen(emailsubject)*3 + 200;
 			if ((passdata = alloca(vmlen))) {
@@ -1939,7 +1939,7 @@
 	fprintf(p, "Content-Type: text/plain; charset=%s\r\nContent-Transfer-Encoding: 8bit\r\n\r\n", charset);
 	if (emailbody) {
 		struct ast_channel *ast;
-		if ((ast = ast_channel_alloc(0))) {
+		if ((ast = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, 0))) {
 			char *passdata;
 			int vmlen = strlen(emailbody)*3 + 200;
 			if ((passdata = alloca(vmlen))) {
@@ -2053,7 +2053,7 @@
 
 		if (*pagerfromstring) {
 			struct ast_channel *ast;
-			if ((ast = ast_channel_alloc(0))) {
+			if ((ast = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, 0))) {
 				char *passdata;
 				int vmlen = strlen(fromstring)*3 + 200;
 				if ((passdata = alloca(vmlen))) {
@@ -2070,7 +2070,7 @@
 		fprintf(p, "To: %s\n", pager);
 		if (pagersubject) {
 			struct ast_channel *ast;
-			if ((ast = ast_channel_alloc(0))) {
+			if ((ast = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, 0))) {
 				char *passdata;
 				int vmlen = strlen(pagersubject) * 3 + 200;
 				if ((passdata = alloca(vmlen))) {
@@ -2086,7 +2086,7 @@
 		strftime(date, sizeof(date), "%A, %B %d, %Y at %r", &tm);
 		if (pagerbody) {
 			struct ast_channel *ast;
-			if ((ast = ast_channel_alloc(0))) {
+			if ((ast = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, 0))) {
 				char *passdata;
 				int vmlen = strlen(pagerbody)*3 + 200;
 				if ((passdata = alloca(vmlen))) {

Modified: branches/1.4/channels/chan_agent.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_agent.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_agent.c (original)
+++ branches/1.4/channels/chan_agent.c Tue Nov  7 17:46:41 2006
@@ -910,7 +910,10 @@
 		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 @@
 		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 */

Modified: branches/1.4/channels/chan_alsa.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_alsa.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_alsa.c (original)
+++ branches/1.4/channels/chan_alsa.c Tue Nov  7 17:46:41 2006
@@ -783,11 +783,10 @@
 {
 	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 @@
 	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);

Modified: branches/1.4/channels/chan_features.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_features.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_features.c (original)
+++ branches/1.4/channels/chan_features.c Tue Nov  7 17:46:41 2006
@@ -451,6 +451,7 @@
 {
 	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 @@
 		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;

Modified: branches/1.4/channels/chan_gtalk.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_gtalk.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_gtalk.c (original)
+++ branches/1.4/channels/chan_gtalk.c Tue Nov  7 17:46:41 2006
@@ -896,8 +896,13 @@
 	struct ast_channel *tmp;
 	int fmt;
 	int what;
-
-	tmp = ast_channel_alloc(1);
+	char *n2;
+
+	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;
@@ -915,11 +920,6 @@
 		what = global_capability;
 	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);
@@ -955,11 +955,14 @@
 	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)) {

Modified: branches/1.4/channels/chan_h323.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_h323.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_h323.c (original)
+++ branches/1.4/channels/chan_h323.c Tue Nov  7 17:46:41 2006
@@ -998,17 +998,27 @@
 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 @@
 		}
 
 		/* 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 @@
 		}
 		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);

Modified: branches/1.4/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_iax2.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_iax2.c (original)
+++ branches/1.4/channels/chan_iax2.c Tue Nov  7 17:46:41 2006
@@ -3231,12 +3231,11 @@
 
 	/* 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 @@
 		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 @@
 	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 @@
 		
 		/* 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;

Modified: branches/1.4/channels/chan_local.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_local.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_local.c (original)
+++ branches/1.4/channels/chan_local.c Tue Nov  7 17:46:41 2006
@@ -549,7 +549,8 @@
 	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)
@@ -562,12 +563,6 @@
 
 	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);

Modified: branches/1.4/channels/chan_mgcp.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_mgcp.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_mgcp.c (original)
+++ branches/1.4/channels/chan_mgcp.c Tue Nov  7 17:46:41 2006
@@ -1427,7 +1427,7 @@
 	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 @@
 		} else {
 			i->dsp = NULL;
 		}
-		ast_setstate(tmp, state);
 		if (state == AST_STATE_RING)
 			tmp->rings = 1;
 		tmp->writeformat = fmt;
@@ -1468,7 +1467,7 @@
 		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);

Modified: branches/1.4/channels/chan_misdn.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_misdn.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_misdn.c (original)
+++ branches/1.4/channels/chan_misdn.c Tue Nov  7 17:46:41 2006
@@ -3097,14 +3097,25 @@
 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;
-	
-	tmp = ast_channel_alloc(1);
+	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;
+
+	
+	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 @@
       
 			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 @@
 			
 		}
 		
-		ast_setstate(tmp, state);
 		if (state == AST_STATE_RING)
 			tmp->rings = 1;
 		else

Modified: branches/1.4/channels/chan_nbs.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_nbs.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_nbs.c (original)
+++ branches/1.4/channels/chan_nbs.c Tue Nov  7 17:46:41 2006
@@ -232,17 +232,15 @@
 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;

Modified: branches/1.4/channels/chan_oss.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_oss.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_oss.c (original)
+++ branches/1.4/channels/chan_oss.c Tue Nov  7 17:46:41 2006
@@ -997,11 +997,10 @@
 {
 	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 @@
 		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);

Modified: branches/1.4/channels/chan_phone.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_phone.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_phone.c (original)
+++ branches/1.4/channels/chan_phone.c Tue Nov  7 17:46:41 2006
@@ -837,10 +837,9 @@
 {
 	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 @@
 			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;

Modified: branches/1.4/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_sip.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_sip.c (original)
+++ branches/1.4/channels/chan_sip.c Tue Nov  7 17:46:41 2006
@@ -3686,10 +3686,21 @@
 	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 @@
 	}
 
 
-	{
-		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 @@
 	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 @@
 		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 @@
 		/* 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 @@
 		}
 		return -1;
 	}
-	ast_string_field_build(transferee, name,  "Parking/%s", chan1->name);
 
 	/* Make formats okay */
 	transferee->readformat = chan1->readformat;
@@ -12345,7 +12344,6 @@
 		
 	/* 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;

Modified: branches/1.4/channels/chan_skinny.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_skinny.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_skinny.c (original)
+++ branches/1.4/channels/chan_skinny.c Tue Nov  7 17:46:41 2006
@@ -2700,7 +2700,7 @@
 	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 @@
 		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 @@
 		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);

Modified: branches/1.4/channels/chan_vpb.cc
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_vpb.cc?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_vpb.cc (original)
+++ branches/1.4/channels/chan_vpb.cc Tue Nov  7 17:46:41 2006
@@ -2634,7 +2634,7 @@
 	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 @@
 			tmp->tech = &vpb_tech;
 		}
 
-		ast_string_field_set(tmp, name, me->dev);
-		
 		tmp->callgroup = me->callgroup;
 		tmp->pickupgroup = me->pickupgroup;
 	       
@@ -2655,7 +2653,6 @@
 		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';

Modified: branches/1.4/channels/chan_zap.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_zap.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/channels/chan_zap.c (original)
+++ branches/1.4/channels/chan_zap.c Tue Nov  7 17:46:41 2006
@@ -5160,12 +5160,35 @@
 	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 @@
 		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 @@
 	if (!ast_strlen_zero(i->dnid))
 		tmp->cid.cid_dnid = ast_strdup(i->dnid);
 
+	/* Don't use ast_set_callerid() here because it will
+	 * generate a needless NewCallerID event */
 #ifdef PRI_ANI
-	/* Don't use ast_set_callerid() here because it will
-	 * generate a NewCallerID event before the NewChannel event */
 	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 @@
 	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) {

Modified: branches/1.4/include/asterisk/channel.h
URL: http://svn.digium.com/view/asterisk/branches/1.4/include/asterisk/channel.h?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/include/asterisk/channel.h (original)
+++ branches/1.4/include/asterisk/channel.h Tue Nov  7 17:46:41 2006
@@ -576,7 +576,7 @@
 	by default set to the "default" context and
 	extension "s"
  */
-struct ast_channel *ast_channel_alloc(int needalertpipe);
+struct ast_channel *ast_channel_alloc(int needalertpipe, int state, const char *cid_num, const char *cid_name, const char *name_fmt, ...);
 
 /*! \brief Queue an outgoing frame */
 int ast_queue_frame(struct ast_channel *chan, struct ast_frame *f);
@@ -1095,6 +1095,12 @@
 void ast_deactivate_generator(struct ast_channel *chan);
 
 void ast_set_callerid(struct ast_channel *chan, const char *cidnum, const char *cidname, const char *ani);
+
+
+/*! return a mallocd string with the result of sprintf of the fmt and following args */
+char *ast_safe_string_alloc(const char *fmt, ...);
+
+
 
 /*! Start a tone going */
 int ast_tonepair_start(struct ast_channel *chan, int freq1, int freq2, int duration, int vol);

Modified: branches/1.4/include/asterisk/stringfields.h
URL: http://svn.digium.com/view/asterisk/branches/1.4/include/asterisk/stringfields.h?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/include/asterisk/stringfields.h (original)
+++ branches/1.4/include/asterisk/stringfields.h Tue Nov  7 17:46:41 2006
@@ -168,6 +168,22 @@
 				    int index, const char *format, ...);
 
 /*!
+  \internal
+  \brief Set a field to a complex (built) value
+  \param mgr Pointer to the pool manager structure
+  \param fields Pointer to the first entry of the field array
+  \param num_fields Number of fields in the array
+  \param index Index position of the field within the structure
+  \param format printf-style format string
+  \param args va_list of the args for the format_string
+  \param args_again a copy of the first va_list for the sake of bsd not having a copy routine
+  \return nothing
+*/
+void __ast_string_field_index_build_va(struct ast_string_field_mgr *mgr,
+				    ast_string_field *fields, int num_fields,
+				    int index, const char *format, va_list a1, va_list a2);
+
+/*!
   \brief Declare a string field
   \param name The field name
 */
@@ -276,6 +292,18 @@
 	__ast_string_field_index_build(&(x)->__field_mgr, &(x)->__begin_field[0], ast_string_field_count(x), index, fmt, args)
 
 /*!
+  \brief Set a field to a complex (built) value with prebuilt va_lists.
+  \param x Pointer to a structure containing fields
+  \param index Index position of the field within the structure
+  \param fmt printf-style format string
+  \param args1 Arguments for format string in va_list format
+  \param args2 a second copy of the va_list for the sake of bsd, with no va_list copy operation
+  \return nothing
+*/
+#define ast_string_field_index_build_va(x, index, fmt, args1, args2) \
+	__ast_string_field_index_build_va(&(x)->__field_mgr, &(x)->__begin_field[0], ast_string_field_count(x), index, fmt, args1, args2)
+
+/*!
   \brief Set a field to a complex (built) value
   \param x Pointer to a structure containing fields
   \param field Name of the field to set
@@ -285,6 +313,17 @@
 */
 #define ast_string_field_build(x, field, fmt, args...) \
 	ast_string_field_index_build(x, ast_string_field_index(x, field), fmt, args)
+
+/*!
+  \brief Set a field to a complex (built) value
+  \param x Pointer to a structure containing fields
+  \param field Name of the field to set
+  \param fmt printf-style format string
+  \param argslist a va_list of the args
+  \return nothing
+*/
+#define ast_string_field_build_va(x, field, fmt, args1, args2) \
+	ast_string_field_index_build_va(x, ast_string_field_index(x, field), fmt, args1, args2)
 
 /*!
   \brief Free a field's value.

Modified: branches/1.4/main/channel.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/main/channel.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/main/channel.c (original)
+++ branches/1.4/main/channel.c Tue Nov  7 17:46:41 2006
@@ -29,6 +29,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdarg.h>
 #include <string.h>
 #include <sys/time.h>
 #include <signal.h>
@@ -340,6 +341,21 @@
 	return res;
 }
 
+/*! \brief printf the string into a correctly sized mallocd buffer, and return the buffer */
+char *ast_safe_string_alloc(const char *fmt, ...)
+{
+	char *b2,buf[1];
+	int len;
+
+	va_list args;
+	va_start(args, fmt);
+	len = vsnprintf(buf, 1, fmt, args);
+	b2 = ast_malloc(len+1);
+	vsnprintf(b2, len+1,  fmt, args);
+	va_end(args);
+	return b2;
+}
+
 /*! \brief Initiate system shutdown */
 void ast_begin_shutdown(int hangup)
 {
@@ -618,12 +634,13 @@
 };
 
 /*! \brief Create a new channel structure */
-struct ast_channel *ast_channel_alloc(int needqueue)
+struct ast_channel *ast_channel_alloc(int needqueue, int state, const char *cid_num, const char *cid_name, const char *name_fmt, ...)
 {
 	struct ast_channel *tmp;
 	int x;
 	int flags;
 	struct varshead *headp;
+	va_list ap1, ap2;
 
 	/* If shutting down, don't allocate any new channels */
 	if (shutting_down) {
@@ -681,10 +698,10 @@
 	/* And timing pipe */
 	tmp->fds[AST_TIMING_FD] = tmp->timingfd;
 	ast_string_field_set(tmp, name, "**Unknown**");
-	
+
 	/* Initial state */
-	tmp->_state = AST_STATE_DOWN;
-	
+	tmp->_state = state;
+
 	tmp->streamid = -1;
 	
 	tmp->fin = global_fin;
@@ -698,6 +715,37 @@
 			(long) time(NULL), ast_atomic_fetchadd_int(&uniqueint, 1));
 	}
 
+	if (!ast_strlen_zero(name_fmt)) {
+		/* Almost every channel is calling this function, and setting the name via the ast_string_field_build() call.
+		 * And they all use slightly different formats for their name string.
+		 * This means, to set the name here, we have to accept variable args, and call the string_field_build from here.
+		 * This means, that the stringfields must have a routine that takes the va_lists directly, and 
+		 * uses them to build the string, instead of forming the va_lists internally from the vararg ... list.
+		 * This new function was written so this can be accomplished.
+		 */
+		va_start(ap1, name_fmt);
+		va_start(ap2, name_fmt);
+		ast_string_field_build_va(tmp, name, name_fmt, ap1, ap2);
+		va_end(ap1);
+		va_end(ap2);
+
+		/* and now, since the channel structure is built, and has its name, let's call the
+		 * manager event generator with this Newchannel event. This is the proper and correct
+		 * place to make this call, but you sure do have to pass a lot of data into this func
+		 * to do it here!
+		 */
+		manager_event(EVENT_FLAG_CALL, "Newchannel",
+			      "Channel: %s\r\n"
+			      "State: %s\r\n"
+			      "CallerIDNum: %s\r\n"
+			      "CallerIDName: %s\r\n"
+			      "Uniqueid: %s\r\n",
+			      tmp->name, ast_state2str(state),
+			      S_OR(cid_num, "<unknown>"),
+			      S_OR(cid_name, "<unknown>"),
+			      tmp->uniqueid);
+	}
+	
 	headp = &tmp->varshead;
 	AST_LIST_HEAD_INIT_NOLOCK(headp);
 	
@@ -2855,18 +2903,7 @@
 		if (!(c = chan->tech->requester(type, capabilities | videoformat, data, cause)))
 			return NULL;
 
-		if (c->_state == AST_STATE_DOWN) {
-			manager_event(EVENT_FLAG_CALL, "Newchannel",
-				      "Channel: %s\r\n"
-				      "State: %s\r\n"
-				      "CallerID: %s\r\n"
-				      "CallerIDName: %s\r\n"
-				      "Uniqueid: %s\r\n",
-				      c->name, ast_state2str(c->_state),
-				      S_OR(c->cid.cid_num, "<unknown>"),
-				      S_OR(c->cid.cid_name, "<unknown>"),
-				      c->uniqueid);
-		}
+		/* no need to generate a Newchannel event here; it is done in the channel_alloc call */
 		return c;
 	}
 
@@ -3508,8 +3545,9 @@
 
 	chan->_state = state;
 	ast_device_state_changed_literal(chan->name);
+	/* setstate used to conditionally report Newchannel; this is no more */
 	manager_event(EVENT_FLAG_CALL,
-		      (oldstate == AST_STATE_DOWN) ? "Newchannel" : "Newstate",
+		      "Newstate",
 		      "Channel: %s\r\n"
 		      "State: %s\r\n"
 		      "CallerID: %s\r\n"

Modified: branches/1.4/main/pbx.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/main/pbx.c?rev=47303&r1=47302&r2=47303&view=diff
==============================================================================
--- branches/1.4/main/pbx.c (original)
+++ branches/1.4/main/pbx.c Tue Nov  7 17:46:41 2006
@@ -4524,12 +4524,10 @@
 		/* In order to do it when the channel doesn't really exist within
 		   the PBX, we have to make a new channel, masquerade, and start the PBX
 		   at the new location */
-		struct ast_channel *tmpchan = ast_channel_alloc(0);
+		struct ast_channel *tmpchan = ast_channel_alloc(0, chan->_state, 0, 0, "AsyncGoto/%s", chan->name);
 		if (!tmpchan)
 			res = -1;
 		else {
-			ast_string_field_build(tmpchan, name, "AsyncGoto/%s", chan->name);
-			ast_setstate(tmpchan, chan->_state);
 			/* Make formats okay */
 			tmpchan->readformat = chan->readformat;
 			tmpchan->writeformat = chan->writeformat;
@@ -4886,7 +4884,7 @@
 static int ast_pbx_outgoing_cdr_failed(void)
 {
 	/* allocate a channel */
-	struct ast_channel *chan = ast_channel_alloc(0);
+	struct ast_channel *chan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, 0);
 
 	if (!chan)
 		return -1;  /* failure */
@@ -4999,9 +4997,8 @@
 			/* create a fake channel and execute the "failed" extension (if it exists) within the requested context */
 			/* check if "failed" exists */
 			if (ast_exists_extension(chan, context, "failed", 1, NULL)) {
-				chan = ast_channel_alloc(0);
+				chan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, "OutgoingSpoolFailed");
 				if (chan) {
-					ast_string_field_set(chan, name, "OutgoingSpoolFailed");
 					if (!ast_strlen_zero(context))

[... 124 lines stripped ...]


More information about the svn-commits mailing list