Asterisk - The Open Source Telephony Project GIT-master-5782b03
Data Structures | Macros | Enumerations | Functions | Variables
app_page.c File Reference

page() - Paging application More...

#include "asterisk.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/file.h"
#include "asterisk/app.h"
#include "asterisk/chanvars.h"
#include "asterisk/utils.h"
#include "asterisk/devicestate.h"
#include "asterisk/dial.h"
Include dependency graph for app_page.c:

Go to the source code of this file.

Data Structures

struct  page_options
 

Macros

#define PAGE_BEEP   "beep"
 

Enumerations

enum  { OPT_ARG_ANNOUNCE = 0 , OPT_ARG_PREDIAL_CALLEE = 1 , OPT_ARG_PREDIAL_CALLER = 2 , OPT_ARG_ARRAY_SIZE = 3 }
 
enum  page_opt_flags {
  PAGE_DUPLEX = (1 << 0) , PAGE_QUIET = (1 << 1) , PAGE_RECORD = (1 << 2) , PAGE_SKIP = (1 << 3) ,
  PAGE_IGNORE_FORWARDS = (1 << 4) , PAGE_ANNOUNCE = (1 << 5) , PAGE_NOCALLERANNOUNCE = (1 << 6) , PAGE_PREDIAL_CALLEE = (1 << 7) ,
  PAGE_PREDIAL_CALLER = (1 << 8)
}
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int load_module (void)
 
static int page_exec (struct ast_channel *chan, const char *data)
 
static void page_state_callback (struct ast_dial *dial)
 
static void setup_profile_bridge (struct ast_channel *chan, struct page_options *options)
 
static void setup_profile_caller (struct ast_channel *chan, struct page_options *options)
 
static void setup_profile_paged (struct ast_channel *chan, struct page_options *options)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Page Multiple Phones" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .requires = "app_confbridge", }
 
static const char *const app_page = "Page"
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static const struct ast_app_option page_opts [128] = { [ 'b' ] = { .flag = PAGE_PREDIAL_CALLEE , .arg_index = OPT_ARG_PREDIAL_CALLEE + 1 }, [ 'B' ] = { .flag = PAGE_PREDIAL_CALLER , .arg_index = OPT_ARG_PREDIAL_CALLER + 1 }, [ 'd' ] = { .flag = PAGE_DUPLEX }, [ 'q' ] = { .flag = PAGE_QUIET }, [ 'r' ] = { .flag = PAGE_RECORD }, [ 's' ] = { .flag = PAGE_SKIP }, [ 'i' ] = { .flag = PAGE_IGNORE_FORWARDS }, [ 'A' ] = { .flag = PAGE_ANNOUNCE , .arg_index = OPT_ARG_ANNOUNCE + 1 }, [ 'n' ] = { .flag = PAGE_NOCALLERANNOUNCE }, }
 

Detailed Description

page() - Paging application

Author
Mark Spencer marks.nosp@m.ter@.nosp@m.digiu.nosp@m.m.co.nosp@m.m

Definition in file app_page.c.

Macro Definition Documentation

◆ PAGE_BEEP

#define PAGE_BEEP   "beep"

Definition at line 163 of file app_page.c.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
OPT_ARG_ANNOUNCE 
OPT_ARG_PREDIAL_CALLEE 
OPT_ARG_PREDIAL_CALLER 
OPT_ARG_ARRAY_SIZE 

Definition at line 144 of file app_page.c.

144 {
149};
@ OPT_ARG_PREDIAL_CALLEE
Definition: app_page.c:146
@ OPT_ARG_ANNOUNCE
Definition: app_page.c:145
@ OPT_ARG_PREDIAL_CALLER
Definition: app_page.c:147
@ OPT_ARG_ARRAY_SIZE
Definition: app_page.c:148

◆ page_opt_flags

Enumerator
PAGE_DUPLEX 
PAGE_QUIET 
PAGE_RECORD 
PAGE_SKIP 
PAGE_IGNORE_FORWARDS 
PAGE_ANNOUNCE 
PAGE_NOCALLERANNOUNCE 
PAGE_PREDIAL_CALLEE 
PAGE_PREDIAL_CALLER 

Definition at line 132 of file app_page.c.

