Wed Jan 8 2020 09:49:53

Asterisk developer's documentation


app_directed_pickup.c File Reference

Directed Call Pickup Support. More...

#include "asterisk.h"
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/lock.h"
#include "asterisk/app.h"
#include "asterisk/features.h"
#include "asterisk/manager.h"
#include "asterisk/callerid.h"
#include "asterisk/cel.h"

Go to the source code of this file.

Data Structures

struct  pickup_by_name_args
 

Macros

#define PICKUPMARK   "PICKUPMARK"
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
static int find_by_mark (void *obj, void *arg, void *data, int flags)
 
static int find_by_part (void *obj, void *arg, void *data, int flags)
 
static int find_channel_by_group (void *obj, void *arg, void *data, int flags)
 
static int load_module (void)
 
static struct ast_channelmy_ast_get_channel_by_name_locked (const char *channame)
 Helper Function to walk through ALL channels checking NAME and STATE. More...
 
static int pickup_by_channel (struct ast_channel *chan, char *pickup)
 Attempt to pick up named channel, does not use context. More...
 
static int pickup_by_exten (struct ast_channel *chan, const char *exten, const char *context)
 
static int pickup_by_group (struct ast_channel *chan)
 
static int pickup_by_mark (struct ast_channel *chan, const char *mark)
 
static int pickup_by_name_cb (void *obj, void *arg, void *data, int flags)
 
static int pickup_by_part (struct ast_channel *chan, const char *part)
 
static int pickup_exec (struct ast_channel *chan, const char *data)
 
static int pickupchan_exec (struct ast_channel *chan, const char *data)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Directed Call Pickup Application" , .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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
 
static const char app [] = "Pickup"
 
static const char app2 [] = "PickupChan"
 
static struct ast_module_infoast_module_info = &__mod_info
 

Detailed Description

Directed Call Pickup Support.

Author
Joshua Colp jcolp.nosp@m.@dig.nosp@m.ium.c.nosp@m.om
Gary Cook

Definition in file app_directed_pickup.c.

Macro Definition Documentation

#define PICKUPMARK   "PICKUPMARK"

Definition at line 51 of file app_directed_pickup.c.

Referenced by find_by_mark(), and pickup_exec().

Function Documentation

static void __reg_module ( void  )
static

Definition at line 419 of file app_directed_pickup.c.

static void __unreg_module ( void  )
static

Definition at line 419 of file app_directed_pickup.c.

static int find_by_mark ( void *  obj,
void *  arg,
void *  data,
int  flags 
)
static

< Potential pickup target

Definition at line 221 of file app_directed_pickup.c.

References ast_can_pickup(), ast_channel_lock, ast_channel_unlock, CMP_MATCH, CMP_STOP, ast_channel::data, pbx_builtin_getvar_helper(), and PICKUPMARK.

Referenced by pickup_by_mark().

222 {
223  struct ast_channel *target = obj;/*!< Potential pickup target */
224  const char *mark = data;
225  const char *tmp;
226 
227  ast_channel_lock(target);
228  tmp = pbx_builtin_getvar_helper(target, PICKUPMARK);
229  if (tmp && !strcasecmp(tmp, mark) && ast_can_pickup(target)) {
230  /* Return with the channel still locked on purpose */
231  return CMP_MATCH | CMP_STOP;
232  }
233  ast_channel_unlock(target);
234 
235  return 0;
236 }
#define ast_channel_lock(chan)
Definition: channel.h:2466
Main Channel structure associated with a channel.
Definition: channel.h:742
const char * data
Definition: channel.h:755
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
Definition: pbx.c:10475
#define ast_channel_unlock(chan)
Definition: channel.h:2467
int ast_can_pickup(struct ast_channel *chan)
Test if a channel can be picked up.
Definition: features.c:7338
#define PICKUPMARK
static int find_by_part ( void *  obj,
void *  arg,
void *  data,
int  flags 
)
static

< Potential pickup target

Definition at line 321 of file app_directed_pickup.c.

References ast_can_pickup(), ast_channel_lock, ast_channel_unlock, CMP_MATCH, CMP_STOP, ast_channel::data, len(), and ast_channel::name.

Referenced by pickup_by_part().

