mirror of
https://github.com/asterisk/asterisk.git
synced 2026-07-28 00:10:25 -07:00
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: https://origsvn.digium.com/svn/asterisk/branches/1.4@47303 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -1867,7 +1867,7 @@ static void make_email_file(FILE *p, char *srcemail, struct ast_vm_user *vmu, in
|
||||
|
||||
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 @@ static void make_email_file(FILE *p, char *srcemail, struct ast_vm_user *vmu, in
|
||||
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 @@ static void make_email_file(FILE *p, char *srcemail, struct ast_vm_user *vmu, in
|
||||
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 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *context, char
|
||||
|
||||
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 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *context, char
|
||||
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 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *context, char
|
||||
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))) {
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
+11
-8
@@ -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)) {
|
||||
|
||||
+17
-15
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
+15
-5
@@ -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
|
||||
|
||||
+1
-3
@@ -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;
|
||||
|
||||
+6
-4
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
+18
-20
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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';
|
||||
|
||||
+26
-21
@@ -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) {
|
||||
|
||||
@@ -576,7 +576,7 @@ int ast_setstate(struct ast_channel *chan, enum ast_channel_state);
|
||||
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);
|
||||
@@ -1096,6 +1096,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);
|
||||
/*! Stop a tone from playing */
|
||||
|
||||
@@ -167,6 +167,22 @@ void __ast_string_field_index_build(struct ast_string_field_mgr *mgr,
|
||||
ast_string_field *fields, int num_fields,
|
||||
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
|
||||
@@ -275,6 +291,18 @@ void __ast_string_field_index_build(struct ast_string_field_mgr *mgr,
|
||||
#define ast_string_field_index_build(x, index, fmt, args...) \
|
||||
__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
|
||||
@@ -286,6 +314,17 @@ void __ast_string_field_index_build(struct ast_string_field_mgr *mgr,
|
||||
#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.
|
||||
\param x Pointer to a structure containing fields
|
||||
|
||||
+55
-17
@@ -29,6 +29,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
#include <signal.h>
|
||||
@@ -340,6 +341,21 @@ static int ast_check_hangup_locked(struct ast_channel *chan)
|
||||
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 @@ static const struct ast_channel_tech null_tech = {
|
||||
};
|
||||
|
||||
/*! \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 @@ struct ast_channel *ast_channel_alloc(int needqueue)
|
||||
/* 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 @@ struct ast_channel *ast_channel_alloc(int needqueue)
|
||||
(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 @@ struct ast_channel *ast_request(const char *type, int format, void *data, int *c
|
||||
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 @@ int ast_setstate(struct ast_channel *chan, enum ast_channel_state state)
|
||||
|
||||
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"
|
||||
|
||||
+3
-6
@@ -4524,12 +4524,10 @@ int ast_async_goto(struct ast_channel *chan, const char *context, const char *ex
|
||||
/* 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 void *async_wait(void *data)
|
||||
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 @@ int ast_pbx_outgoing_exten(const char *type, int format, void *data, int timeout
|
||||
/* 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))
|
||||
ast_copy_string(chan->context, context, sizeof(chan->context));
|
||||
set_ext_pri(chan, "failed", 1);
|
||||
|
||||
+15
-6
@@ -877,15 +877,11 @@ ast_string_field __ast_string_field_alloc_space(struct ast_string_field_mgr *mgr
|
||||
return result;
|
||||
}
|
||||
|
||||
void __ast_string_field_index_build(struct ast_string_field_mgr *mgr,
|
||||
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, ...)
|
||||
int index, const char *format, va_list ap1, va_list ap2)
|
||||
{
|
||||
size_t needed;
|
||||
va_list ap1, ap2;
|
||||
|
||||
va_start(ap1, format);
|
||||
va_start(ap2, format); /* va_copy does not exist on FreeBSD */
|
||||
|
||||
needed = vsnprintf(mgr->pool->base + mgr->used, mgr->space, format, ap1) + 1;
|
||||
|
||||
@@ -906,7 +902,20 @@ void __ast_string_field_index_build(struct ast_string_field_mgr *mgr,
|
||||
fields[index] = mgr->pool->base + mgr->used;
|
||||
mgr->used += needed;
|
||||
mgr->space -= needed;
|
||||
}
|
||||
|
||||
void __ast_string_field_index_build(struct ast_string_field_mgr *mgr,
|
||||
ast_string_field *fields, int num_fields,
|
||||
int index, const char *format, ...)
|
||||
{
|
||||
va_list ap1, ap2;
|
||||
|
||||
va_start(ap1, format);
|
||||
va_start(ap2, format); /* va_copy does not exist on FreeBSD */
|
||||
|
||||
__ast_string_field_index_build_va(mgr, fields, num_fields, index, format, ap1, ap2);
|
||||
|
||||
va_end(ap1);
|
||||
va_end(ap2);
|
||||
}
|
||||
|
||||
|
||||
+3
-7
@@ -189,14 +189,13 @@ static void check_goto_on_transfer(struct ast_channel *chan)
|
||||
|
||||
goto_on_transfer = ast_strdupa(val);
|
||||
|
||||
if (!(xferchan = ast_channel_alloc(0)))
|
||||
if (!(xferchan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, chan->name)))
|
||||
return;
|
||||
|
||||
for (x = goto_on_transfer; x && *x; x++) {
|
||||
if (*x == '^')
|
||||
*x = '|';
|
||||
}
|
||||
ast_string_field_set(xferchan, name, chan->name);
|
||||
/* Make formats okay */
|
||||
xferchan->readformat = chan->readformat;
|
||||
xferchan->writeformat = chan->writeformat;
|
||||
@@ -441,12 +440,10 @@ int ast_masq_park_call(struct ast_channel *rchan, struct ast_channel *peer, int
|
||||
struct ast_frame *f;
|
||||
|
||||
/* Make a new, fake channel that we'll use to masquerade in the real one */
|
||||
if (!(chan = ast_channel_alloc(0))) {
|
||||
if (!(chan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, "Parked/%s",rchan->name))) {
|
||||
ast_log(LOG_WARNING, "Unable to create parked channel\n");
|
||||
return -1;
|
||||
}
|
||||
/* Let us keep track of the channel name */
|
||||
ast_string_field_build(chan, name, "Parked/%s",rchan->name);
|
||||
|
||||
/* Make formats okay */
|
||||
chan->readformat = rchan->readformat;
|
||||
@@ -827,12 +824,11 @@ static int builtin_atxfer(struct ast_channel *chan, struct ast_channel *peer, st
|
||||
return -1;
|
||||
}
|
||||
|
||||
xferchan = ast_channel_alloc(0);
|
||||
xferchan = ast_channel_alloc(0, AST_STATE_DOWN, 0, 0, "Transfered/%s", transferee->name);
|
||||
if (!xferchan) {
|
||||
ast_hangup(newchan);
|
||||
return -1;
|
||||
}
|
||||
ast_string_field_build(xferchan, name, "Transfered/%s", transferee->name);
|
||||
/* Make formats okay */
|
||||
xferchan->readformat = transferee->readformat;
|
||||
xferchan->writeformat = transferee->writeformat;
|
||||
|
||||
Reference in New Issue
Block a user