summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--channels/chan_dahdi.c60
1 files changed, 35 insertions, 25 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index f5491cd43..44a170be4 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -10588,16 +10588,30 @@ static int sigtype_to_signalling(int sigtype)
return sigtype;
}
+/*!
+ * \internal
+ * \brief Initialize/create a channel interface.
+ *
+ * \param channel Channel interface number to initialize/create.
+ * \param conf Configuration parameters to initialize interface with.
+ * \param reloading What we are doing now:
+ * 0 - initial module load,
+ * 1 - module reload,
+ * 2 - module restart
+ *
+ * \retval Interface-pointer initialized/created
+ * \retval NULL if error
+ */
static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf, int reloading)
{
/* Make a dahdi_pvt structure for this interface */
- struct dahdi_pvt *tmp = NULL, *tmp2, *prev = NULL;
+ struct dahdi_pvt *tmp;/*!< Current channel structure initializing */
char fn[80];
struct dahdi_bufferinfo bi;
int res;
int span = 0;
- int here = 0;
+ int here = 0;/*!< TRUE if the channel interface already exists. */
int x;
struct dahdi_pvt **wlist;
struct dahdi_pvt **wend;
@@ -10608,29 +10622,25 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
struct sig_pri_chan *pchan = NULL;
#endif
- wlist = &iflist;
- wend = &ifend;
-
- tmp2 = *wlist;
- prev = NULL;
-
- while (tmp2) {
- if (!tmp2->destroy) {
- if (tmp2->channel == channel) {
- tmp = tmp2;
+ /* Search channel interface list to see if it already exists. */
+ for (tmp = iflist; tmp; tmp = tmp->next) {
+ if (!tmp->destroy) {
+ if (tmp->channel == channel) {
+ /* The channel interface already exists. */
here = 1;
break;
}
- if (tmp2->channel > channel) {
+ if (tmp->channel > channel) {
+ /* No way it can be in the sorted list. */
+ tmp = NULL;
break;
}
}
- prev = tmp2;
- tmp2 = tmp2->next;
}
if (!here && reloading != 1) {
- if (!(tmp = ast_calloc(1, sizeof(*tmp)))) {
+ tmp = ast_calloc(1, sizeof(*tmp));
+ if (!tmp) {
return NULL;
}
ast_mutex_init(&tmp->lock);
@@ -10643,9 +10653,12 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
if (tmp) {
int chan_sig = conf->chan.sig;
+
if (!here) {
+ /* Can only get here if this is a new channel interface being created. */
if ((channel != CHAN_PSEUDO)) {
int count = 0;
+
snprintf(fn, sizeof(fn), "%d", channel);
/* Open non-blocking */
tmp->subs[SUB_REAL].dfd = dahdi_open(fn);
@@ -10682,17 +10695,12 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
}
if (analog_lib_handles(chan_sig, tmp->radio, tmp->oprmode)) {
- if (tmp->sig_pvt) {
- ast_log(LOG_WARNING, "Private already exists!\n");
- analog_p = tmp->sig_pvt;
- } else
- analog_p = analog_new(dahdisig_to_analogsig(chan_sig), &dahdi_analog_callbacks, tmp);
+ analog_p = analog_new(dahdisig_to_analogsig(chan_sig), &dahdi_analog_callbacks, tmp);
if (!analog_p) {
destroy_dahdi_pvt(&tmp);
return NULL;
}
tmp->sig_pvt = analog_p;
-
}
#ifdef HAVE_SS7
if (chan_sig == SIG_SS7) {
@@ -10735,7 +10743,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
}
#endif
#ifdef HAVE_OPENR2
- if (chan_sig == SIG_MFCR2 && reloading != 1) {
+ if (chan_sig == SIG_MFCR2) {
struct dahdi_mfcr2 *r2_link;
r2_link = dahdi_r2_get_link();
if (!r2_link) {
@@ -10917,8 +10925,6 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
return NULL;
}
}
- } else {
- tmp->prioffset = 0;
}
#endif
} else {
@@ -11300,6 +11306,10 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
#endif
}
if (tmp && !here) {
+ /* Add the new channel interface to the sorted channel interface list. */
+ wlist = &iflist;
+ wend = &ifend;
+
/* nothing on the iflist */
if (!*wlist) {
*wlist = tmp;