322 {
323  struct ast_channel *target = obj;/*!< Potential pickup target */
324  const char *part = data;
325  int len = strlen(part);
326 
327  ast_channel_lock(target);
328  if (len <= strlen(target->name) && !strncmp(target->name, part, len)
329  && ast_can_pickup(target)) {
330  /* Return with the channel still locked on purpose */
331  return CMP_MATCH | CMP_STOP;
332  }
333  ast_channel_unlock(target);
334 
335  return 0;
336 }
#define ast_channel_lock(chan)
Definition: channel.h:2466
Main Channel structure associated with a channel.
Definition: channel.h:742
const char * data
Definition: channel.h:755
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
const ast_string_field name
Definition: channel.h:787
#define ast_channel_unlock(chan)
Definition: channel.h:2467
int ast_can_pickup(struct ast_channel *chan)
Test if a channel can be picked up.
Definition: features.c:7338
static int find_channel_by_group ( void *  obj,
void *  arg,
void *  data,
int  flags 
)
static

< Potential pickup target

< Channel wanting to pickup call

Definition at line 255 of file app_directed_pickup.c.

References ast_can_pickup(), ast_channel_lock, ast_channel_unlock, ast_channel::callgroup, CMP_MATCH, CMP_STOP, ast_channel::data, and ast_channel::pickupgroup.

Referenced by pickup_by_group().

256 {
257  struct ast_channel *target = obj;/*!< Potential pickup target */
258  struct ast_channel *chan = data;/*!< Channel wanting to pickup call */
259 
260  ast_channel_lock(target);
261  if (chan != target && (chan->pickupgroup & target->callgroup)
262  && ast_can_pickup(target)) {
263  /* Return with the channel still locked on purpose */
264  return CMP_MATCH | CMP_STOP;
265  }
266  ast_channel_unlock(target);
267 
268  return 0;
269 }
#define ast_channel_lock(chan)
Definition: channel.h:2466
Main Channel structure associated with a channel.
Definition: channel.h:742
const char * data
Definition: channel.h:755
ast_group_t pickupgroup
Definition: channel.h:819
ast_group_t callgroup
Definition: channel.h:818
#define ast_channel_unlock(chan)
Definition: channel.h:2467
int ast_can_pickup(struct ast_channel *chan)
Test if a channel can be picked up.
Definition: features.c:7338
static int load_module ( void  )
static

Definition at line 409 of file app_directed_pickup.c.

References ast_register_application_xml, pickup_exec(), and pickupchan_exec().

410 {
411  int res;
412 
415 
416  return res;
417 }
static const char app[]
static int pickup_exec(struct ast_channel *chan, const char *data)
static int pickupchan_exec(struct ast_channel *chan, const char *data)
static const char app2[]
#define ast_register_application_xml(app, execute)
Register an application using XML documentation.
Definition: module.h:437
static struct ast_channel* my_ast_get_channel_by_name_locked ( const char *  channame)
static

Helper Function to walk through ALL channels checking NAME and STATE.

Definition at line 143 of file app_directed_pickup.c.

References ast_alloca, ast_channel_callback(), pickup_by_name_args::len, pickup_by_name_args::name, and pickup_by_name_cb().

Referenced by pickup_by_channel().

144 {
145  char *chkchan;
146  struct pickup_by_name_args pickup_args;
147 
148  /* Check if channel name contains a '-'.
149  * In this case the channel name will be interpreted as full channel name.
150  */
151  if (strchr(channame, '-')) {
152  /* check full channel name */
153  pickup_args.len = strlen(channame);
154  pickup_args.name = channame;
155  } else {
156  /* need to append a '-' for the comparison so we check full channel name,
157  * i.e SIP/hgc- , use a temporary variable so original stays the same for
158  * debugging.
159  */
160  pickup_args.len = strlen(channame) + 1;
161  chkchan = ast_alloca(pickup_args.len + 1);
162  strcpy(chkchan, channame);
163  strcat(chkchan, "-");
164  pickup_args.name = chkchan;
165  }
166 
167  return ast_channel_callback(pickup_by_name_cb, NULL, &pickup_args, 0);
168 }
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: utils.h:653
struct ast_channel * ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Call a function with every active channel.
Definition: channel.c:1634
static int pickup_by_name_cb(void *obj, void *arg, void *data, int flags)
static int pickup_by_channel ( struct ast_channel chan,
char *  pickup 
)
static

Attempt to pick up named channel, does not use context.

< Potential pickup target

Definition at line 171 of file app_directed_pickup.c.

References ast_channel_unlock, ast_channel_unref, ast_do_pickup(), and my_ast_get_channel_by_name_locked().

Referenced by pickupchan_exec().

