]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: fix attempt for OPENZAP-130
authorMoises Silva <moy@sangoma.com>
Sun, 19 Dec 2010 05:13:08 +0000 (00:13 -0500)
committerMoises Silva <moy@sangoma.com>
Sun, 19 Dec 2010 05:13:08 +0000 (00:13 -0500)
libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c
libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c

index fbe6ca082224e1ea283908be7ea1c0ed30712334..bfb67e4c785a9894ad15f50d1d1fab3ce19139c1 100644 (file)
@@ -127,9 +127,8 @@ static int __pri_lpwrap_read(struct pri *pri, void *buf, int buflen)
                } else {
                        ftdm_log(FTDM_LOG_CRIT, "span %d D-READ TIMEOUT\n", spri->span->span_id);
                }
-
-               ftdm_clear_flag(spri, LPWRAP_PRI_READY);
-               return -1;
+               /* we cannot return -1, libpri seems to expect values >= 0 */
+               return 0;
        }
        spri->errs = 0;
        res = (int)len;
@@ -156,8 +155,8 @@ static int __pri_lpwrap_write(struct pri *pri, void *buf, int buflen)
 
        if (ftdm_channel_write(spri->dchan, buf, buflen, &len) != FTDM_SUCCESS) {
                ftdm_log(FTDM_LOG_CRIT, "span %d D-WRITE FAIL! [%s]\n", spri->span->span_id, spri->dchan->last_error);
-               ftdm_clear_flag(spri, LPWRAP_PRI_READY);
-               return -1;
+               /* we cannot return -1, libpri seems to expect values >= 0 */
+               return 0;
        }
 
 #ifdef IODEBUG
index 09208f8d2ce6e7ee0e0ba60f03854bf79cad58c0..b16ead7a66c3bc3f300a312e58ba061f4cefed69 100644 (file)
@@ -1152,6 +1152,7 @@ static FIO_WRITE_FUNCTION(zt_write)
                bytes += 2;
        }
 
+tryagain:
        w = write(ftdmchan->sockfd, data, bytes);
        
        if (w >= 0) {
@@ -1159,6 +1160,17 @@ static FIO_WRITE_FUNCTION(zt_write)
                return FTDM_SUCCESS;
        }
 
+       if (errno == ELAST) {
+               zt_event_t zt_event_id = 0;
+               if (ioctl(ftdmchan->sockfd, codes.GETEVENT, &zt_event_id) == -1) {
+                       ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Failed retrieving event after ELAST on write: %s\n", strerror(errno));
+                       return FTDM_FAIL;
+               }
+               /* we should enqueue this event somewhere so it can be retrieved by the user, for now, dropping it to see what it is! */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dropping event %d to be able to write data\n", zt_event_id);
+               goto tryagain;
+       }
+
        return FTDM_FAIL;
 }