132 {
133 PAGE_DUPLEX = (1 << 0),
134 PAGE_QUIET = (1 << 1),
135 PAGE_RECORD = (1 << 2),
136 PAGE_SKIP = (1 << 3),
137 PAGE_IGNORE_FORWARDS = (1 << 4),
138 PAGE_ANNOUNCE = (1 << 5),
139 PAGE_NOCALLERANNOUNCE = (1 << 6),
140 PAGE_PREDIAL_CALLEE = (1 << 7),
141 PAGE_PREDIAL_CALLER = (1 << 8),
142};
@ PAGE_NOCALLERANNOUNCE
Definition: app_page.c:139
@ PAGE_PREDIAL_CALLEE
Definition: app_page.c:140
@ PAGE_IGNORE_FORWARDS
Definition: app_page.c:137
@ PAGE_ANNOUNCE
Definition: app_page.c:138
@ PAGE_RECORD
Definition: app_page.c:135
@ PAGE_DUPLEX
Definition: app_page.c:133
@ PAGE_PREDIAL_CALLER
Definition: app_page.c:141
@ PAGE_SKIP
Definition: app_page.c:136
@ PAGE_QUIET
Definition: app_page.c:134

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 453 of file app_page.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 453 of file app_page.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 453 of file app_page.c.

◆ load_module()

static int load_module ( void  )
static

Definition at line 443 of file app_page.c.

444{
446}
static int page_exec(struct ast_channel *chan, const char *data)
Definition: app_page.c:244
static const char *const app_page
Definition: app_page.c:130
#define ast_register_application_xml(app, execute)
Register an application using XML documentation.
Definition: module.h:640

References app_page, ast_register_application_xml, and page_exec().

◆ page_exec()

static int page_exec ( struct ast_channel chan,
const char *  data 
)
static

Definition at line 244 of file app_page.c.

