diff --git a/apps/app_mixmonitor.c b/apps/app_mixmonitor.c
index 6746c473cf..a5c27bfc8b 100644
--- a/apps/app_mixmonitor.c
+++ b/apps/app_mixmonitor.c
@@ -154,6 +154,11 @@
This application does not automatically answer and should be preceeded by
an application such as Answer or Progress().
MixMonitor runs as an audiohook.
+ If a filename passed to MixMonitor ends with
+ .wav49, Asterisk will silently convert the extension to
+ .WAV for legacy reasons. MIXMONITOR_FILENAME
+ will contain the actual filename that Asterisk is writing to, not necessarily the
+ value that was passed in.
Will contain the filename used to record.
@@ -998,17 +1003,35 @@ static int launch_monitor_thread(struct ast_channel *chan, const char *filename,
static char *filename_parse(char *filename, char *buffer, size_t len)
{
char *slash;
+ char *ext;
+
+ ast_assert(len > 0);
+
if (ast_strlen_zero(filename)) {
ast_log(LOG_WARNING, "No file name was provided for a file save option.\n");
- } else if (filename[0] != '/') {
- char *build;
- build = ast_alloca(strlen(ast_config_AST_MONITOR_DIR) + strlen(filename) + 3);
+ buffer[0] = 0;
+ return buffer;
+ }
+
+ /* If we don't have an absolute path, make one */
+ if (*filename != '/') {
+ char *build = ast_alloca(strlen(ast_config_AST_MONITOR_DIR) + strlen(filename) + 3);
sprintf(build, "%s/%s", ast_config_AST_MONITOR_DIR, filename);
filename = build;
}
ast_copy_string(buffer, filename, len);
+ /* If the provided filename has a .wav49 extension, we need to convert it to .WAV to
+ match the behavior of build_filename in main/file.c. Otherwise MIXMONITOR_FILENAME
+ ends up referring to a file that does not/will not exist */
+ ext = strrchr(buffer, '.');
+ if (ext && !strcmp(ext, ".wav49")) {
+ /* Change to WAV - we know we have at least 6 writeable bytes where 'ext' points,
+ * so this is safe */
+ memcpy(ext, ".WAV", sizeof(".WAV"));
+ }
+
if ((slash = strrchr(filename, '/'))) {
*slash = '\0';
}
diff --git a/doc/CHANGES-staging/app_mixmonitor_wav49.txt b/doc/CHANGES-staging/app_mixmonitor_wav49.txt
new file mode 100644
index 0000000000..f3218d70d2
--- /dev/null
+++ b/doc/CHANGES-staging/app_mixmonitor_wav49.txt
@@ -0,0 +1,8 @@
+Subject: app_mixmonitor
+
+If the 'filename' argument to MixMonitor() ended with '.wav49,'
+Asterisk would silently convert the extension to '.WAV' when opening
+the file for writing. This caused the MIXMONITOR_FILENAME variable to
+reference the wrong file. The MIXMONITOR_FILENAME variable will now
+reflect the name of the file that Asterisk actually used instead of
+the filename that was passed to the application.
diff --git a/main/file.c b/main/file.c
index a0616c8d02..b4266093ce 100644
--- a/main/file.c
+++ b/main/file.c
@@ -315,6 +315,8 @@ static char *build_filename(const char *filename, const char *ext)
{
char *fn = NULL;
+ /* The wav49 -> WAV translation is duplicated in apps/app_mixmonitor.c, so
+ if you change it here you need to change it there as well */
if (!strcmp(ext, "wav49"))
ext = "WAV";