Пример #1
0
/**
 * \brief Reads data from a Wanpipe channel
 * \param ftdmchan Channel to read from
 * \param data Data buffer
 * \param datalen Size of data buffer
 * \return Success, failure or timeout
 */
static FIO_READ_FUNCTION(wanpipe_read)
{
	int rx_len = 0;
	int myerrno = 0;
	wp_tdm_api_rx_hdr_t hdrframe;

	memset(&hdrframe, 0, sizeof(hdrframe));

	rx_len = sangoma_readmsg_tdm(ftdmchan->sockfd, &hdrframe, (int)sizeof(hdrframe), data, (int)*datalen, 0);
	*datalen = rx_len;

	if (rx_len == 0) {
		ftdm_log_chan_msg(ftdmchan, FTDM_LOG_WARNING, "Read 0 bytes\n");
		return FTDM_TIMEOUT;
	}

	if (rx_len < 0) {
		myerrno = errno;
		snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "%s", strerror(errno));
		ftdm_log_chan(ftdmchan, FTDM_LOG_WARNING, "Failed to read from sangoma device: %s (%d)\n", strerror(errno), rx_len);
		return FTDM_FAIL;
	} 


	return FTDM_SUCCESS;
}
Пример #2
0
/**
 * \brief Reads data from a Wanpipe channel
 * \param zchan Channel to read from
 * \param data Data buffer
 * \param datalen Size of data buffer
 * \return Success, failure or timeout
 */
static ZIO_READ_FUNCTION(wanpipe_read)
{
    int rx_len = 0;
    wp_tdm_api_rx_hdr_t hdrframe;

    memset(&hdrframe, 0, sizeof(hdrframe));

    rx_len = sangoma_readmsg_tdm(zchan->sockfd, &hdrframe, (int)sizeof(hdrframe), data, (int)*datalen,0);
    *datalen = rx_len;

    if (rx_len == 0 || rx_len == -17) {
        return ZAP_TIMEOUT;
    }

    if (rx_len < 0) {
        snprintf(zchan->last_error, sizeof(zchan->last_error), "%s", strerror(errno));
        return ZAP_FAIL;
    }


    return ZAP_SUCCESS;
}
Пример #3
0
sbridge_media_frame_t *sbridge_media_read(sbridge_chan_t *chan)
{
    unsigned char *chandata;
    int res = 0;
    sbridge_media_frame_t *f = NULL;

    sbridge_assert(chan != NULL, NULL);
    sbridge_assert(chan->mtu <= SBRIDGE_MEDIA_MAX_FRAME_SIZE, NULL);

    /* allocate enough space for the frame and its payload */
    f = sbridge_calloc(1, sizeof(*f) + (SBRIDGE_MEDIA_MAX_FRAME_SIZE));
    f->datalen = 0;
    f->data.ptr = ((unsigned char *)f + sizeof(*f));
    res = sangoma_readmsg_tdm(chan->sangoma_sock, &chan->hdrframe,
                              sizeof(chan->hdrframe), f->data.ptr, chan->mtu, 0);
    if (res == -1) {
        sbridge_log(SBRIDGE_LOG_ERROR, "Failed to read from sangoma socket: %s\n", strerror(errno));
        free(f);
        return NULL;
    }
    if (res == 0) {
        sbridge_log(SBRIDGE_LOG_ERROR, "0 bytes read from sangoma socket, eof\n");
        free(f);
        return NULL;
    }
    f->datalen = res;
    chandata = f->data.ptr;
    if (chan->trace_raw_in) {
        int len = 0;
        len = fwrite(chandata, 1, f->datalen, chan->trace_raw_in);
        if (len != f->datalen) {
            sbridge_log(SBRIDGE_LOG_WARNING, "just wrote %d bytes of raw input when %d were requested\n", len, f->datalen);
        }
        fflush(chan->trace_raw_in);
    }
    return f;
}