Commit ffbc0d6bab for asterisk.org
commit ffbc0d6babef38716df8b4f418fbb297a195d0cf
Author: Jeremy Lainé <jeremy.laine@m4x.org>
Date: Tue Aug 18 09:16:08 2026 +0200
main/file.c: Log the reason a file could not be opened.
When ast_streamfile() failed to open a file it reported strerror(errno),
but errno was not set by anything on that path. The value came from
whatever syscall ran last, so the message routinely blamed an unrelated
error.
Drop errno from that message and log at the point of failure instead:
filehelper() now reports the fopen() error, which does carry a meaningful
errno, and an allocation failure from get_filestream(). Candidate files
whose format does not match the channel are logged at debug level only,
since filehelper() walks every registered format and skipping the ones
that do not match is normal: a sound installed in several formats would
otherwise warn on every successful playback.
Failures inside the format module's open callback stay unlogged here,
as those callbacks already report their own reason.
Resolves: #1629
diff --git a/main/file.c b/main/file.c
index ed203cea76..9e90bd54d5 100644
--- a/main/file.c
+++ b/main/file.c
@@ -600,15 +600,18 @@ static int filehelper(const char *filename, const void *arg2, const char *fmt, c
if ((ast_format_cmp(ast_channel_writeformat(chan), f->format) == AST_FORMAT_CMP_NOT_EQUAL) &&
!(((ast_format_get_type(f->format) == AST_MEDIA_TYPE_AUDIO) && fmt) ||
((ast_format_get_type(f->format) == AST_MEDIA_TYPE_VIDEO) && fmt))) {
+ ast_debug(3, "File %s format is not compatible with the channel\n", fn);
ast_free(fn);
continue; /* not a supported format */
}
if ( (bfile = fopen(fn, "r")) == NULL) {
+ ast_log(LOG_WARNING, "Failed to open file %s due to: %s\n", fn, strerror(errno));
ast_free(fn);
continue; /* cannot open file */
}
s = get_filestream(f, bfile);
if (!s) {
+ ast_log(LOG_WARNING, "Failed to open file %s due to: file stream creation failure\n", fn);
fclose(bfile);
ast_free(fn); /* cannot allocate descriptor */
continue;
@@ -1344,8 +1347,8 @@ int ast_streamfile(struct ast_channel *chan, const char *filename,
if (!fs) {
struct ast_str *codec_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
ast_channel_lock(chan);
- ast_log(LOG_WARNING, "Unable to open %s (format %s): %s\n",
- filename, ast_format_cap_get_names(ast_channel_nativeformats(chan), &codec_buf), strerror(errno));
+ ast_log(LOG_WARNING, "Unable to open %s (format %s)\n",
+ filename, ast_format_cap_get_names(ast_channel_nativeformats(chan), &codec_buf));
ast_channel_unlock(chan);
return -1;
}