aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_page.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/app_page.c')
-rw-r--r--apps/app_page.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/apps/app_page.c b/apps/app_page.c
index c3c383ea1..f93e5d7c3 100644
--- a/apps/app_page.c
+++ b/apps/app_page.c
@@ -78,18 +78,18 @@ AST_APP_OPTIONS(page_opts, {
AST_APP_OPTION('r', PAGE_RECORD),
});
-#define MAX_DIALS 128
static int page_exec(struct ast_channel *chan, void *data)
{
struct ast_module_user *u;
- char *options, *tech, *resource, *tmp;
+ char *options, *tech, *resource, *tmp, *tmp2;
char meetmeopts[88], originator[AST_CHANNEL_NAME];
struct ast_flags flags = { 0 };
unsigned int confid = ast_random();
struct ast_app *app;
int res = 0, pos = 0, i = 0;
- struct ast_dial *dials[MAX_DIALS];
+ struct ast_dial **dial_list;
+ unsigned int num_dials;
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "This application requires at least one argument (destination(s) to page)\n");
@@ -117,6 +117,19 @@ static int page_exec(struct ast_channel *chan, void *data)
snprintf(meetmeopts, sizeof(meetmeopts), "MeetMe|%ud|%s%sqxdw(5)", confid, (ast_test_flag(&flags, PAGE_DUPLEX) ? "" : "m"),
(ast_test_flag(&flags, PAGE_RECORD) ? "r" : "") );
+ /* Count number of extensions in list by number of ampersands + 1 */
+ num_dials = 1;
+ tmp2 = tmp;
+ while (*tmp2 && *tmp2++ == '&') {
+ num_dials++;
+ }
+
+ if (!(dial_list = ast_calloc(num_dials, sizeof(void *)))) {
+ ast_log(LOG_ERROR, "Can't allocate %ld bytes for dial list\n", (sizeof(void *) * num_dials));
+ ast_module_user_remove(u);
+ return -1;
+ }
+
/* Go through parsing/calling each device */
while ((tech = strsep(&tmp, "&"))) {
struct ast_dial *dial = NULL;
@@ -149,7 +162,7 @@ static int page_exec(struct ast_channel *chan, void *data)
ast_dial_run(dial, chan, 1);
/* Put in our dialing array */
- dials[pos++] = dial;
+ dial_list[pos++] = dial;
}
if (!ast_test_flag(&flags, PAGE_QUIET)) {
@@ -166,7 +179,7 @@ static int page_exec(struct ast_channel *chan, void *data)
/* Go through each dial attempt cancelling, joining, and destroying */
for (i = 0; i < pos; i++) {
- struct ast_dial *dial = dials[i];
+ struct ast_dial *dial = dial_list[i];
/* We have to wait for the async thread to exit as it's possible Meetme won't throw them out immediately */
ast_dial_join(dial);
@@ -178,6 +191,7 @@ static int page_exec(struct ast_channel *chan, void *data)
ast_dial_destroy(dial);
}
+ ast_free(dial_list);
ast_module_user_remove(u);
return -1;