Channel alert pipe: improve diagnostic error return
authorScott Griepentrog <scott@griepentrog.com>
Wed, 1 Jul 2015 18:34:46 +0000 (13:34 -0500)
committerScott Griepentrog <scott@griepentrog.com>
Wed, 1 Jul 2015 21:53:17 +0000 (16:53 -0500)
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

main/channel_internal_api.c

index 0bb3849..987602d 100644 (file)
@@ -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;
        }
 }