]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Channel alert pipe: improve diagnostic error return 54/754/1
authorScott Griepentrog <scott@griepentrog.com>
Wed, 1 Jul 2015 18:34:46 +0000 (13:34 -0500)
committerScott Griepentrog <sgriepentrog@digium.com>
Wed, 1 Jul 2015 21:55:50 +0000 (16:55 -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 835b9ce374eabe3051d06d02e8a224505e304c9e..db5f3c05541906f133dcd9ba3dbe66d0be2640bd 100644 (file)
@@ -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;
        }
 }