From 448d2e8566f6616001e67b7479617b15936f5beb Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Mon, 25 Jan 2010 18:53:27 +0000 Subject: [PATCH] fix adding of span channels to group for E1 lines git-svn-id: http://svn.openzap.org/svn/openzap/branches/sangoma_boost@1005 a93c3328-9c30-0410-af19-c9cd2b2d52af --- libs/freetdm/src/ftdm_io.c | 53 +++++++++++++----------------- libs/freetdm/src/include/freetdm.h | 1 - 2 files changed, 22 insertions(+), 32 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 90936ee6c7..5adaa27a96 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -2701,12 +2701,14 @@ FT_DECLARE(char *) ftdm_api_execute(const char *type, const char *cmd) } +static ftdm_status_t ftdm_group_add_channels(const char* name, ftdm_span_t* span, int currindex); static ftdm_status_t load_config(void) { char cfg_name[] = "freetdm.conf"; ftdm_config_t cfg; char *var, *val; int catno = -1; + int currindex = 0; ftdm_span_t *span = NULL; unsigned configured = 0, d = 0; char name[80] = ""; @@ -2819,7 +2821,9 @@ static ftdm_status_t load_config(void) ftdm_analog_start_type2str(span->start_type)); } if (span->trunk_type == FTDM_TRUNK_FXO) { + currindex = span->chan_count; configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXO, name, number); + ftdm_group_add_channels(group_name, span, currindex); } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add FXO channels to an FXS trunk!\n"); } @@ -2830,7 +2834,9 @@ static ftdm_status_t load_config(void) ftdm_analog_start_type2str(span->start_type)); } if (span->trunk_type == FTDM_TRUNK_FXS) { + currindex = span->chan_count; configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXS, name, number); + ftdm_group_add_channels(group_name, span, currindex); } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add FXS channels to an FXO trunk!\n"); } @@ -2841,13 +2847,16 @@ static ftdm_status_t load_config(void) ftdm_analog_start_type2str(span->start_type)); } if (span->trunk_type == FTDM_TRUNK_EM) { + currindex = span->chan_count; configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_EM, name, number); + ftdm_group_add_channels(group_name, span, currindex); } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add EM channels to a non-EM trunk!\n"); } } else if (!strcasecmp(var, "b-channel")) { + currindex = span->chan_count; configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_B, name, number); - ftdm_group_add_channels(group_name, span, val); + ftdm_group_add_channels(group_name, span, currindex); } else if (!strcasecmp(var, "d-channel")) { if (d) { ftdm_log(FTDM_LOG_WARNING, "ignoring extra d-channel\n"); @@ -2863,7 +2872,9 @@ static ftdm_status_t load_config(void) d++; } } else if (!strcasecmp(var, "cas-channel")) { + currindex = span->chan_count; configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_CAS, name, number); + ftdm_group_add_channels(group_name, span, currindex); } else if (!strcasecmp(var, "dtmf_hangup")) { span->dtmf_hangup = ftdm_strdup(val); span->dtmf_hangup_len = strlen(val); @@ -3228,42 +3239,22 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_remove_from_group(ftdm_group_t* group, ft return FTDM_FAIL; } -FT_DECLARE(ftdm_status_t) ftdm_group_add_channels(const char* name, ftdm_span_t* span, const char* val) +static ftdm_status_t ftdm_group_add_channels(const char* name, ftdm_span_t* span, int currindex) { - char *p, *mydata, *item_list[10]; - int items, i; - - assert(strlen(name) > 0); + int chan_index = 0; - p = strchr(val, ':'); - mydata = ftdm_strdup(++p); - - ftdm_assert_return(mydata != NULL, FTDM_FAIL, "ftdm_strdup failed when adding channels\n"); + ftdm_assert_return(strlen(name) > 0, FTDM_FAIL, "Invalid group name provided\n"); + ftdm_assert_return(currindex >= 0, FTDM_FAIL, "Invalid current channel index provided\n"); - items = ftdm_separate_string(mydata, ',', item_list, (sizeof(item_list) / sizeof(item_list[0]))); + if (!span->chan_count) { + return FTDM_SUCCESS; + } - for(i=0; i < items; i++) { - if (!strchr(item_list[i], '-')) { - int chan_no; - - chan_no = atoi (item_list[i]); - ftdm_assert(chan_no > 0, "Channel number is not bigger than zero, expect a nasty failure!\n"); - - if (ftdm_channel_add_to_group(name, span->channels[chan_no]) != FTDM_SUCCESS) { - ftdm_log(FTDM_LOG_CRIT, "Failed to add chan:%d to group:%s\n", chan_no, name); - } - } else { - int chan_no_start, chan_no_end; - if (sscanf(item_list[i], "%d-%d", &chan_no_start, &chan_no_end) == 2) { - while (chan_no_start <= chan_no_end) { - if (ftdm_channel_add_to_group(name, span->channels[chan_no_start++])) { - ftdm_log(FTDM_LOG_CRIT, "Failed to add chan:%d to group:%s\n", chan_no_start-1, name); - } - } - } + for (chan_index = (span->chan_count - currindex); chan_index <= span->chan_count; chan_index++) { + if (ftdm_channel_add_to_group(name, span->channels[chan_index])) { + ftdm_log(FTDM_LOG_CRIT, "Failed to add chan:%d to group:%s\n", chan_index, name); } } - ftdm_safe_free(mydata); return FTDM_SUCCESS; } diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index ef23bd02fb..5984290666 100644 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -740,7 +740,6 @@ FT_DECLARE(ftdm_status_t) ftdm_span_close_all(void); FT_DECLARE(ftdm_status_t) ftdm_span_add_channel(ftdm_span_t *span, ftdm_socket_t sockfd, ftdm_chan_type_t type, ftdm_channel_t **chan); FT_DECLARE(ftdm_status_t) ftdm_span_set_event_callback(ftdm_span_t *span, fio_event_cb_t event_callback); FT_DECLARE(ftdm_status_t) ftdm_channel_add_to_group(const char* name, ftdm_channel_t* ftdmchan); -FT_DECLARE(ftdm_status_t) ftdm_group_add_channels(const char* name, ftdm_span_t* span, const char* val); FT_DECLARE(ftdm_status_t) ftdm_channel_remove_from_group(ftdm_group_t* group, ftdm_channel_t* ftdmchan); FT_DECLARE(ftdm_status_t) ftdm_group_find(uint32_t id, ftdm_group_t **group); FT_DECLARE(ftdm_status_t) ftdm_group_find_by_name(const char *name, ftdm_group_t **group);