]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FIX for windows IO
authorDavid Yat Sin <dyatsin@sangoma.com>
Thu, 11 Nov 2010 23:43:53 +0000 (18:43 -0500)
committerDavid Yat Sin <dyatsin@sangoma.com>
Thu, 11 Nov 2010 23:43:53 +0000 (18:43 -0500)
libs/freetdm/cyginstall.sh
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c
libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c

index 9d486b7dce308d8cfbc6eed2bd3f6bbfcfaac647..311df939afba9185cf4664f22771562706503b58 100644 (file)
@@ -5,8 +5,8 @@ fsdir=../..
 set -x
 cp Debug/mod/*.dll $fsdir/Debug/mod/
 cp mod_freetdm/Debug/*.pdb $fsdir/Debug/mod/
-cp Debug/*.dll $fsdir/Debug/
-cp Debug/*.pdb $fsdir/Debug/
+cp Debug/*.dll $fsdir/Debug/mod/
+cp Debug/*.pdb $fsdir/Debug/mod/
 #cp Debug/testsangomaboost.exe $fsdir/Debug/
 echo "FRIENDLY REMINDER: RECOMPILE ftmod_wanpipe WHENEVER YOU INSTALL NEW DRIVERS"
 set +x 
index 69743115fe831a75d3d6f758723d324ee0a657f0..98b09e930536d9c99a11051ef3e2cf034a38255e 100644 (file)
@@ -52,10 +52,10 @@ static void ftdm_sangoma_isdn_process_phy_events(ftdm_span_t *span, ftdm_oob_eve
 static void ftdm_sangoma_isdn_process_state_change(ftdm_channel_t *ftdmchan);
 static void ftdm_sangoma_isdn_process_stack_event (ftdm_span_t *span, sngisdn_event_data_t *sngisdn_event);
 
-static ftdm_io_interface_t                     g_sngisdn_io_interface;
-static sng_isdn_event_interface_t              g_sngisdn_event_interface;
+static ftdm_io_interface_t             g_sngisdn_io_interface;
+static sng_isdn_event_interface_t      g_sngisdn_event_interface;
 
-ftdm_sngisdn_data_t                            g_sngisdn_data;
+ftdm_sngisdn_data_t                    g_sngisdn_data;
 
 extern ftdm_status_t sngisdn_activate_trace(ftdm_span_t *span, sngisdn_tracetype_t trace_opt);
 extern ftdm_status_t sngisdn_check_free_ids(void);
@@ -248,6 +248,7 @@ static void ftdm_sangoma_isdn_process_phy_events(ftdm_span_t *span, ftdm_oob_eve
                        sngisdn_snd_event(span, SNG_L1EVENT_ALARM_OFF);
                        if (FTDM_SPAN_IS_BRI(span)) {
                                ftdm_channel_t *ftdmchan;
+                               sngisdn_chan_data_t *sngisdn_info;
                                ftdm_iterator_t *chaniter = NULL;
                                ftdm_iterator_t *curr = NULL;
                                sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) span->signal_data;
@@ -255,7 +256,7 @@ static void ftdm_sangoma_isdn_process_phy_events(ftdm_span_t *span, ftdm_oob_eve
                                chaniter = ftdm_span_get_chan_iterator(span, NULL);
                                for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) {
                                        ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr);
-                                       sngisdn_chan_data_t *sngisdn_info = ftdmchan->call_data;
+                                       sngisdn_info = (sngisdn_chan_data_t*)ftdmchan->call_data;
 
                                        if (ftdm_test_flag(sngisdn_info, FLAG_ACTIVATING)) {
                                                ftdm_clear_flag(sngisdn_info, FLAG_ACTIVATING);
@@ -277,8 +278,7 @@ static void ftdm_sangoma_isdn_process_phy_events(ftdm_span_t *span, ftdm_oob_eve
 
 static void ftdm_sangoma_isdn_poll_events(ftdm_span_t *span)
 {
-       ftdm_status_t           ret_status;
-       ftdm_channel_t *ftdmchan;
+       ftdm_status_t   ret_status;
        ftdm_iterator_t *chaniter = NULL;
        ftdm_iterator_t *curr = NULL;
        
@@ -315,7 +315,7 @@ static void *ftdm_sangoma_isdn_dchan_run(ftdm_thread_t *me, void *obj)
        
        while (ftdm_running() && !(ftdm_test_flag(span, FTDM_SPAN_STOP_THREAD))) {
                wflags = FTDM_READ;
-               status = ftdm_channel_wait(dchan, &wflags, 0);
+               status = ftdm_channel_wait(dchan, &wflags, 10000);
                switch(status) {
                        case FTDM_FAIL:
                                ftdm_log_chan_msg(dchan, FTDM_LOG_CRIT, "Failed to wait for d-channel\n");
@@ -331,8 +331,10 @@ static void *ftdm_sangoma_isdn_dchan_run(ftdm_thread_t *me, void *obj)
                                        } else {
                                                ftdm_log_chan_msg(dchan, FTDM_LOG_WARNING, "Failed to read from channel \n");
                                        }
+#ifndef WIN32 /* It is valid on WIN32 for poll to return without errors, but no flags set */
                                } else {
                                        ftdm_log_chan_msg(dchan, FTDM_LOG_CRIT, "Failed to poll for d-channel\n");
+#endif
                                }
                                break;
                        default:
