]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix adding of span channels to group for E1 lines
authorMoises Silva <moy@sangoma.com>
Mon, 25 Jan 2010 18:53:27 +0000 (18:53 +0000)
committerMoises Silva <moy@sangoma.com>
Mon, 25 Jan 2010 18:53:27 +0000 (18:53 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/branches/sangoma_boost@1005 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/freetdm/src/ftdm_io.c
libs/freetdm/src/include/freetdm.h

index 90936ee6c7632516e659d952c251a625e099eb5c..5adaa27a963d5c338b8aa1e6f858ff09330703c2 100644 (file)
@@ -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);
-
-       p = strchr(val, ':');
-       mydata = ftdm_strdup(++p);
-       
-       ftdm_assert_return(mydata != NULL, FTDM_FAIL, "ftdm_strdup failed when adding channels\n");
+       int chan_index = 0;
 
-       items = ftdm_separate_string(mydata, ',', item_list, (sizeof(item_list) / sizeof(item_list[0])));
+       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");
 
-       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 (!span->chan_count) {
+               return FTDM_SUCCESS;
+       }
 
-                       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;
 }
 
index ef23bd02fb1d6e5f30f359ac336151391afbc02b..59842906666aca5ffa8fb838c3a3f5cb37e64baa 100644 (file)
@@ -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);