diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index f93fb6821a..4a90c53622 100644 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -3155,7 +3155,7 @@ SWITCH_STANDARD_API(ft_function) if (!strcasecmp(argv[0], "dump")) { if (argc < 2) { - stream->write_function(stream, "-ERR Usage: ft dump []\n"); + stream->write_function(stream, "-ERR Usage: ftdm dump []\n"); goto end; } else { uint32_t chan_id = 0; @@ -3325,7 +3325,7 @@ SWITCH_STANDARD_API(ft_function) char *tmp_path = NULL; if (argc < 3) { - stream->write_function(stream, "-ERR Usage: ft q931_pcap on|off [pcapfilename without suffix]\n"); + stream->write_function(stream, "-ERR Usage: ftdm q931_pcap on|off [pcapfilename without suffix]\n"); goto end; } span_id = atoi(argv[1]); @@ -3409,6 +3409,79 @@ SWITCH_STANDARD_API(ft_function) } stream->write_function(stream, "+OK DTMF detection was %s\n", fcmd == FTDM_COMMAND_ENABLE_DTMF_DETECT ? "enabled" : "disabled"); + } else if (!strcasecmp(argv[0], "trace")) { + char tracepath[255]; + int i = 0; + uint32_t chan_id = 0; + int32_t chan_count = 0; + ftdm_span_t *span = NULL; + ftdm_channel_t *chan = NULL; + if (argc < 3) { + stream->write_function(stream, "-ERR Usage: ftdm trace []\n"); + goto end; + } + ftdm_span_find_by_name(argv[2], &span); + if (!span) { + stream->write_function(stream, "-ERR invalid span\n"); + goto end; + } + chan_count = ftdm_span_get_chan_count(span); + if (argc > 3) { + chan_id = atoi(argv[3]); + if (chan_id > chan_count) { + stream->write_function(stream, "-ERR invalid chan\n"); + goto end; + } + } + if (chan_id) { + chan = ftdm_span_get_channel(span, chan_id); + snprintf(tracepath, sizeof(tracepath), "%s-in-c%d", argv[1], chan_id); + ftdm_channel_command(chan, FTDM_COMMAND_TRACE_INPUT, tracepath); + snprintf(tracepath, sizeof(tracepath), "%s-out-c%d", argv[1], chan_id); + ftdm_channel_command(chan, FTDM_COMMAND_TRACE_OUTPUT, tracepath); + } else { + for (i = 1; i <= chan_count; i++) { + chan = ftdm_span_get_channel(span, i); + snprintf(tracepath, sizeof(tracepath), "%s-in-c%d", argv[1], i); + ftdm_channel_command(chan, FTDM_COMMAND_TRACE_INPUT, tracepath); + snprintf(tracepath, sizeof(tracepath), "%s-out-c%d", argv[1], i); + ftdm_channel_command(chan, FTDM_COMMAND_TRACE_OUTPUT, tracepath); + } + } + stream->write_function(stream, "+OK trace enabled with prefix path %s\n", argv[1]); + } else if (!strcasecmp(argv[0], "notrace")) { + uint32_t i = 0; + uint32_t chan_id = 0; + int32_t chan_count = 0; + ftdm_channel_t *fchan = NULL; + ftdm_span_t *span = NULL; + if (argc < 2) { + stream->write_function(stream, "-ERR Usage: oz notrace []\n"); + goto end; + } + ftdm_span_find_by_name(argv[1], &span); + if (!span) { + stream->write_function(stream, "-ERR invalid span\n"); + goto end; + } + chan_count = ftdm_span_get_chan_count(span); + if (argc > 2) { + chan_id = atoi(argv[2]); + if (chan_id > chan_count) { + stream->write_function(stream, "-ERR invalid chan\n"); + goto end; + } + } + if (chan_id) { + fchan = ftdm_span_get_channel(span, chan_id); + ftdm_channel_command(fchan, FTDM_COMMAND_TRACE_END_ALL, NULL); + } else { + for (i = 1; i <= chan_count; i++) { + fchan = ftdm_span_get_channel(span, i); + ftdm_channel_command(fchan, FTDM_COMMAND_TRACE_END_ALL, NULL); + } + } + stream->write_function(stream, "+OK trace disabled\n"); } else if (!strcasecmp(argv[0], "gains")) { unsigned int i = 0; float txgain = 0.0; diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 3dcca80ab3..505d98c9f7 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -2245,6 +2245,19 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_command(ftdm_channel_t *ftdmchan, ftdm_co GOTO_STATUS(done, FTDM_FAIL); } break; + case FTDM_COMMAND_TRACE_END_ALL: + { + if (ftdmchan->fds[0] > 0) { + close(ftdmchan->fds[0]); + ftdmchan->fds[0] = -1; + } + if (ftdmchan->fds[1] > 0) { + close(ftdmchan->fds[1]); + ftdmchan->fds[1] = -1; + } + GOTO_STATUS(done, FTDM_SUCCESS); + } + break; case FTDM_COMMAND_SET_INTERVAL: { if (!ftdm_channel_test_feature(ftdmchan, FTDM_CHANNEL_FEATURE_INTERVAL)) { diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index 4cc9fd244e..aa805f3dd0 100644 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -403,6 +403,7 @@ typedef enum { FTDM_COMMAND_DISABLE_PROGRESS_DETECT, FTDM_COMMAND_TRACE_INPUT, FTDM_COMMAND_TRACE_OUTPUT, + FTDM_COMMAND_TRACE_END_ALL, FTDM_COMMAND_ENABLE_CALLERID_DETECT, FTDM_COMMAND_DISABLE_CALLERID_DETECT, FTDM_COMMAND_ENABLE_ECHOCANCEL,