]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
app_page.c: Simplify dialplan using Page.
authorRichard Mudgett <rmudgett@digium.com>
Mon, 30 Dec 2019 02:41:30 +0000 (20:41 -0600)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 6 Jan 2020 03:21:03 +0000 (21:21 -0600)
Dialplan has to be careful about passing an empty destination list or
empty positions in the list.  As a result, dialplan has to check for
these conditions before using Page.  Simplify dialplan by making Page
handle these conditions gracefully.

* Made tolerate empty positions in the paged device list.

* Reduced some warnings associated with the 's' option to verbose
messages.  The warning level for those messages really serves no purpose
as that is why the 's' option exists.

ASTERISK-28638

Change-Id: I95b64a6d6800cd1a25279c88889314ae60fc21e3

apps/app_page.c
doc/CHANGES-staging/app_page_empty_page_list.txt [new file with mode: 0644]

index 12ba01dff2a91101938f33191f05c18c59f8fa78..df601e77c08ef0358c9e7db4e39e4b80fa539818 100644 (file)
@@ -48,7 +48,7 @@
                        Page series of phones
                </synopsis>
                <syntax>
-                       <parameter name="Technology/Resource" required="true" argsep="&amp;">
+                       <parameter name="Technology/Resource" required="false" argsep="&amp;">
                                <argument name="Technology/Resource" required="true">
                                        <para>Specification of the device(s) to dial. These must be in the format of
                                        <literal>Technology/Resource</literal>, where <replaceable>Technology</replaceable>
@@ -270,17 +270,12 @@ static int page_exec(struct ast_channel *chan, const char *data)
                AST_APP_ARG(timeout);
        );
 
-       if (ast_strlen_zero(data)) {
-               ast_log(LOG_WARNING, "This application requires at least one argument (destination(s) to page)\n");
-               return -1;
-       }
-
        if (!(app = pbx_findapp("ConfBridge"))) {
                ast_log(LOG_WARNING, "There is no ConfBridge application available!\n");
                return -1;
        };
 
-       parse = ast_strdupa(data);
+       parse = ast_strdupa(data ?: "");
 
        AST_STANDARD_APP_ARGS(args, parse);
 
@@ -301,7 +296,7 @@ static int page_exec(struct ast_channel *chan, const char *data)
 
        /* Count number of extensions in list by number of ampersands + 1 */
        num_dials = 1;
-       tmp = args.devices;
+       tmp = args.devices ?: "";
        while (*tmp) {
                if (*tmp == '&') {
                        num_dials++;
@@ -334,13 +329,20 @@ static int page_exec(struct ast_channel *chan, const char *data)
                int state = 0;
                struct ast_dial *dial = NULL;
 
+               tech = ast_strip(tech);
+               if (ast_strlen_zero(tech)) {
+                       /* No tech/resource in this position. */
+                       continue;
+               }
+
                /* don't call the originating device */
-               if (!strcasecmp(tech, originator))
+               if (!strcasecmp(tech, originator)) {
                        continue;
+               }
 
                /* If no resource is available, continue on */
                if (!(resource = strchr(tech, '/'))) {
-                       ast_log(LOG_WARNING, "Incomplete destination '%s' supplied.\n", tech);
+                       ast_log(LOG_WARNING, "Incomplete destination: '%s' supplied.\n", tech);
                        continue;
                }
 
@@ -348,9 +350,11 @@ static int page_exec(struct ast_channel *chan, const char *data)
                if (ast_test_flag(&options.flags, PAGE_SKIP)) {
                        state = ast_device_state(tech);
                        if (state == AST_DEVICE_UNKNOWN) {
-                               ast_log(LOG_WARNING, "Destination '%s' has device state '%s'. Paging anyway.\n", tech, ast_devstate2str(state));
+                               ast_verb(3, "Destination '%s' has device state '%s'. Paging anyway.\n",
+                                       tech, ast_devstate2str(state));
                        } else if (state != AST_DEVICE_NOT_INUSE) {
-                               ast_log(LOG_WARNING, "Destination '%s' has device state '%s'.\n", tech, ast_devstate2str(state));
+                               ast_verb(3, "Destination '%s' has device state '%s'.\n",
+                                       tech, ast_devstate2str(state));
                                continue;
                        }
                }
@@ -365,7 +369,7 @@ static int page_exec(struct ast_channel *chan, const char *data)
 
                /* Append technology and resource */
                if (ast_dial_append(dial, tech, resource, NULL) == -1) {
-                       ast_log(LOG_ERROR, "Failed to add %s to outbound dial\n", tech);
+                       ast_log(LOG_ERROR, "Failed to add %s/%s to outbound dial\n", tech, resource);
                        ast_dial_destroy(dial);
                        continue;
                }
diff --git a/doc/CHANGES-staging/app_page_empty_page_list.txt b/doc/CHANGES-staging/app_page_empty_page_list.txt
new file mode 100644 (file)
index 0000000..73e8420
--- /dev/null
@@ -0,0 +1,5 @@
+Subject: app_page
+
+The Page application now tolerates empty positions in the supplied
+destination list.  Dialplan can now be simplified by not having to check
+for empty positions in the destination list.