172 {
173  int res = -1;
174  struct ast_channel *target;/*!< Potential pickup target */
175 
176  target = my_ast_get_channel_by_name_locked(pickup);
177  if (target) {
178  /* Just check that we are not picking up the SAME as target. (i.e. ourself) */
179  if (chan != target) {
180  res = ast_do_pickup(chan, target);
181  }
182  ast_channel_unlock(target);
183  target = ast_channel_unref(target);
184  }
185 
186  return res;
187 }
Main Channel structure associated with a channel.
Definition: channel.h:742
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2502
#define ast_channel_unlock(chan)
Definition: channel.h:2467
int ast_do_pickup(struct ast_channel *chan, struct ast_channel *target)
Pickup a call target.
Definition: features.c:7414
static struct ast_channel * my_ast_get_channel_by_name_locked(const char *channame)
Helper Function to walk through ALL channels checking NAME and STATE.
static int pickup_by_exten ( struct ast_channel chan,
const char *  exten,
const char *  context 
)
static

< Potential pickup target

Definition at line 190 of file app_directed_pickup.c.

References ast_can_pickup(), ast_channel_iterator_by_exten_new(), ast_channel_iterator_destroy(), ast_channel_iterator_next(), ast_channel_lock, ast_channel_unlock, ast_channel_unref, ast_do_pickup(), ast_log(), LOG_NOTICE, and ast_channel::name.

Referenced by pickup_exec().

191 {
192  struct ast_channel *target = NULL;/*!< Potential pickup target */
193  struct ast_channel_iterator *iter;
194  int res = -1;
195 
197  return -1;
198  }
199 
200  while ((target = ast_channel_iterator_next(iter))) {
201  ast_channel_lock(target);
202  if ((chan != target) && ast_can_pickup(target)) {
203  ast_log(LOG_NOTICE, "%s pickup by %s\n", target->name, chan->name);
204  break;
205  }
206  ast_channel_unlock(target);
207  target = ast_channel_unref(target);
208  }
209 
211 
212  if (target) {
213  res = ast_do_pickup(chan, target);
214  ast_channel_unlock(target);
215  target = ast_channel_unref(target);
216  }
217 
218  return res;
219 }
#define ast_channel_lock(chan)
Definition: channel.h:2466
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:109
Main Channel structure associated with a channel.
Definition: channel.h:742
struct ast_channel * ast_channel_iterator_next(struct ast_channel_iterator *i)
Get the next channel for a channel iterator.
Definition: channel.c:1715
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2502
struct ast_channel_iterator * ast_channel_iterator_by_exten_new(const char *exten, const char *context)
Create a new channel iterator based on extension.
Definition: channel.c:1691
const ast_string_field name
Definition: channel.h:787
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
#define LOG_NOTICE
Definition: logger.h:133
#define ast_channel_unlock(chan)
Definition: channel.h:2467
int ast_do_pickup(struct ast_channel *chan, struct ast_channel *target)
Pickup a call target.
Definition: features.c:7414
struct ast_channel_iterator * ast_channel_iterator_destroy(struct ast_channel_iterator *i)
Destroy a channel iterator.
Definition: channel.c:1649
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:107
int ast_can_pickup(struct ast_channel *chan)
Test if a channel can be picked up.
Definition: features.c:7338
static int pickup_by_group ( struct ast_channel chan)
static

< Potential pickup target

Definition at line 271 of file app_directed_pickup.c.

References ast_channel_callback(), ast_channel_unlock, ast_channel_unref, ast_do_pickup(), ast_log(), find_channel_by_group(), LOG_NOTICE, and ast_channel::name.

Referenced by pickup_exec().

272 {
273  struct ast_channel *target;/*!< Potential pickup target */
274  int res = -1;
275 
276  /* The found channel is already locked. */
277  target = ast_channel_callback(find_channel_by_group, NULL, chan, 0);
278  if (target) {
279  ast_log(LOG_NOTICE, "pickup %s attempt by %s\n", target->name, chan->name);
280  res = ast_do_pickup(chan, target);
281  ast_channel_unlock(target);
282  target = ast_channel_unref(target);
283  }
284 
285  return res;
286 }
Main Channel structure associated with a channel.
Definition: channel.h:742
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2502
static int find_channel_by_group(void *obj, void *arg, void *data, int flags)
struct ast_channel * ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Call a function with every active channel.
Definition: channel.c:1634
const ast_string_field name
Definition: channel.h:787
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
#define LOG_NOTICE
Definition: logger.h:133
#define ast_channel_unlock(chan)
Definition: channel.h:2467
int ast_do_pickup(struct ast_channel *chan, struct ast_channel *target)
Pickup a call target.
Definition: features.c:7414
static int pickup_by_mark ( struct ast_channel chan,
const char *  mark 
)
static

< Potential pickup target

Definition at line 239 of file app_directed_pickup.c.

