} 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;
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
bytes += 2;
}
+tryagain:
w = write(ftdmchan->sockfd, data, bytes);
if (w >= 0) {
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;
}