245{
246 char *tech;
247 char *resource;
248 char *tmp;
249 char *predial_callee = NULL;
250 char confbridgeopts[128];
251 char originator[AST_CHANNEL_NAME];
252 struct page_options options = { { 0, }, { 0, } };
253 unsigned int confid = ast_random();
254 struct ast_app *app;
255 int res = 0;
256 int pos = 0;
257 int i = 0;
258 struct ast_dial **dial_list;
259 unsigned int num_dials;
260 int timeout = 0;
261 char *parse;
262
267 );
268
269 if (!(app = pbx_findapp("ConfBridge"))) {
270 ast_log(LOG_WARNING, "There is no ConfBridge application available!\n");
271 return -1;
272 };
273
274 parse = ast_strdupa(data ?: "");
275
277
278 ast_copy_string(originator, ast_channel_name(chan), sizeof(originator));
279 if ((tmp = strchr(originator, '-'))) {
280 *tmp = '\0';
281 }
282
283 if (!ast_strlen_zero(args.options)) {
284 ast_app_parse_options(page_opts, &options.flags, options.opts, args.options);
285 }
286
287 if (!ast_strlen_zero(args.timeout)) {
288 timeout = atoi(args.timeout);
289 }
290
291 snprintf(confbridgeopts, sizeof(confbridgeopts), "ConfBridge,%u", confid);
292
293 /* Count number of extensions in list by number of ampersands + 1 */
294 num_dials = 1;
295 tmp = args.devices ?: "";
296 while (*tmp) {
297 if (*tmp == '&') {
298 num_dials++;
299 }
300 tmp++;
301 }
302
303 if (!(dial_list = ast_calloc(num_dials, sizeof(struct ast_dial *)))) {
304 ast_log(LOG_ERROR, "Can't allocate %ld bytes for dial list\n", (long)(sizeof(struct ast_dial *) * num_dials));
305 return -1;
306 }
307
308 /* PREDIAL: Preprocess any callee gosub arguments. */
312 predial_callee =
314 }
315
316 /* PREDIAL: Run gosub on the caller's channel */
321 }
322
323 /* Go through parsing/calling each device */
324 while ((tech = strsep(&args.devices, "&"))) {
325 int state = 0;
326 struct ast_dial *dial = NULL;
327
328 tech = ast_strip(tech);
329 if (ast_strlen_zero(tech)) {
330 /* No tech/resource in this position. */
331 continue;
332 }
333
334 /* don't call the originating device */
335 if (!strcasecmp(tech, originator)) {
336 continue;
337 }
338
339 /* If no resource is available, continue on */
340 if (!(resource = strchr(tech, '/'))) {
341 ast_log(LOG_WARNING, "Incomplete destination: '%s' supplied.\n", tech);
342 continue;
343 }
344
345 /* Ensure device is not in use if skip option is enabled */
346 if (ast_test_flag(&options.flags, PAGE_SKIP)) {
347 state = ast_device_state(tech);
348 if (state == AST_DEVICE_UNKNOWN) {
349 ast_verb(3, "Destination '%s' has device state '%s'. Paging anyway.\n",
350 tech, ast_devstate2str(state));
351 } else if (state != AST_DEVICE_NOT_INUSE) {
352 ast_verb(3, "Destination '%s' has device state '%s'.\n",
353 tech, ast_devstate2str(state));
354 continue;
355 }
356 }
357
358 *resource++ = '\0';
359
360 /* Create a dialing structure */
361 if (!(dial = ast_dial_create())) {
362 ast_log(LOG_WARNING, "Failed to create dialing structure.\n");
363 continue;
364 }
365
366 /* Append technology and resource */
367 if (ast_dial_append(dial, tech, resource, NULL) == -1) {
368 ast_log(LOG_ERROR, "Failed to add %s/%s to outbound dial\n", tech, resource);
369 ast_dial_destroy(dial);
370 continue;
371 }
372
373 /* Set ANSWER_EXEC as global option */
375
376 if (predial_callee) {
378 }
379
380 if (timeout) {
382 }
383
386 }
387
390
391 /* Run this dial in async mode */
392 ast_dial_run(dial, chan, 1);
393
394 /* Put in our dialing array */
395 dial_list[pos++] = dial;
396 }
397
398 ast_free(predial_callee);
399
400 if (!ast_test_flag(&options.flags, PAGE_QUIET)) {
402 ast_log(LOG_WARNING, "Missing required sound file: '" PAGE_BEEP "'\n");
403 } else {
405 if (!res) {
406 res = ast_waitstream(chan, "");
407 }
408 }
409 }
410
411 if (!res) {
414
415 snprintf(confbridgeopts, sizeof(confbridgeopts), "%u", confid);
416 pbx_exec(chan, app, confbridgeopts);
417 }
418
419 /* Go through each dial attempt cancelling, joining, and destroying */
420 for (i = 0; i < pos; i++) {
421 struct ast_dial *dial = dial_list[i];
422
423 /* We have to wait for the async thread to exit as it's possible ConfBridge won't throw them out immediately */
424 ast_dial_join(dial);
425
426 /* Hangup all channels */
427 ast_dial_hangup(dial);
428
429 /* Destroy dialing structure */
430 ast_dial_destroy(dial);
431 }
432
433 ast_free(dial_list);
434
435 return -1;
436}
static const char app[]
Definition: app_adsiprog.c:56
static void page_state_callback(struct ast_dial *dial)
Definition: app_page.c:229
static void setup_profile_caller(struct ast_channel *chan, struct page_options *options)
Definition: app_page.c:216
static void setup_profile_bridge(struct ast_channel *chan, struct page_options *options)
Definition: app_page.c:178
#define PAGE_BEEP
Definition: app_page.c:163
static const struct ast_app_option page_opts[128]
Definition: app_page.c:161
#define ast_free(a)
Definition: astmm.h:180
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define ast_log
Definition: astobj2.c:42
static int tmp()
Definition: bt_open.c:389
const char * ast_channel_name(const struct ast_channel *chan)
#define AST_CHANNEL_NAME
Definition: channel.h:173
const char * ast_channel_language(const struct ast_channel *chan)
const char * ast_devstate2str(enum ast_device_state devstate) attribute_pure
Convert device state to text string for output.
Definition: devicestate.c:237
ast_device_state
Device States.
Definition: devicestate.h:52
@ AST_DEVICE_UNKNOWN
Definition: devicestate.h:53
@ AST_DEVICE_NOT_INUSE
Definition: devicestate.h:54
void ast_dial_set_state_callback(struct ast_dial *dial, ast_dial_state_callback callback)
Set a callback for state changes.
Definition: dial.c:1269
int ast_dial_append(struct ast_dial *dial, const char *tech, const char *device, const struct ast_assigned_ids *assignedids)
Append a channel.
Definition: dial.c:280
struct ast_dial * ast_dial_create(void)
New dialing structure.
Definition: dial.c:223
void ast_dial_set_user_data(struct ast_dial *dial, void *user_data)
Set user data on a dial structure.
Definition: dial.c:1274
void ast_dial_set_global_timeout(struct ast_dial *dial, int timeout)
Set the maximum time (globally) allowed for trying to ring phones.
Definition: dial.c:1284
void ast_dial_hangup(struct ast_dial *dial)
Hangup channels.
Definition: dial.c:1074
enum ast_dial_result ast_dial_run(struct ast_dial *dial, struct ast_channel *chan, int async)
Execute dialing synchronously or asynchronously.
Definition: dial.c:935
enum ast_dial_result ast_dial_join(struct ast_dial *dial)
Cancel async thread.
Definition: dial.c:1017
@ AST_DIAL_OPTION_ANSWER_EXEC
Definition: dial.h:44
@ AST_DIAL_OPTION_PREDIAL
Definition: dial.h:47
@ AST_DIAL_OPTION_DISABLE_CALL_FORWARDING
Definition: dial.h:46
int ast_dial_destroy(struct ast_dial *dial)
Destroys a dialing structure.
Definition: dial.c:1091
int ast_dial_option_global_enable(struct ast_dial *dial, enum ast_dial_option option, void *data)
Enables an option globally.
Definition: dial.c:1145
int ast_streamfile(struct ast_channel *c, const char *filename, const char *preflang)
Streams a file.
Definition: file.c:1293
int ast_fileexists(const char *filename, const char *fmt, const char *preflang)
Checks for the existence of a given file.
Definition: file.c:1129
int ast_waitstream(struct ast_channel *c, const char *breakon)
Waits for a stream to stop or digit to be pressed.
Definition: file.c:1840
const char * ast_app_expand_sub_args(struct ast_channel *chan, const char *args)
Add missing context/exten to subroutine argument string.
Definition: main/app.c:278
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
int ast_app_exec_sub(struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const char *sub_args, int ignore_hangup)
Run a subroutine on a channel, placing an optional second channel into autoservice.
Definition: main/app.c:297
int ast_app_parse_options(const struct ast_app_option *options, struct ast_flags *flags, char **args, char *optstr)
Parses a string containing application options and sets flags/arguments.
Definition: main/app.c:3066
char * strsep(char **str, const char *delims)
#define LOG_ERROR
#define ast_verb(level,...)
#define LOG_WARNING
int pbx_exec(struct ast_channel *c, struct ast_app *app, const char *data)
Execute an application.
Definition: pbx_app.c:471
struct ast_app * pbx_findapp(const char *app)
Look up an application.
Definition: ael_main.c:165
#define NULL
Definition: resample.c:96
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: strings.h:223
ast_app: A registered application
Definition: pbx_app.c:45
Main dialing structure. Contains global options, channels being dialed, and more!
Definition: dial.c:48
int timeout
Definition: dial.c:50
const char * args
static struct test_options options
#define ast_test_flag(p, flag)
Definition: utils.h:63
long int ast_random(void)
Definition: utils.c:2312
void ast_replace_subargument_delimiter(char *s)
Replace '^' in a string with ','.
Definition: utils.c:2343

