summaryrefslogtreecommitdiff
path: root/main/channel_internal_api.c
diff options
context:
space:
mode:
authorScott Griepentrog <scott@griepentrog.com>2015-07-01 13:34:46 -0500
committerScott Griepentrog <sgriepentrog@digium.com>2015-07-01 16:55:50 -0500
commit6b16fbfc22d99ebf262bb7ac07688b6656831e6e (patch)
tree7a21e5f2e4dbdc98fd0faacf40835a739cc42dd4 /main/channel_internal_api.c
parent69bfa518a02cbd69b364e5b0a500fc160e7b285d (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.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/main/channel_internal_api.c b/main/channel_internal_api.c
index 835b9ce37..db5f3c055 100644
--- a/main/channel_internal_api.c
+++ b/main/channel_internal_api.c
@@ -1210,7 +1210,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)
@@ -1261,9 +1268,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;
}
}