@@ -986,7 +988,7 @@ static FIO_SIG_LOAD_FUNCTION(ftdm_sangoma_isdn_init)
        ftdm_log(FTDM_LOG_INFO, "Loading ftmod_sangoma_isdn...\n");
 
        memset(&g_sngisdn_data, 0, sizeof(g_sngisdn_data));
-
+       memset(&g_sngisdn_event_interface, 0, sizeof(g_sngisdn_event_interface));
        /* set callbacks */
        g_sngisdn_event_interface.cc.sng_con_ind        = sngisdn_rcv_con_ind;
        g_sngisdn_event_interface.cc.sng_con_cfm        = sngisdn_rcv_con_cfm;
@@ -1017,8 +1019,8 @@ static FIO_SIG_LOAD_FUNCTION(ftdm_sangoma_isdn_init)
        g_sngisdn_event_interface.sta.sng_q931_trc_ind  = sngisdn_rcv_q931_trace;
        g_sngisdn_event_interface.sta.sng_cc_sta_ind    = sngisdn_rcv_cc_ind;
 
-       g_sngisdn_event_interface.io.sng_data_req = sngisdn_rcv_data_req;
-
+       g_sngisdn_event_interface.io.sng_data_req       = sngisdn_rcv_data_req;
+       
        for(i=1;i<=MAX_VARIANTS;i++) {          
                ftdm_mutex_create(&g_sngisdn_data.ccs[i].mutex);
        }
index 163265177f6aa8d6a0733dfd72bcf43ac94b1d44..c0ee11d98096023d43f2f932c3a3f2dcb72be7aa 100644 (file)
@@ -37,6 +37,7 @@
 extern ftdm_status_t cpy_calling_num_from_user(CgPtyNmb *cgPtyNmb, ftdm_caller_data_t *ftdm);
 extern ftdm_status_t cpy_called_num_from_user(CdPtyNmb *cdPtyNmb, ftdm_caller_data_t *ftdm);
 extern ftdm_status_t cpy_calling_name_from_user(ConEvnt *conEvnt, ftdm_channel_t *ftdmchan);
+extern ftdm_status_t cpy_redir_num_from_user(RedirNmb *redirNmb, ftdm_caller_data_t *ftdm);
 
 
 void sngisdn_snd_setup(ftdm_channel_t *ftdmchan)
index e7ebc8f20be8642b06337db6d00ca275d299494c..940006451a95ffe0679592c2d31583017a5f42b8 100644 (file)
@@ -873,16 +873,30 @@ int16_t sngisdn_rcv_data_req(uint16_t spId, uint8_t *buff, uint32_t length)
        sngisdn_span_data_t     *signal_data = g_sngisdn_data.spans[spId];
        ftdm_assert(signal_data, "Received Data request on unconfigured span\n");
 
-       status = signal_data->dchan->fio->wait(signal_data->dchan, &flags, 10);
-       if (status != FTDM_SUCCESS) {
-               ftdm_log_chan_msg(signal_data->dchan, FTDM_LOG_WARNING, "transmit timed-out\n");
-               return -1;
-       }
-       status = signal_data->dchan->fio->write(signal_data->dchan, buff, (ftdm_size_t*)&length);
-       if (status != FTDM_SUCCESS) {
-               ftdm_log_chan_msg(signal_data->dchan, FTDM_LOG_CRIT, "Failed to transmit frame\n");
-               return -1;
-       }
+       do {
+               flags = FTDM_WRITE;
+               status = signal_data->dchan->fio->wait(signal_data->dchan, &flags, 1000);
+               if (status != FTDM_SUCCESS) {
+                       ftdm_log_chan_msg(signal_data->dchan, FTDM_LOG_WARNING, "transmit timed-out\n");
+                       return -1;
+               }
+               
+               
+               if ((flags & FTDM_WRITE)) {
+                       status = signal_data->dchan->fio->write(signal_data->dchan, buff, (ftdm_size_t*)&length);
+                       if (status != FTDM_SUCCESS) {
+                               ftdm_log_chan_msg(signal_data->dchan, FTDM_LOG_CRIT, "Failed to transmit frame\n");
+                               return -1;
+                       }
+                       break;
+               /* On WIN32, it is possible for poll to return without FTDM_WRITE flag set, so we try to retransmit */
+#ifndef WIN32
+               } else {
+                       ftdm_log_chan_msg(signal_data->dchan, FTDM_LOG_WARNING, "Failed to poll for d-channel\n");
+                       return -1;
+#endif
+               }
+       } while(1);
        return 0;
 }
 
index 896b8eebd8e6bcda4801ed53441e38767f42ee98..f40f2b20c75eaf3dbe38d3c7e359ad7b5ab48c57 100644 (file)
@@ -115,7 +115,7 @@ FIO_SPAN_NEXT_EVENT_FUNCTION(wanpipe_next_event);
 static __inline__ int tdmv_api_wait_socket(ftdm_channel_t *ftdmchan, int timeout, int *flags)
 {
        
-#ifdef LIBSANGOMA_VERSION
+#ifdef LIBSANGOMA_VERSION      
        int err;
     uint32_t inflags = *flags;
     uint32_t outflags = 0;
@@ -130,6 +130,7 @@ static __inline__ int tdmv_api_wait_socket(ftdm_channel_t *ftdmchan, int timeout
     if (err == SANG_STATUS_APIPOLL_TIMEOUT) {
         err = 0;
     }
+       
     return err;
 #else
        struct pollfd pfds[1];