References app, args, AST_APP_ARG, ast_app_exec_sub(), ast_app_expand_sub_args(), ast_app_parse_options(), ast_calloc, ast_channel_language(), AST_CHANNEL_NAME, ast_channel_name(), ast_copy_string(), AST_DECLARE_APP_ARGS, AST_DEVICE_NOT_INUSE, AST_DEVICE_UNKNOWN, ast_devstate2str(), ast_dial_append(), ast_dial_create(), ast_dial_destroy(), ast_dial_hangup(), ast_dial_join(), AST_DIAL_OPTION_ANSWER_EXEC, AST_DIAL_OPTION_DISABLE_CALL_FORWARDING, ast_dial_option_global_enable(), AST_DIAL_OPTION_PREDIAL, ast_dial_run(), ast_dial_set_global_timeout(), ast_dial_set_state_callback(), ast_dial_set_user_data(), ast_fileexists(), ast_free, ast_log, ast_random(), ast_replace_subargument_delimiter(), AST_STANDARD_APP_ARGS, ast_strdupa, ast_streamfile(), ast_strip(), ast_strlen_zero(), ast_test_flag, ast_verb, ast_waitstream(), LOG_ERROR, LOG_WARNING, NULL, OPT_ARG_PREDIAL_CALLEE, OPT_ARG_PREDIAL_CALLER, options, PAGE_BEEP, PAGE_IGNORE_FORWARDS, page_opts, PAGE_PREDIAL_CALLEE, PAGE_PREDIAL_CALLER, PAGE_QUIET, PAGE_SKIP, page_state_callback(), pbx_exec(), pbx_findapp(), setup_profile_bridge(), setup_profile_caller(), strsep(), ast_dial::timeout, and tmp().

Referenced by load_module().

◆ page_state_callback()

static void page_state_callback ( struct ast_dial dial)
static

Definition at line 229 of file app_page.c.

230{
231 struct ast_channel *chan;
232 struct page_options *options;
233
235 !(chan = ast_dial_answered(dial)) ||
236 !(options = ast_dial_get_user_data(dial))) {
237 return;
238 }
239
242}
static void setup_profile_paged(struct ast_channel *chan, struct page_options *options)
Definition: app_page.c:194
enum ast_dial_result ast_dial_state(struct ast_dial *dial)
Return state of dial.
Definition: dial.c:1008
@ AST_DIAL_RESULT_ANSWERED
Definition: dial.h:61
struct ast_channel * ast_dial_answered(struct ast_dial *dial)
Return channel that answered.
Definition: dial.c:977
void * ast_dial_get_user_data(struct ast_dial *dial)
Return the user data on a dial structure.
Definition: dial.c:1279
Main Channel structure associated with a channel.

