aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-03-24 00:37:23 +0000
committerjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-03-24 00:37:23 +0000
commitb467cfbdda405d92410a917f8356df115f829fd5 (patch)
treee0db3c2b6fda070294d122a58de8357235ecd36a
parent4711dc43917a07fe6aae887ee95343eba1c3f56d (diff)
Ensure that monitor recordings are written to the correct location (again)
This is an extension to 248860. As such the dialplan test has been extended: ; non absolute path, not combined exten => 5040, 1, monitor(wav,tmp/jeff/monitor_test) exten => 5040, n, dial(sip/5001) ; absolute path, not combined exten => 5041, 1, monitor(wav,/tmp/jeff/monitor_test2) exten => 5041, n, dial(sip/5001) ; no path, not combined exten => 5042, 1, monitor(wav,monitor_test3) exten => 5042, n, dial(sip/5001) ; combined: changemonitor from non absolute to no path (leaves tmp/jeff) exten => 5043, 1, monitor(wav,tmp/jeff/monitor_test4,m) exten => 5043, n, changemonitor(monitor_test5) exten => 5043, n, dial(sip/5001) ; combined: changemonitor from no path to non absolute path exten => 5044, 1, monitor(wav,monitor_test6,m) exten => 5044, n, changemonitor(tmp/jeff/monitor_test7) ; this wasn't possible before exten => 5044, n, dial(sip/5001) ; non absolute path, combined exten => 5045, 1, monitor(wav,tmp/jeff/monitor_test8,m) exten => 5045, n, dial(sip/5001) ; absolute path, combined exten => 5046, 1, monitor(wav,/tmp/jeff/monitor_test9,m) exten => 5046, n, dial(sip/5001) ; no path, combined exten => 5047, 1, monitor(wav,monitor_test10,m) exten => 5047, n, dial(sip/5001) ; combined: changemonitor from non absolute to absolute (leaves tmp/jeff) exten => 5048, 1, monitor(wav,tmp/jeff/monitor_test11,m) exten => 5048, n, changemonitor(/tmp/jeff/monitor_test12) exten => 5048, n, dial(sip/5001) ; combined: changemonitor from absolute to non absolute (leaves /tmp/jeff) exten => 5049, 1, monitor(wav,/tmp/jeff/monitor_test13,m) exten => 5049, n, changemonitor(tmp/jeff/monitor_test14) exten => 5049, n, dial(sip/5001) ; combined: changemonitor from no path to absolute exten => 5050, 1, monitor(wav,monitor_test15,m) exten => 5050, n, changemonitor(/tmp/jeff/monitor_test16) exten => 5050, n, dial(sip/5001) ; combined: changemonitor from absolute to no path (leaves /tmp/jeff) exten => 5051, 1, monitor(wav,/tmp/jeff/monitor_test17,m) exten => 5051, n, changemonitor(monitor_test18) exten => 5051, n, dial(sip/5001) ; not combined: changemonitor from non absolute to no path (leaves tmp/jeff) exten => 5052, 1, monitor(wav,tmp/jeff/monitor_test19) exten => 5052, n, changemonitor(monitor_test20) exten => 5052, n, dial(sip/5001) ; not combined: changemonitor from no path to non absolute exten => 5053, 1, monitor(wav,monitor_test21) exten => 5053, n, changemonitor(tmp/jeff/monitor_test22) exten => 5053, n, dial(sip/5001) ; not combined: changemonitor from non absolute to absolute (leaves tmp/jeff) exten => 5054, 1, monitor(wav,tmp/jeff/monitor_test23) exten => 5054, n, changemonitor(/tmp/jeff/monitor_test24) exten => 5054, n, dial(sip/5001) ; not combined: changemonitor from absolute to non absolute (leaves /tmp/jeff) exten => 5055, 1, monitor(wav,/tmp/jeff/monitor_test24) exten => 5055, n, changemonitor(tmp/jeff/monitor_test25) exten => 5055, n, dial(sip/5001) ; not combined: changemonitor from no path to absolute exten => 5056, 1, monitor(wav,monitor_test26) exten => 5056, n, changemonitor(/tmp/jeff/monitor_test27) exten => 5056, n, dial(sip/5001) ; not combined: changemonitor from absolute to no path (leaves /tmp/jeff) exten => 5057, 1, monitor(wav,/tmp/jeff/monitor_test28) exten => 5057, n, changemonitor(monitor_test29) exten => 5057, n, dial(sip/5001) git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@254235 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--res/res_monitor.c47
1 files changed, 25 insertions, 22 deletions
diff --git a/res/res_monitor.c b/res/res_monitor.c
index 803bca2d1..d18a8ce25 100644
--- a/res/res_monitor.c
+++ b/res/res_monitor.c
@@ -158,19 +158,21 @@ int ast_monitor_start( struct ast_channel *chan, const char *format_spec,
if (!ast_strlen_zero(fname_base)) {
int directory = strchr(fname_base, '/') ? 1 : 0;
const char *absolute = *fname_base == '/' ? "" : ast_config_AST_MONITOR_DIR;
+ const char *absolute_suffix = *fname_base == '/' ? "" : "/";
/* try creating the directory just in case it doesn't exist */
if (directory) {
char *name = strdup(fname_base);
- snprintf(tmp, sizeof(tmp), "mkdir -p \"%s/%s\"", absolute, dirname(name));
+ snprintf(tmp, sizeof(tmp), "mkdir -p \"%s%s%s\"",
+ absolute, absolute_suffix, dirname(name));
free(name);
ast_safe_system(tmp);
}
- snprintf(monitor->read_filename, FILENAME_MAX, "%s/%s-in",
- absolute, fname_base);
- snprintf(monitor->write_filename, FILENAME_MAX, "%s/%s-out",
- absolute, fname_base);
- snprintf(monitor->filename_base, FILENAME_MAX, "%s/%s",
- absolute, fname_base);
+ snprintf(monitor->read_filename, FILENAME_MAX, "%s%s%s-in",
+ absolute, absolute_suffix, fname_base);
+ snprintf(monitor->write_filename, FILENAME_MAX, "%s%s%s-out",
+ absolute, absolute_suffix, fname_base);
+ snprintf(monitor->filename_base, FILENAME_MAX, "%s%s%s",
+ absolute, absolute_suffix, fname_base);
} else {
ast_mutex_lock(&monitorlock);
snprintf(monitor->read_filename, FILENAME_MAX, "%s/audio-in-%ld",
@@ -299,11 +301,9 @@ int ast_monitor_stop(struct ast_channel *chan, int need_lock)
char tmp[1024];
char tmp2[1024];
const char *format = !strcasecmp(chan->monitor->format,"wav49") ? "WAV" : chan->monitor->format;
- char *name = chan->monitor->filename_base;
- int directory = strchr(name, '/') ? 1 : 0;
- char *dir = directory ? "" : ast_config_AST_MONITOR_DIR;
+ char *fname_base = chan->monitor->filename_base;
const char *execute, *execute_args;
- const char *absolute = *name == '/' ? "" : "/";
+ /* at this point, fname_base really is the full path */
/* Set the execute application */
execute = pbx_builtin_getvar_helper(chan, "MONITOR_EXEC");
@@ -321,9 +321,10 @@ int ast_monitor_stop(struct ast_channel *chan, int need_lock)
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);
+ snprintf(tmp, sizeof(tmp), "%s \"%s-in.%s\" \"%s-out.%s\" \"%s.%s\" %s &",
+ execute, fname_base, format, fname_base, format, fname_base, format,execute_args);
if (delfiles) {
- snprintf(tmp2,sizeof(tmp2), "( %s& rm -f \"%s%s%s-\"* ) &",tmp, dir, absolute, name); /* remove legs when done mixing */
+ snprintf(tmp2,sizeof(tmp2), "( %s& rm -f \"%s-\"* ) &",tmp, fname_base); /* remove legs when done mixing */
ast_copy_string(tmp, tmp2, sizeof(tmp));
}
ast_log(LOG_DEBUG,"monitor executing %s\n",tmp);
@@ -378,11 +379,20 @@ 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 == '/' ? "" : ast_config_AST_MONITOR_DIR;
+ const char *absolute_suffix = *fname_base == '/' ? "" : "/";
char tmpstring[sizeof(chan->monitor->filename_base)] = "";
int i, fd[2] = { -1, -1 }, doexit = 0;
/* before continuing, see if we're trying to rename the file to itself... */
- snprintf(tmpstring, sizeof(tmpstring), "%s/%s", absolute, fname_base);
+ snprintf(tmpstring, sizeof(tmpstring), "%s%s%s", absolute, absolute_suffix, fname_base);
+
+ /* try creating the directory just in case it doesn't exist */
+ if (directory) {
+ char *name = strdup(fname_base);
+ snprintf(tmp, sizeof(tmp), "mkdir -p \"%s%s%s\"", absolute, absolute_suffix, dirname(name));
+ free(name);
+ ast_safe_system(tmp);
+ }
/*!\note We cannot just compare filenames, due to symlinks, relative
* paths, and other possible filesystem issues. We could use
@@ -417,6 +427,7 @@ int ast_monitor_change_fname(struct ast_channel *chan, const char *fname_base, i
}
}
unlink(tmpstring);
+ /* if previous monitor file existed in a subdirectory, the directory will not be removed */
unlink(chan->monitor->filename_base);
if (doexit) {
@@ -424,14 +435,6 @@ int ast_monitor_change_fname(struct ast_channel *chan, const char *fname_base, i
return 0;
}
- /* try creating the directory just in case it doesn't exist */
- if (directory) {
- char *name = strdup(fname_base);
- snprintf(tmp, sizeof(tmp), "mkdir -p \"%s/%s\"", absolute, dirname(name));
- free(name);
- ast_safe_system(tmp);
- }
-
ast_copy_string(chan->monitor->filename_base, tmpstring, sizeof(chan->monitor->filename_base));
chan->monitor->filename_changed = 1;
} else {