]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_parking: Fail gracefully if parking lot is full.
authorNaveen Albert <asterisk@phreaknet.org>
Sun, 3 Mar 2024 18:37:10 +0000 (13:37 -0500)
committerAsterisk Development Team <asteriskteam@digium.com>
Thu, 9 May 2024 13:48:09 +0000 (13:48 +0000)
Currently, if a parking lot is full, bridge setup returns -1,
causing dialplan execution to terminate without TryExec.
However, such failures should be handled more gracefully,
the same way they are on other paths, as indicated by the
module's author, here:

http://lists.digium.com/pipermail/asterisk-dev/2018-December/077144.html

Now, callers will hear the parking failure announcement, and dialplan
will continue, which is consistent with existing failure modes.

Resolves: #624
(cherry picked from commit e1dfa207977b4c68e274ba88476dc21271737420)

res/parking/parking_applications.c

index 7d11516a1ee8e852a6f249eef50d953141a50729..5457c5d5745aebdf214e834658c46f8f722d9a54 100644 (file)
@@ -567,7 +567,7 @@ static int park_app_exec(struct ast_channel *chan, const char *data)
        RAII_VAR(struct ast_bridge *, parking_bridge, NULL, ao2_cleanup);
 
        struct ast_bridge_features chan_features;
-       int res;
+       int res = 0;
        int silence_announcements = 0;
        int blind_transfer;
 
@@ -591,15 +591,16 @@ static int park_app_exec(struct ast_channel *chan, const char *data)
 
        /* Initialize bridge features for the channel. */
        res = ast_bridge_features_init(&chan_features);
-       if (res) {
+       /* Now for the fun part... park it! */
+       if (res || ast_bridge_join(parking_bridge, chan, NULL, &chan_features, NULL, 0)) {
+               if (!silence_announcements && !blind_transfer) {
+                       ast_stream_and_wait(chan, "pbx-parkingfailed", "");
+               }
                ast_bridge_features_cleanup(&chan_features);
                publish_parked_call_failure(chan);
-               return -1;
+               return res;
        }
 
-       /* Now for the fun part... park it! */
-       ast_bridge_join(parking_bridge, chan, NULL, &chan_features, NULL, 0);
-
        /*
         * If the bridge was broken for a hangup that isn't real, then
         * don't run the h extension, because the channel isn't really