References ast_channel_callback(), ast_channel_unlock, ast_channel_unref, ast_do_pickup(), and find_by_mark().

Referenced by pickup_exec().

240 {
241  struct ast_channel *target;/*!< Potential pickup target */
242  int res = -1;
243 
244  /* The found channel is already locked. */
245  target = ast_channel_callback(find_by_mark, NULL, (char *) mark, 0);
246  if (target) {
247  res = ast_do_pickup(chan, target);
248  ast_channel_unlock(target);
249  target = ast_channel_unref(target);
250  }
251 
252  return res;
253 }
Main Channel structure associated with a channel.
Definition: channel.h:742
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2502
static int find_by_mark(void *obj, void *arg, void *data, int flags)
struct ast_channel * ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Call a function with every active channel.
Definition: channel.c:1634
#define ast_channel_unlock(chan)
Definition: channel.h:2467
int ast_do_pickup(struct ast_channel *chan, struct ast_channel *target)
Pickup a call target.
Definition: features.c:7414
static int pickup_by_name_cb ( void *  obj,
void *  arg,
void *  data,
int  flags 
)
static

< Potential pickup target

Definition at line 127 of file app_directed_pickup.c.

References args, ast_can_pickup(), ast_channel_lock, ast_channel_unlock, CMP_MATCH, CMP_STOP, pickup_by_name_args::len, pickup_by_name_args::name, and ast_channel::name.

Referenced by my_ast_get_channel_by_name_locked().

128 {
129  struct ast_channel *target = obj;/*!< Potential pickup target */
130  struct pickup_by_name_args *args = data;
131 
132  ast_channel_lock(target);
133  if (!strncasecmp(target->name, args->name, args->len) && ast_can_pickup(target)) {
134  /* Return with the channel still locked on purpose */
135  return CMP_MATCH | CMP_STOP;
136  }
137  ast_channel_unlock(target);
138 
139  return 0;
140 }
#define ast_channel_lock(chan)
Definition: channel.h:2466
Main Channel structure associated with a channel.
Definition: channel.h:742
static struct @350 args
const ast_string_field name
Definition: channel.h:787
#define ast_channel_unlock(chan)
Definition: channel.h:2467
int ast_can_pickup(struct ast_channel *chan)
Test if a channel can be picked up.
Definition: features.c:7338
static int pickup_by_part ( struct ast_channel chan,
const char *  part 
)
static

< Potential pickup target

Definition at line 339 of file app_directed_pickup.c.

References ast_channel_callback(), ast_channel_unlock, ast_channel_unref, ast_do_pickup(), and find_by_part().

Referenced by pickupchan_exec().

