diff options
author | Scott Griepentrog <scott@griepentrog.com> | 2015-07-01 13:34:46 -0500 |
---|---|---|
committer | Scott Griepentrog <scott@griepentrog.com> | 2015-07-01 16:53:17 -0500 |
commit | 537df26f9c23706b378d0398f6969cd0f778c9d3 (patch) | |
tree | 596958dd565490b4241b54b1f4793008b68b0870 /main/channel_internal_api.c | |
parent | c12ace3ab31bd61606252f5a3721ce720d2ad209 (diff) |
Channel alert pipe: improve diagnostic error return
When a frame is queued on a channel, any failure in
ast_channel_alert_write is logged along with errno.
This change improves the diagnostic message through
aligning the errno value with actual failure cases.
ASTERISK-25224
Reported by: Andrey Biglari
Change-Id: I1bf7b3337ad392789a9f02c650589cd065d20b5b
Diffstat (limited to 'main/channel_internal_api.c')
-rw-r--r-- | main/channel_internal_api.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/main/channel_internal_api.c b/main/channel_internal_api.c index 0bb38499b..987602db6 100644 --- a/main/channel_internal_api.c +++ b/main/channel_internal_api.c @@ -1202,7 +1202,14 @@ void ast_channel_named_pickupgroups_set(struct ast_channel *chan, struct ast_nam int ast_channel_alert_write(struct ast_channel *chan) { char blah = 0x7F; - return ast_channel_alert_writable(chan) && write(chan->alertpipe[1], &blah, sizeof(blah)) != sizeof(blah); + + if (!ast_channel_alert_writable(chan)) { + errno = EBADF; + return 0; + } + /* preset errno in case returned size does not match */ + errno = EPIPE; + return write(chan->alertpipe[1], &blah, sizeof(blah)) != sizeof(blah); } ast_alert_status_t ast_channel_internal_alert_read(struct ast_channel *chan) @@ -1253,9 +1260,11 @@ void ast_channel_internal_alertpipe_close(struct ast_channel *chan) { if (ast_channel_internal_alert_readable(chan)) { close(chan->alertpipe[0]); + chan->alertpipe[0] = -1; } if (ast_channel_alert_writable(chan)) { close(chan->alertpipe[1]); + chan->alertpipe[1] = -1; } } |