References ast_dial_answered(), ast_dial_get_user_data(), AST_DIAL_RESULT_ANSWERED, ast_dial_state(), options, setup_profile_bridge(), and setup_profile_paged().

Referenced by page_exec().

◆ setup_profile_bridge()

static void setup_profile_bridge ( struct ast_channel chan,
struct page_options options 
)
static

Definition at line 178 of file app_page.c.

179{
180 /* Use default_bridge as a starting point */
181 ast_func_write(chan, "CONFBRIDGE(bridge,template)", "");
182 if (ast_test_flag(&options->flags, PAGE_RECORD)) {
183 ast_func_write(chan, "CONFBRIDGE(bridge,record_conference)", "yes");
184 }
185}
int ast_func_write(struct ast_channel *chan, const char *function, const char *value)
executes a write operation on a function

References ast_func_write(), ast_test_flag, options, and PAGE_RECORD.

Referenced by page_exec(), and page_state_callback().

◆ setup_profile_caller()

static void setup_profile_caller ( struct ast_channel chan,
struct page_options options 
)
static

Definition at line 216 of file app_page.c.

217{
218 /* Use default_user as a starting point if not already setup. */
219 ast_func_write(chan, "CONFBRIDGE(user,template)", "");
220 ast_func_write(chan, "CONFBRIDGE(user,quiet)", "yes");
221 ast_func_write(chan, "CONFBRIDGE(user,marked)", "yes");
225 ast_func_write(chan, "CONFBRIDGE(user,announcement)", options->opts[OPT_ARG_ANNOUNCE]);
226 }
227}

References ast_func_write(), ast_strlen_zero(), ast_test_flag, OPT_ARG_ANNOUNCE, options, PAGE_ANNOUNCE, and PAGE_NOCALLERANNOUNCE.

Referenced by page_exec().

◆ setup_profile_paged()

static void setup_profile_paged ( struct ast_channel chan,
struct page_options options 
)
static

Definition at line 194 of file app_page.c.

195{
196 /* Use default_user as a starting point */
197 ast_func_write(chan, "CONFBRIDGE(user,template)", "");
198 ast_func_write(chan, "CONFBRIDGE(user,quiet)", "yes");
199 ast_func_write(chan, "CONFBRIDGE(user,end_marked)", "yes");
200 if (!ast_test_flag(&options->flags, PAGE_DUPLEX)) {
201 ast_func_write(chan, "CONFBRIDGE(user,startmuted)", "yes");
202 }
205 ast_func_write(chan, "CONFBRIDGE(user,announcement)", options->opts[OPT_ARG_ANNOUNCE]);
206 }
207}

References ast_func_write(), ast_strlen_zero(), ast_test_flag, OPT_ARG_ANNOUNCE, options, PAGE_ANNOUNCE, and PAGE_DUPLEX.

Referenced by page_state_callback().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 438 of file app_page.c.

439{
441}
int ast_unregister_application(const char *app)
Unregister an application.
Definition: pbx_app.c:392

References app_page, and ast_unregister_application().

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Page Multiple Phones" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .requires = "app_confbridge", }
static

Definition at line 453 of file app_page.c.

◆ app_page

const char* const app_page = "Page"
static

Definition at line 130 of file app_page.c.

Referenced by load_module(), and unload_module().

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 453 of file app_page.c.

◆ page_opts

const struct ast_app_option page_opts[128] = { [ 'b' ] = { .flag = PAGE_PREDIAL_CALLEE , .arg_index = OPT_ARG_PREDIAL_CALLEE + 1 }, [ 'B' ] = { .flag = PAGE_PREDIAL_CALLER , .arg_index = OPT_ARG_PREDIAL_CALLER + 1 }, [ 'd' ] = { .flag = PAGE_DUPLEX }, [ 'q' ] = { .flag = PAGE_QUIET }, [ 'r' ] = { .flag = PAGE_RECORD }, [ 's' ] = { .flag = PAGE_SKIP }, [ 'i' ] = { .flag = PAGE_IGNORE_FORWARDS }, [ 'A' ] = { .flag = PAGE_ANNOUNCE , .arg_index = OPT_ARG_ANNOUNCE + 1 }, [ 'n' ] = { .flag = PAGE_NOCALLERANNOUNCE }, }
static

Definition at line 161 of file app_page.c.

Referenced by page_exec().