340 {
341  struct ast_channel *target;/*!< Potential pickup target */
342  int res = -1;
343 
344  /* The found channel is already locked. */
345  target = ast_channel_callback(find_by_part, NULL, (char *) part, 0);
346  if (target) {
347  res = ast_do_pickup(chan, target);
348  ast_channel_unlock(target);
349  target = ast_channel_unref(target);
350  }
351 
352  return res;
353 }
Main Channel structure associated with a channel.
Definition: channel.h:742
static int find_by_part(void *obj, void *arg, void *data, int flags)
#define ast_channel_unref(c)
Decrease channel reference count.
Definition: channel.h:2502
struct ast_channel * ast_channel_callback(ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Call a function with every active channel.
Definition: channel.c:1634
#define ast_channel_unlock(chan)
Definition: channel.h:2467
int ast_do_pickup(struct ast_channel *chan, struct ast_channel *target)
Pickup a call target.
Definition: features.c:7414
static int pickup_exec ( struct ast_channel chan,
const char *  data 
)
static

Definition at line 289 of file app_directed_pickup.c.

References ast_log(), ast_strdupa, ast_strlen_zero(), context, ast_channel::context, exten, LOG_NOTICE, pickup_by_exten(), pickup_by_group(), pickup_by_mark(), PICKUPMARK, and strsep().

Referenced by load_module().

290 {
291  char *tmp = ast_strdupa(data);
292  char *exten = NULL, *context = NULL;
293 
294  if (ast_strlen_zero(data)) {
295  return pickup_by_group(chan) ? 0 : -1;
296  }
297 
298  /* Parse extension (and context if there) */
299  while (!ast_strlen_zero(tmp) && (exten = strsep(&tmp, "&"))) {
300  if ((context = strchr(exten, '@')))
301  *context++ = '\0';
302  if (!ast_strlen_zero(context) && !strcasecmp(context, PICKUPMARK)) {
303  if (!pickup_by_mark(chan, exten)) {
304  /* Pickup successful. Stop the dialplan this channel is a zombie. */
305  return -1;
306  }
307  } else {
308  if (!pickup_by_exten(chan, exten, !ast_strlen_zero(context) ? context : chan->context)) {
309  /* Pickup successful. Stop the dialplan this channel is a zombie. */
310  return -1;
311  }
312  }
313  ast_log(LOG_NOTICE, "No target channel found for %s.\n", exten);
314  }
315 
316  /* Pickup failed. Keep going in the dialplan. */
317  return 0;
318 }
static char exten[AST_MAX_EXTENSION]
Definition: chan_alsa.c:109
char * strsep(char **str, const char *delims)
char context[AST_MAX_CONTEXT]
Definition: channel.h:868
static int pickup_by_mark(struct ast_channel *chan, const char *mark)
static int pickup_by_exten(struct ast_channel *chan, const char *exten, const char *context)
const char * data
Definition: channel.h:755
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:63
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: utils.h:663
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
#define LOG_NOTICE
Definition: logger.h:133
static int pickup_by_group(struct ast_channel *chan)
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:107
#define PICKUPMARK
static int pickupchan_exec ( struct ast_channel chan,
const char *  data 
)
static

Definition at line 356 of file app_directed_pickup.c.

References args, AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_log(), AST_STANDARD_APP_ARGS, ast_strdupa, ast_strlen_zero(), LOG_NOTICE, LOG_WARNING, ast_channel::name, parse(), pickup_by_channel(), pickup_by_part(), and strsep().

Referenced by load_module().

357 {
358  int partial_pickup = 0;
359  char *pickup = NULL;
360  char *parse = ast_strdupa(data);
362  AST_APP_ARG(channel);
363  AST_APP_ARG(options);
364  );
365  AST_STANDARD_APP_ARGS(args, parse);
366 
367  if (ast_strlen_zero(args.channel)) {
368  ast_log(LOG_WARNING, "PickupChan requires an argument (channel)!\n");
369  /* Pickup failed. Keep going in the dialplan. */
370  return 0;
371  }
372 
373  if (!ast_strlen_zero(args.options) && strchr(args.options, 'p')) {
374  partial_pickup = 1;
375  }
376 
377  /* Parse channel */
378  while (!ast_strlen_zero(args.channel) && (pickup = strsep(&args.channel, "&"))) {
379  if (!strncasecmp(chan->name, pickup, strlen(pickup))) {
380  ast_log(LOG_NOTICE, "Cannot pickup your own channel %s.\n", pickup);
381  } else {
382  if (partial_pickup) {
383  if (!pickup_by_part(chan, pickup)) {
384  /* Pickup successful. Stop the dialplan this channel is a zombie. */
385  return -1;
386  }
387  } else if (!pickup_by_channel(chan, pickup)) {
388  /* Pickup successful. Stop the dialplan this channel is a zombie. */
389  return -1;
390  }
391  ast_log(LOG_NOTICE, "No target channel found for %s.\n", pickup);
392  }
393  }
394 
395  /* Pickup failed. Keep going in the dialplan. */
396  return 0;
397 }
char * strsep(char **str, const char *delims)
static int pickup_by_channel(struct ast_channel *chan, char *pickup)
Attempt to pick up named channel, does not use context.
#define LOG_WARNING
Definition: logger.h:144
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application&#39;s arguments.
Definition: app.h:572
const char * data
Definition: channel.h:755
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:63
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: utils.h:663
static int pickup_by_part(struct ast_channel *chan, const char *part)
static struct @350 args
const ast_string_field name
Definition: channel.h:787
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
#define LOG_NOTICE
Definition: logger.h:133
static void parse(struct mgcp_request *req)
Definition: chan_mgcp.c:1858
#define AST_APP_ARG(name)
Define an application argument.
Definition: app.h:555
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the &#39;standard&#39; argument separation process for an application.
Definition: app.h:604
static int unload_module ( void  )
static

Definition at line 399 of file app_directed_pickup.c.

References ast_unregister_application().

400 {
401  int res;
402 
405 
406  return res;
407 }
int ast_unregister_application(const char *app)
Unregister an application.
Definition: pbx.c:7705
static const char app[]
static const char app2[]

Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Directed Call Pickup Application" , .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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
static

Definition at line 419 of file app_directed_pickup.c.

const char app[] = "Pickup"
static

Definition at line 119 of file app_directed_pickup.c.

const char app2[] = "PickupChan"
static

Definition at line 120 of file app_directed_pickup.c.

Referenced by _macro_exec(), and app_cmp().

Definition at line 419 of file app_directed_pickup.c.