diff options
-rw-r--r-- | res/res_monitor.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/res/res_monitor.c b/res/res_monitor.c index 26bee41af..4baa1580d 100644 --- a/res/res_monitor.c +++ b/res/res_monitor.c @@ -47,6 +47,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/app.h" #include "asterisk/utils.h" #include "asterisk/config.h" +#include "asterisk/options.h" AST_MUTEX_DEFINE_STATIC(monitorlock); @@ -156,6 +157,7 @@ int ast_monitor_start( struct ast_channel *chan, const char *format_spec, /* Determine file names */ if (!ast_strlen_zero(fname_base)) { int directory = strchr(fname_base, '/') ? 1 : 0; + const char *absolute = *fname_base == '/' ? "" : "/"; /* try creating the directory just in case it doesn't exist */ if (directory) { char *name = strdup(fname_base); @@ -163,10 +165,10 @@ int ast_monitor_start( struct ast_channel *chan, const char *format_spec, free(name); ast_safe_system(tmp); } - snprintf(monitor->read_filename, FILENAME_MAX, "%s/%s-in", - directory ? "" : ast_config_AST_MONITOR_DIR, fname_base); - snprintf(monitor->write_filename, FILENAME_MAX, "%s/%s-out", - directory ? "" : ast_config_AST_MONITOR_DIR, fname_base); + snprintf(monitor->read_filename, FILENAME_MAX, "%s%s%s-in", + directory ? "" : ast_config_AST_MONITOR_DIR, absolute, fname_base); + snprintf(monitor->write_filename, FILENAME_MAX, "%s%s%s-out", + directory ? "" : ast_config_AST_MONITOR_DIR, absolute, fname_base); ast_copy_string(monitor->filename_base, fname_base, sizeof(monitor->filename_base)); } else { ast_mutex_lock(&monitorlock); @@ -300,6 +302,7 @@ int ast_monitor_stop(struct ast_channel *chan, int need_lock) int directory = strchr(name, '/') ? 1 : 0; char *dir = directory ? "" : ast_config_AST_MONITOR_DIR; const char *execute, *execute_args; + const char *absolute = *name == '/' ? "" : "/"; /* Set the execute application */ execute = pbx_builtin_getvar_helper(chan, "MONITOR_EXEC"); @@ -317,9 +320,9 @@ int ast_monitor_stop(struct ast_channel *chan, int need_lock) execute_args = ""; } - snprintf(tmp, sizeof(tmp), "%s \"%s/%s-in.%s\" \"%s/%s-out.%s\" \"%s/%s.%s\" %s &", execute, dir, name, format, dir, name, format, dir, name, format,execute_args); + snprintf(tmp, sizeof(tmp), "%s \"%s%s%s-in.%s\" \"%s%s%s-out.%s\" \"%s%s%s.%s\" %s &", execute, dir, absolute, name, format, dir, absolute, name, format, dir, absolute, name, format,execute_args); if (delfiles) { - snprintf(tmp2,sizeof(tmp2), "( %s& rm -f \"%s/%s-\"* ) &",tmp, dir ,name); /* remove legs when done mixing */ + snprintf(tmp2,sizeof(tmp2), "( %s& rm -f \"%s%s%s-\"* ) &",tmp, dir, absolute, name); /* remove legs when done mixing */ ast_copy_string(tmp, tmp2, sizeof(tmp)); } ast_log(LOG_DEBUG,"monitor executing %s\n",tmp); @@ -373,6 +376,18 @@ int ast_monitor_change_fname(struct ast_channel *chan, const char *fname_base, i if (chan->monitor) { int directory = strchr(fname_base, '/') ? 1 : 0; + const char *absolute = *fname_base == '/' ? "" : "/"; + char tmpstring[sizeof(chan->monitor->filename_base)] = ""; + + /* before continuing, see if we're trying to rename the file to itself... */ + snprintf(tmpstring, sizeof(tmpstring), "%s%s%s", directory ? "" : ast_config_AST_MONITOR_DIR, absolute, fname_base); + if (!strcmp(tmpstring, chan->monitor->filename_base)) { + if (option_debug > 2) + ast_log(LOG_DEBUG, "No need to rename monitor filename to itself\n"); + UNLOCK_IF_NEEDED(chan, need_lock); + return 0; + } + /* try creating the directory just in case it doesn't exist */ if (directory) { char *name = strdup(fname_base); @@ -381,7 +396,7 @@ int ast_monitor_change_fname(struct ast_channel *chan, const char *fname_base, i ast_safe_system(tmp); } - snprintf(chan->monitor->filename_base, FILENAME_MAX, "%s/%s", directory ? "" : ast_config_AST_MONITOR_DIR, fname_base); + ast_copy_string(chan->monitor->filename_base, tmpstring, sizeof(chan->monitor->filename_base)); chan->monitor->filename_changed = 1; } else { ast_log(LOG_WARNING, "Cannot change monitor filename of channel %s to %s, monitoring not started\n", chan->name, fname_base); |