From 717570899c60a69368001ec276f69bab9a6f45c1 Mon Sep 17 00:00:00 2001 From: Richard Mudgett <rmudgett@digium.com> Date: Wed, 9 Jun 2010 17:06:41 +0000 Subject: [PATCH] Add missing API function to sig_ss7: sig_ss7_fixup(). git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@269308 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_dahdi.c | 21 ++++++++++++++------- channels/sig_ss7.c | 17 +++++++++++++++++ channels/sig_ss7.h | 1 + 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index d054323f53..5df6dae0c6 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -7074,27 +7074,34 @@ static int dahdi_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) { struct dahdi_pvt *p = newchan->tech_pvt; int x; + ast_mutex_lock(&p->lock); + ast_debug(1, "New owner for channel %d is %s\n", p->channel, newchan->name); if (p->owner == oldchan) { p->owner = newchan; } - for (x = 0; x < 3; x++) + for (x = 0; x < 3; x++) { if (p->subs[x].owner == oldchan) { - if (!x) + if (!x) { dahdi_unlink(NULL, p, 0); + } p->subs[x].owner = newchan; } + } if (analog_lib_handles(p->sig, p->radio, p->oprmode)) { analog_fixup(oldchan, newchan, p->sig_pvt); - } -#ifdef HAVE_PRI - else if (dahdi_sig_pri_lib_handles(p->sig)) { +#if defined(HAVE_PRI) + } else if (dahdi_sig_pri_lib_handles(p->sig)) { sig_pri_fixup(oldchan, newchan, p->sig_pvt); +#endif /* defined(HAVE_PRI) */ +#if defined(HAVE_SS7) + } else if (p->sig == SIG_SS7) { + sig_ss7_fixup(oldchan, newchan, p->sig_pvt); +#endif /* defined(HAVE_SS7) */ } -#endif - update_conf(p); + ast_mutex_unlock(&p->lock); if (newchan->_state == AST_STATE_RINGING) { diff --git a/channels/sig_ss7.c b/channels/sig_ss7.c index f00e813a77..540b08e818 100644 --- a/channels/sig_ss7.c +++ b/channels/sig_ss7.c @@ -1434,6 +1434,23 @@ int sig_ss7_answer(struct sig_ss7_chan *p, struct ast_channel *ast) return res; } +/*! + * \brief Fix up a channel: If a channel is consumed, this is called. Basically update any ->owner links. + * \since 1.8 + * + * \param oldchan Old channel pointer to replace. + * \param newchan New channel pointer to set. + * \param pchan Signaling private structure pointer. + * + * \return Nothing + */ +void sig_ss7_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, struct sig_ss7_chan *pchan) +{ + if (pchan->owner == oldchan) { + pchan->owner = newchan; + } +} + /*! * \brief SS7 answer channel. * \since 1.8 diff --git a/channels/sig_ss7.h b/channels/sig_ss7.h index 1080f5d8ed..be7c1e5e88 100644 --- a/channels/sig_ss7.h +++ b/channels/sig_ss7.h @@ -248,6 +248,7 @@ int sig_ss7_available(struct sig_ss7_chan *p); int sig_ss7_call(struct sig_ss7_chan *p, struct ast_channel *ast, char *rdest); int sig_ss7_hangup(struct sig_ss7_chan *p, struct ast_channel *ast); int sig_ss7_answer(struct sig_ss7_chan *p, struct ast_channel *ast); +void sig_ss7_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, struct sig_ss7_chan *pchan); int sig_ss7_indicate(struct sig_ss7_chan *p, struct ast_channel *chan, int condition, const void *data, size_t datalen); struct ast_channel *sig_ss7_request(struct sig_ss7_chan *p, enum sig_ss7_law law, const struct ast_channel *requestor, int transfercapability); void sig_ss7_chan_delete(struct sig_ss7_chan *doomed); -- GitLab