Asterisk - The Open Source Telephony Project  GIT-master-a24979a
Data Structures | Macros | Typedefs | Enumerations | Functions
include/asterisk/app.h File Reference

Application convenience functions, designed to give consistent look and feel to Asterisk apps. More...

#include "asterisk/stringfields.h"
#include "asterisk/strings.h"
#include "asterisk/threadstorage.h"
#include "asterisk/file.h"
#include "asterisk/linkedlists.h"
#include "asterisk/utils.h"
#include "asterisk/stasis.h"
Include dependency graph for include/asterisk/app.h:

Go to the source code of this file.

Data Structures

struct  ast_app_option
 A structure to hold the description of an application 'option'. More...
 
struct  ast_app_stack_funcs
 Stack applications callback functions. More...
 
struct  ast_ivr_menu
 
struct  ast_ivr_option
 
struct  ast_vm_functions
 Voicemail function table definition. More...
 
struct  ast_vm_greeter_functions
 Voicemail greeter function table definition. More...
 
struct  ast_vm_mailbox_snapshot
 
struct  ast_vm_msg_snapshot
 
struct  ast_vm_recording_data
 Structure used for ast_copy_recording_to_vm in order to cleanly supply data needed for making the recording from the recorded file. More...
 

Macros

#define AST_APP_ARG(name)   char *name
 Define an application argument. More...
 
#define AST_APP_OPTION(option, flagno)    [option] = { .flag = flagno }
 Declares an application option that does not accept an argument. More...
 
#define AST_APP_OPTION_ARG(option, flagno, argno)    [option] = { .flag = flagno, .arg_index = argno + 1 }
 Declares an application option that accepts an argument. More...
 
#define AST_APP_OPTIONS(holder, options...)    static const struct ast_app_option holder[128] = options
 Declares an array of options for an application. More...
 
#define ast_app_separate_args(a, b, c, d)   __ast_app_separate_args(a,b,1,c,d)
 
#define AST_DECLARE_APP_ARGS(name, arglist)   AST_DEFINE_APP_ARGS_TYPE(argtype_##name, arglist) name = { 0, }
 Declare a structure to hold an application's arguments. More...
 
#define AST_DEFINE_APP_ARGS_TYPE(type, arglist)
 Define a structure type to hold an application's arguments. More...
 
#define AST_IVR_DECLARE_MENU(holder, title, flags, foo...)
 
#define AST_IVR_FLAG_AUTORESTART   (1 << 0)
 
#define AST_NONSTANDARD_APP_ARGS(args, parse, sep)    args.argc = __ast_app_separate_args(parse, sep, 1, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))
 Performs the 'nonstandard' argument separation process for an application. More...
 
#define AST_NONSTANDARD_RAW_ARGS(args, parse, sep)    args.argc = __ast_app_separate_args(parse, sep, 0, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))
 
#define AST_STANDARD_APP_ARGS(args, parse)    args.argc = __ast_app_separate_args(parse, ',', 1, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))
 Performs the 'standard' argument separation process for an application. More...
 
#define AST_STANDARD_RAW_ARGS(args, parse)    args.argc = __ast_app_separate_args(parse, ',', 0, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))
 
#define ast_vm_greeter_register(vm_table)   __ast_vm_greeter_register(vm_table, AST_MODULE_SELF)
 See __ast_vm_greeter_register() More...
 
#define ast_vm_register(vm_table)   __ast_vm_register(vm_table, AST_MODULE_SELF)
 See __ast_vm_register() More...
 
#define BEGIN_OPTIONS   {
 
#define END_OPTIONS   }
 
#define VM_GREETER_MODULE_VERSION   1
 
#define VM_MODULE_VERSION   2
 

Typedefs

typedef int() ast_copy_recording_to_vm_fn(struct ast_vm_recording_data *vm_rec_data)
 Creates a voicemail based on a specified file to a mailbox. More...
 
typedef int() ast_has_voicemail_fn(const char *mailboxes, const char *folder)
 Determines if the given folder has messages. More...
 
typedef int() ast_inboxcount2_fn(const char *mailboxes, int *urgentmsgs, int *newmsgs, int *oldmsgs)
 Gets the number of messages that exist for the mailbox list. More...
 
typedef int() ast_inboxcount_fn(const char *mailboxes, int *newmsgs, int *oldmsgs)
 Gets the number of messages that exist for the mailbox list. More...
 
typedef int() ast_ivr_callback(struct ast_channel *chan, char *option, void *cbdata)
 Callback function for IVR. More...
 
typedef int() ast_messagecount_fn(const char *mailbox_id, const char *folder)
 Gets the number of messages that exist in a mailbox folder. More...
 
typedef int() ast_sayname_fn(struct ast_channel *chan, const char *mailbox_id)
 Play a recorded user name for the mailbox to the specified channel. More...
 
typedef const char *() ast_vm_index_to_foldername_fn(int id)
 Convert the mailbox folder id to a folder name. More...
 
typedef struct ast_vm_mailbox_snapshot *() ast_vm_mailbox_snapshot_create_fn(const char *user, const char *context, const char *folder, int descending, enum ast_vm_snapshot_sort_val sort_val, int combine_INBOX_and_OLD)
 Create a snapshot of a mailbox which contains information about every msg. More...
 
typedef struct ast_vm_mailbox_snapshot *() ast_vm_mailbox_snapshot_destroy_fn(struct ast_vm_mailbox_snapshot *mailbox_snapshot)
 destroy a snapshot More...
 
typedef int() ast_vm_msg_forward_fn(const char *from_mailbox, const char *from_context, const char *from_folder, const char *to_mailbox, const char *to_context, const char *to_folder, size_t num_msgs, const char *msg_ids[], int delete_old)
 forward a message from one mailbox to another. More...
 
typedef int() ast_vm_msg_move_fn(const char *mailbox, const char *context, size_t num_msgs, const char *oldfolder, const char *old_msg_ids[], const char *newfolder)
 Move messages from one folder to another. More...
 
typedef void() ast_vm_msg_play_cb(struct ast_channel *chan, const char *playfile, int duration)
 Voicemail playback callback function definition. More...
 
typedef int() ast_vm_msg_play_fn(struct ast_channel *chan, const char *mailbox, const char *context, const char *folder, const char *msg_num, ast_vm_msg_play_cb *cb)
 Play a voicemail msg back on a channel. More...
 
typedef int() ast_vm_msg_remove_fn(const char *mailbox, const char *context, size_t num_msgs, const char *folder, const char *msgs[])
 Remove/delete messages from a mailbox folder. More...
 

Enumerations

enum  ast_getdata_result {
  AST_GETDATA_FAILED = -1 , AST_GETDATA_COMPLETE = 0 , AST_GETDATA_TIMEOUT = 1 , AST_GETDATA_INTERRUPTED = 2 ,
  AST_GETDATA_EMPTY_END_TERMINATED = 3
}
 
enum  ast_ivr_action {
  AST_ACTION_UPONE , AST_ACTION_EXIT , AST_ACTION_CALLBACK , AST_ACTION_PLAYBACK ,
  AST_ACTION_BACKGROUND , AST_ACTION_PLAYLIST , AST_ACTION_MENU , AST_ACTION_REPEAT ,
  AST_ACTION_RESTART , AST_ACTION_TRANSFER , AST_ACTION_WAITOPTION , AST_ACTION_NOOP ,
  AST_ACTION_BACKLIST
}
 
enum  AST_LOCK_RESULT { AST_LOCK_SUCCESS = 0 , AST_LOCK_TIMEOUT = -1 , AST_LOCK_PATH_NOT_FOUND = -2 , AST_LOCK_FAILURE = -3 }
 
enum  AST_LOCK_TYPE { AST_LOCK_TYPE_LOCKFILE = 0 , AST_LOCK_TYPE_FLOCK = 1 }
 Type of locking to use in ast_lock_path / ast_unlock_path. More...
 
enum  ast_record_if_exists { AST_RECORD_IF_EXISTS_ERROR = -1 , AST_RECORD_IF_EXISTS_FAIL , AST_RECORD_IF_EXISTS_OVERWRITE , AST_RECORD_IF_EXISTS_APPEND }
 
enum  ast_timelen { TIMELEN_HOURS , TIMELEN_MINUTES , TIMELEN_SECONDS , TIMELEN_MILLISECONDS }
 
enum  ast_vm_snapshot_sort_val { AST_VM_SNAPSHOT_SORT_BY_ID = 0 , AST_VM_SNAPSHOT_SORT_BY_TIME }
 

Functions

unsigned int __ast_app_separate_args (char *buf, char delim, int remove_chars, char **array, int arraylen)
 Separate a string into arguments in an array. More...
 
int __ast_vm_greeter_register (const struct ast_vm_greeter_functions *vm_table, struct ast_module *module)
 Set voicemail greeter function callbacks. More...
 
int __ast_vm_register (const struct ast_vm_functions *vm_table, struct ast_module *module)
 Set voicemail function callbacks. More...
 
int app_init (void)
 Initialize the application core. More...
 
int ast_app_copy_recording_to_vm (struct ast_vm_recording_data *vm_rec_data)
 param[in] vm_rec_data Contains data needed to make the recording. retval 0 voicemail successfully created from recording. retval -1 Failure More...
 
int ast_app_dtget (struct ast_channel *chan, const char *context, char *collect, size_t size, int maxlen, int timeout)
 Present a dialtone and collect a certain length extension. More...
 
int ast_app_exec_macro (struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const char *macro_args)
 Run a macro on a channel, placing an optional second channel into autoservice. More...
 
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. More...
 
const char * ast_app_expand_sub_args (struct ast_channel *chan, const char *args)
 Add missing context/exten to subroutine argument string. More...
 
int ast_app_getdata (struct ast_channel *c, const char *prompt, char *s, int maxlen, int timeout)
 Plays a stream and gets DTMF data from a channel. More...
 
int ast_app_getdata_full (struct ast_channel *c, const char *prompt, char *s, int maxlen, int timeout, int audiofd, int ctrlfd)
 Full version with audiofd and controlfd. NOTE: returns '2' on ctrlfd available, not '1' like other full functions. More...
 
int ast_app_getdata_terminator (struct ast_channel *c, const char *prompt, char *s, int maxlen, int timeout, char *terminator)
 Plays a stream and gets DTMF data from a channel. More...
 
int ast_app_group_discard (struct ast_channel *chan)
 Discard all group counting for a channel. More...
 
int ast_app_group_get_count (const char *group, const char *category)
 Get the current channel count of the specified group and category. More...
 
struct ast_group_infoast_app_group_list_head (void)
 Get the head of the group count list. More...
 
int ast_app_group_list_rdlock (void)
 Read Lock the group count list. More...
 
int ast_app_group_list_unlock (void)
 Unlock the group count list. More...
 
int ast_app_group_list_wrlock (void)
 Write Lock the group count list. More...
 
int ast_app_group_match_get_count (const char *groupmatch, const char *category)
 Get the current channel count of all groups that match the specified pattern and category. More...
 
int ast_app_group_set_channel (struct ast_channel *chan, const char *data)
 Set the group for a channel, splitting the provided data into group and category, if specified. More...
 
int ast_app_group_split_group (const char *data, char *group, int group_max, char *category, int category_max)
 Split a group string into group and category, returning a default category if none is provided. More...
 
int ast_app_group_update (struct ast_channel *oldchan, struct ast_channel *newchan)
 Update all group counting for a channel to a new one. More...
 
int ast_app_has_voicemail (const char *mailboxes, const char *folder)
 Determine if a given mailbox has any voicemail If folder is NULL, defaults to "INBOX". If folder is "INBOX", includes the number of messages in the "Urgent" folder. More...
 
int ast_app_inboxcount (const char *mailboxes, int *newmsgs, int *oldmsgs)
 Determine number of new/old messages in a mailbox. More...
 
int ast_app_inboxcount2 (const char *mailboxes, int *urgentmsgs, int *newmsgs, int *oldmsgs)
 Determine number of urgent/new/old messages in a mailbox. More...
 
int ast_app_messagecount (const char *mailbox_id, const char *folder)
 Get the number of messages in a given mailbox folder. More...
 
void ast_app_options2str64 (const struct ast_app_option *options, struct ast_flags64 *flags, char *buf, size_t len)
 Given a list of options array, return an option string based on passed flags. More...
 
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. More...
 
int ast_app_parse_options64 (const struct ast_app_option *options, struct ast_flags64 *flags, char **args, char *optstr)
 Parses a string containing application options and sets flags/arguments. More...
 
int ast_app_parse_timelen (const char *timestr, int *result, enum ast_timelen defunit)
 Common routine to parse time lengths, with optional time unit specifier. More...
 
int ast_app_run_macro (struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const char *macro_name, const char *macro_args)
 Run a macro on a channel, placing an optional second channel into autoservice. More...
 
int ast_app_run_sub (struct ast_channel *autoservice_chan, struct ast_channel *sub_chan, const char *sub_location, const char *sub_args, int ignore_hangup)
 Run a subroutine on a channel, placing an optional second channel into autoservice. More...
 
int ast_app_sayname (struct ast_channel *chan, const char *mailbox_id)
 Play a recorded user name for the mailbox to the specified channel. More...
 
void ast_close_fds_above_n (int n)
 Common routine for child processes, to close all fds prior to exec(2) More...
 
int ast_control_streamfile (struct ast_channel *chan, const char *file, const char *fwd, const char *rev, const char *stop, const char *pause, const char *restart, int skipms, long *offsetms)
 Stream a file with fast forward, pause, reverse, restart. More...
 
int ast_control_streamfile_lang (struct ast_channel *chan, const char *file, const char *fwd, const char *rev, const char *stop, const char *suspend, const char *restart, int skipms, const char *lang, long *offsetms)
 Version of ast_control_streamfile() which allows the language of the media file to be specified. More...
 
int ast_control_streamfile_w_cb (struct ast_channel *chan, const char *file, const char *fwd, const char *rev, const char *stop, const char *pause, const char *restart, int skipms, long *offsetms, ast_waitstream_fr_cb cb)
 Stream a file with fast forward, pause, reverse, restart. More...
 
int ast_control_tone (struct ast_channel *chan, const char *tone)
 Controls playback of a tone. More...
 
int ast_dtmf_stream (struct ast_channel *chan, struct ast_channel *peer, const char *digits, int between, unsigned int duration)
 Send a string of DTMF digits to a channel. More...
 
void ast_dtmf_stream_external (struct ast_channel *chan, const char *digits, int between, unsigned int duration)
 Send a string of DTMF digits to a channel from an external thread. More...
 
int ast_get_encoded_char (const char *stream, char *result, size_t *consumed)
 Decode an encoded control or extended ASCII character. More...
 
char * ast_get_encoded_str (const char *stream, char *result, size_t result_len)
 Decode a stream of encoded control or extended ASCII characters. More...
 
void ast_install_stack_functions (const struct ast_app_stack_funcs *funcs)
 Set stack application function callbacks. More...
 
int ast_ivr_menu_run (struct ast_channel *c, struct ast_ivr_menu *menu, void *cbdata)
 Runs an IVR menu. More...
 
int ast_linear_stream (struct ast_channel *chan, const char *filename, int fd, int allowoverride)
 Stream a filename (or file descriptor) as a generator. More...
 
enum AST_LOCK_RESULT ast_lock_path (const char *path)
 Lock a filesystem path. More...
 
int ast_mf_stream (struct ast_channel *chan, struct ast_channel *peer, struct ast_channel *chan2, const char *digits, int between, unsigned int duration, unsigned int durationkp, unsigned int durationst, int is_external)
 Send a string of MF digits to a channel. More...
 
int ast_play_and_prepend (struct ast_channel *chan, char *playfile, char *recordfile, int maxtime_sec, char *fmt, int *duration, int *sound_duration, int beep, int silencethreshold, int maxsilence_ms)
 Record a file based on input frm a channel. Recording is performed in 'prepend' mode which works a little differently from normal recordings This function will not play a success message due to post-recording control in the application this was added for. More...
 
int ast_play_and_record (struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime_sec, const char *fmt, int *duration, int *sound_duration, int silencethreshold, int maxsilence_ms, const char *path)
 Record a file based on input from a channel. Use default accept and cancel DTMF. This function will play "auth-thankyou" upon successful recording. More...
 
int ast_play_and_record_full (struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime_sec, const char *fmt, int *duration, int *sound_duration, int beep, int silencethreshold, int maxsilence_ms, const char *path, const char *acceptdtmf, const char *canceldtmf, int skip_confirmation_sound, enum ast_record_if_exists if_exists)
 Record a file based on input from a channel This function will play "auth-thankyou" upon successful recording if skip_confirmation_sound is false. More...
 
int ast_play_and_wait (struct ast_channel *chan, const char *fn)
 Play a stream and wait for a digit, returning the digit that was pressed. More...
 
struct stasis_topicast_queue_topic (const char *queuename)
 Get the Stasis Message Bus API topic for queue messages for a particular queue name. More...
 
struct stasis_topicast_queue_topic_all (void)
 Get the Stasis Message Bus API topic for queue messages. More...
 
char * ast_read_textfile (const char *file)
 Read a file into asterisk. More...
 
int ast_record_review (struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime, const char *fmt, int *duration, const char *path)
 Allow to record message and have a review option. More...
 
void ast_replace_sigchld (void)
 Replace the SIGCHLD handler. More...
 
int ast_safe_execvp (int dualfork, const char *file, char *const argv[])
 Safely spawn an external program while closing file descriptors. More...
 
int ast_safe_fork (int stop_reaper)
 Common routine to safely fork without a chance of a signal handler firing badly in the child. More...
 
void ast_safe_fork_cleanup (void)
 Common routine to cleanup after fork'ed process is complete (if reaping was stopped) More...
 
int ast_safe_system (const char *s)
 Safely spawn an OS shell command while closing file descriptors. More...
 
void ast_set_lock_type (enum AST_LOCK_TYPE type)
 Set the type of locks used by ast_lock_path() More...
 
int ast_sf_stream (struct ast_channel *chan, struct ast_channel *peer, struct ast_channel *chan2, const char *digits, int frequency, int is_external)
 Send a string of SF digits to a channel. More...
 
int ast_str_get_encoded_str (struct ast_str **str, int maxlen, const char *stream)
 Decode a stream of encoded control or extended ASCII characters. More...
 
 AST_THREADSTORAGE_EXTERNAL (ast_str_thread_global_buf)
 
int ast_unlock_path (const char *path)
 Unlock a path. More...
 
void ast_unreplace_sigchld (void)
 Restore the SIGCHLD handler. More...
 
int ast_vm_greeter_is_registered (void)
 Determine if a voicemail greeter provider is registered. More...
 
void ast_vm_greeter_unregister (const char *module_name)
 Unregister the specified voicemail greeter provider. More...
 
const char * ast_vm_index_to_foldername (int id)
 Return name of folder, given an id. More...
 
int ast_vm_is_registered (void)
 Determine if a voicemail provider is registered. More...
 
struct ast_vm_mailbox_snapshotast_vm_mailbox_snapshot_create (const char *mailbox, const char *context, const char *folder, int descending, enum ast_vm_snapshot_sort_val sort_val, int combine_INBOX_and_OLD)
 Create a snapshot of a mailbox which contains information about every msg. More...
 
struct ast_vm_mailbox_snapshotast_vm_mailbox_snapshot_destroy (struct ast_vm_mailbox_snapshot *mailbox_snapshot)
 destroy a snapshot More...
 
int ast_vm_msg_forward (const char *from_mailbox, const char *from_context, const char *from_folder, const char *to_mailbox, const char *to_context, const char *to_folder, size_t num_msgs, const char *msg_ids[], int delete_old)
 forward a message from one mailbox to another. More...
 
int ast_vm_msg_move (const char *mailbox, const char *context, size_t num_msgs, const char *oldfolder, const char *old_msg_ids[], const char *newfolder)
 Move messages from one folder to another. More...
 
int ast_vm_msg_play (struct ast_channel *chan, const char *mailbox, const char *context, const char *folder, const char *msg_num, ast_vm_msg_play_cb *cb)
 Play a voicemail msg back on a channel. More...
 
int ast_vm_msg_remove (const char *mailbox, const char *context, size_t num_msgs, const char *folder, const char *msgs[])
 Remove/delete messages from a mailbox folder. More...
 
void ast_vm_unregister (const char *module_name)
 Unregister the specified voicemail provider. More...
 

Detailed Description

Application convenience functions, designed to give consistent look and feel to Asterisk apps.

Definition in file include/asterisk/app.h.

Macro Definition Documentation

◆ AST_APP_ARG

#define AST_APP_ARG (   name)    char *name

Define an application argument.

Parameters
nameThe name of the argument
Examples
app_skel.c.

Definition at line 1276 of file include/asterisk/app.h.

◆ AST_APP_OPTION

#define AST_APP_OPTION (   option,
  flagno 
)     [option] = { .flag = flagno }

Declares an application option that does not accept an argument.

Parameters
optionThe single character representing the option
flagnoThe flag index to be set if this option is present
See also
AST_APP_OPTIONS, ast_app_parse_options
Examples
app_skel.c.

Definition at line 1446 of file include/asterisk/app.h.

◆ AST_APP_OPTION_ARG

#define AST_APP_OPTION_ARG (   option,
  flagno,
  argno 
)     [option] = { .flag = flagno, .arg_index = argno + 1 }

Declares an application option that accepts an argument.

Parameters
optionThe single character representing the option
flagnoThe flag index to be set if this option is present
argnoThe index into the argument array where the argument should be placed
See also
AST_APP_OPTIONS, ast_app_parse_options
Examples
app_skel.c.

Definition at line 1457 of file include/asterisk/app.h.

◆ AST_APP_OPTIONS

#define AST_APP_OPTIONS (   holder,
  options... 
)     static const struct ast_app_option holder[128] = options

Declares an array of options for an application.

Parameters
holderThe name of the array to be created
optionsThe actual options to be placed into the array
See also
ast_app_parse_options

This macro declares a 'static const' array of struct ast_option elements to hold the list of available options for an application. Each option must be declared using either the AST_APP_OPTION() or AST_APP_OPTION_ARG() macros.

Example usage:

enum my_app_option_flags {
OPT_JUMP = (1 << 0),
OPT_BLAH = (1 << 1),
OPT_BLORT = (1 << 2),
};
enum my_app_option_args {
OPT_ARG_BLAH = 0,
OPT_ARG_BLORT,
!! this entry tells how many possible arguments there are,
and must be the last entry in the list
};
AST_APP_OPTIONS(my_app_options, {
AST_APP_OPTION_ARG('b', OPT_BLAH, OPT_ARG_BLAH),
AST_APP_OPTION_BLORT('B', OPT_BLORT, OPT_ARG_BLORT),
});
static int my_app_exec(struct ast_channel *chan, void *data)
{
char *options;
struct ast_flags opts = { 0, };
char *opt_args[OPT_ARG_ARRAY_SIZE];
... do any argument parsing here ...
if (ast_app_parse_options(my_app_options, &opts, opt_args, options)) {
return -1;
}
}
@ OPT_ARG_ARRAY_SIZE
struct sla_ringing_trunk * last
Definition: app_meetme.c:1094
@ OPT_JUMP
static void parsing(int size, unsigned char *buf, struct unistimsession *pte, struct sockaddr_in *addr_from)
char * be
Definition: eagi_proxy.c:73
#define AST_APP_OPTIONS(holder, options...)
Declares an array of options for an application.
#define AST_APP_OPTION_ARG(option, flagno, argno)
Declares an application option that accepts an argument.
#define AST_APP_OPTION(option, flagno)
Declares an application option that does not accept an argument.
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:3126
Main Channel structure associated with a channel.
Structure used to handle boolean flags.
Definition: utils.h:199
Definition: search.h:40
static struct test_options options
FILE * in
Definition: utils/frame.c:33
Examples
app_skel.c.

Definition at line 1437 of file include/asterisk/app.h.

◆ ast_app_separate_args

#define ast_app_separate_args (   a,
  b,
  c,
  d 
)    __ast_app_separate_args(a,b,1,c,d)

Definition at line 1365 of file include/asterisk/app.h.

◆ AST_DECLARE_APP_ARGS

#define AST_DECLARE_APP_ARGS (   name,
  arglist 
)    AST_DEFINE_APP_ARGS_TYPE(argtype_##name, arglist) name = { 0, }

Declare a structure to hold an application's arguments.

Parameters
nameThe name of the structure
arglistThe list of arguments, defined using AST_APP_ARG

This macro declares a structure intended to be used in a call to ast_app_separate_args(). The structure includes all the arguments specified, plus an argv array that overlays them and an argc argument counter. The arguments must be declared using AST_APP_ARG, and they will all be character pointers (strings).

Note
The structure is not initialized, as the call to ast_app_separate_args() will perform that function before parsing the arguments.
Examples
app_skel.c.

Definition at line 1293 of file include/asterisk/app.h.

◆ AST_DEFINE_APP_ARGS_TYPE

#define AST_DEFINE_APP_ARGS_TYPE (   type,
  arglist 
)

Define a structure type to hold an application's arguments.

Parameters
typeThe name of the structure type
arglistThe list of arguments, defined using AST_APP_ARG

This macro defines a structure type intended to be used in a call to ast_app_separate_args(). The structure includes all the arguments specified, plus an argv array that overlays them and an argc argument counter. The arguments must be declared using AST_APP_ARG, and they will all be character pointers (strings).

Note
This defines a structure type, but does not declare an instance of the structure. That must be done separately.

Definition at line 1310 of file include/asterisk/app.h.

◆ AST_IVR_DECLARE_MENU

#define AST_IVR_DECLARE_MENU (   holder,
  title,
  flags,
  foo... 
)
Value:
static struct ast_ivr_option __options_##holder[] = foo;\
static struct ast_ivr_menu holder = { title, flags, __options_##holder }
unsigned int flags

Definition at line 110 of file include/asterisk/app.h.

◆ AST_IVR_FLAG_AUTORESTART

#define AST_IVR_FLAG_AUTORESTART   (1 << 0)

Definition at line 108 of file include/asterisk/app.h.

◆ AST_NONSTANDARD_APP_ARGS

#define AST_NONSTANDARD_APP_ARGS (   args,
  parse,
  sep 
)     args.argc = __ast_app_separate_args(parse, sep, 1, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))

Performs the 'nonstandard' argument separation process for an application.

Parameters
argsAn argument structure defined using AST_DECLARE_APP_ARGS
parseA modifiable buffer containing the input to be parsed
sepA nonstandard separator character

This function will separate the input string using the nonstandard argument separator character and fill in the provided structure, including the argc argument counter field.

Definition at line 1344 of file include/asterisk/app.h.

◆ AST_NONSTANDARD_RAW_ARGS

#define AST_NONSTANDARD_RAW_ARGS (   args,
  parse,
  sep 
)     args.argc = __ast_app_separate_args(parse, sep, 0, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))

Definition at line 1346 of file include/asterisk/app.h.

◆ AST_STANDARD_APP_ARGS

#define AST_STANDARD_APP_ARGS (   args,
  parse 
)     args.argc = __ast_app_separate_args(parse, ',', 1, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))

Performs the 'standard' argument separation process for an application.

Parameters
argsAn argument structure defined using AST_DECLARE_APP_ARGS
parseA modifiable buffer containing the input to be parsed

This function will separate the input string using the standard argument separator character ',' and fill in the provided structure, including the argc argument counter field.

Examples
app_skel.c.

Definition at line 1329 of file include/asterisk/app.h.

◆ AST_STANDARD_RAW_ARGS

#define AST_STANDARD_RAW_ARGS (   args,
  parse 
)     args.argc = __ast_app_separate_args(parse, ',', 0, args.argv, ((sizeof(args) - offsetof(typeof(args), argv)) / sizeof(args.argv[0])))

Definition at line 1331 of file include/asterisk/app.h.

◆ ast_vm_greeter_register

#define ast_vm_greeter_register (   vm_table)    __ast_vm_greeter_register(vm_table, AST_MODULE_SELF)

See __ast_vm_greeter_register()

Definition at line 676 of file include/asterisk/app.h.

◆ ast_vm_register

#define ast_vm_register (   vm_table)    __ast_vm_register(vm_table, AST_MODULE_SELF)

See __ast_vm_register()

Definition at line 609 of file include/asterisk/app.h.

◆ BEGIN_OPTIONS

#define BEGIN_OPTIONS   {

Definition at line 1387 of file include/asterisk/app.h.

◆ END_OPTIONS

#define END_OPTIONS   }

Definition at line 1388 of file include/asterisk/app.h.

◆ VM_GREETER_MODULE_VERSION

#define VM_GREETER_MODULE_VERSION   1

Definition at line 634 of file include/asterisk/app.h.

◆ VM_MODULE_VERSION

#define VM_MODULE_VERSION   2

Definition at line 557 of file include/asterisk/app.h.

Typedef Documentation

◆ ast_copy_recording_to_vm_fn

typedef int() ast_copy_recording_to_vm_fn(struct ast_vm_recording_data *vm_rec_data)

Creates a voicemail based on a specified file to a mailbox.

Parameters
vm_rec_dataA record containing filename and voicemail txt info.
Return values
0on success
-1on failure

Definition at line 435 of file include/asterisk/app.h.

◆ ast_has_voicemail_fn

typedef int() ast_has_voicemail_fn(const char *mailboxes, const char *folder)

Determines if the given folder has messages.

Parameters
mailboxesComma or & delimited list of mailboxes (user@context). If no context is found, uses 'default' for the context.
folderThe folder to look in. Default is INBOX if not provided.
Return values
1if the folder has one or more messages.
0otherwise.

Definition at line 365 of file include/asterisk/app.h.

◆ ast_inboxcount2_fn

typedef int() ast_inboxcount2_fn(const char *mailboxes, int *urgentmsgs, int *newmsgs, int *oldmsgs)

Gets the number of messages that exist for the mailbox list.

Parameters
mailboxesComma or space delimited list of mailboxes (user@context). If no context is found, uses 'default' for the context.
urgentmsgsWhere to put the count of urgent messages. (Can be NULL)
newmsgsWhere to put the count of new messages. (Can be NULL)
oldmsgsWhere to put the count of old messages. (Can be NULL)

Simultaneously determines the count of new, old, and urgent messages. The total messages would then be the sum of these three.

Return values
0on success
-1on failure

Definition at line 401 of file include/asterisk/app.h.

◆ ast_inboxcount_fn

typedef int() ast_inboxcount_fn(const char *mailboxes, int *newmsgs, int *oldmsgs)

Gets the number of messages that exist for the mailbox list.

Parameters
mailboxesComma or space delimited list of mailboxes (user@context). If no context is found, uses 'default' for the context.
newmsgsWhere to put the count of new messages. (Can be NULL)
oldmsgsWhere to put the count of old messages. (Can be NULL)

Simultaneously determines the count of new + urgent and old messages. The total messages would then be the sum of these.

Return values
0on success
-1on failure

Definition at line 382 of file include/asterisk/app.h.

◆ ast_ivr_callback

typedef int() ast_ivr_callback(struct ast_channel *chan, char *option, void *cbdata)

Callback function for IVR.

Return values
0on completion.
-1on hangup or digit if interrupted.

Definition at line 48 of file include/asterisk/app.h.

◆ ast_messagecount_fn

typedef int() ast_messagecount_fn(const char *mailbox_id, const char *folder)

Gets the number of messages that exist in a mailbox folder.

Parameters
mailbox_idThe mailbox name.
folderThe folder to look in. Default is INBOX if not provided.
Note
If requesting INBOX then the returned count is INBOX + Urgent.
Returns
The number of messages in the mailbox folder (zero or more).

Definition at line 413 of file include/asterisk/app.h.

◆ ast_sayname_fn

typedef int() ast_sayname_fn(struct ast_channel *chan, const char *mailbox_id)

Play a recorded user name for the mailbox to the specified channel.

Parameters
chanWhere to play the recorded name file.
mailbox_idThe mailbox name.
Return values
0Name played without interruption
Returns
dtmf ASCII value of the DTMF which interrupted playback.
Return values
-1Unable to locate mailbox or hangup occurred.

Definition at line 425 of file include/asterisk/app.h.

◆ ast_vm_index_to_foldername_fn

typedef const char*() ast_vm_index_to_foldername_fn(int id)

Convert the mailbox folder id to a folder name.

Parameters
idMailbox folder id to convert.
Deprecated:
Nothing calls it and nothing ever should.
Returns
The folder name associated with the id.

Definition at line 446 of file include/asterisk/app.h.

◆ ast_vm_mailbox_snapshot_create_fn

typedef struct ast_vm_mailbox_snapshot*() ast_vm_mailbox_snapshot_create_fn(const char *user, const char *context, const char *folder, int descending, enum ast_vm_snapshot_sort_val sort_val, int combine_INBOX_and_OLD)

Create a snapshot of a mailbox which contains information about every msg.

Parameters
userThe user part of user@context.
contextThe context part of user@context. Must be explicit.
folderWhen not NULL only msgs from the specified folder will be included.
descendinglist the msgs in descending order rather than ascending order.
sort_valWhat to sort in the snapshot.
combine_INBOX_and_OLDWhen this argument is set, The OLD folder will be represented in the INBOX folder of the snapshot. This allows the snapshot to represent the OLD and INBOX messages in sorted order merged together.
Note
Only used by voicemail unit tests.
Returns
snapshot on success
Return values
NULLon failure

Definition at line 446 of file include/asterisk/app.h.

◆ ast_vm_mailbox_snapshot_destroy_fn

typedef struct ast_vm_mailbox_snapshot*() ast_vm_mailbox_snapshot_destroy_fn(struct ast_vm_mailbox_snapshot *mailbox_snapshot)

destroy a snapshot

Parameters
mailbox_snapshotThe snapshot to destroy.
Note
Only used by voicemail unit tests.
Return values
NULL

Definition at line 446 of file include/asterisk/app.h.

◆ ast_vm_msg_forward_fn

typedef int() ast_vm_msg_forward_fn(const char *from_mailbox, const char *from_context, const char *from_folder, const char *to_mailbox, const char *to_context, const char *to_folder, size_t num_msgs, const char *msg_ids[], int delete_old)

forward a message from one mailbox to another.

from_mailbox The original mailbox the message is being forwarded from

from_context The voicemail context of the from_mailbox

from_folder The folder from which the message is being forwarded

to_mailbox The mailbox to forward the message to

to_context The voicemail context of the to_mailbox

to_folder The folder to which the message is being forwarded

num_msgs The number of messages being forwarded

msg_ids The message IDs of the messages in from_mailbox to forward

delete_old If non-zero, the forwarded messages are also deleted from from_mailbox. Otherwise, the messages will remain in the from_mailbox.

Note
Only used by voicemail unit tests.
Return values
-1Failure
0Success

Definition at line 535 of file include/asterisk/app.h.

◆ ast_vm_msg_move_fn

typedef int() ast_vm_msg_move_fn(const char *mailbox, const char *context, size_t num_msgs, const char *oldfolder, const char *old_msg_ids[], const char *newfolder)

Move messages from one folder to another.

Parameters
mailboxThe mailbox to which the folders belong
contextThe voicemail context for the mailbox
num_msgsThe number of messages to move
oldfolderThe folder from where messages should be moved
old_msg_idsThe message IDs of the messages to move
newfolderThe folder to which messages should be moved new folder. This array must be num_msgs sized.
Note
Only used by voicemail unit tests.
Return values
-1Failure
0Success

Definition at line 496 of file include/asterisk/app.h.

◆ ast_vm_msg_play_cb

typedef void() ast_vm_msg_play_cb(struct ast_channel *chan, const char *playfile, int duration)

Voicemail playback callback function definition.

Parameters
chanChannel to play the file back on.
playfileLocation of file on disk
durationof file in seconds. This will be zero if msg is very short or has an unknown duration.

Definition at line 353 of file include/asterisk/app.h.

◆ ast_vm_msg_play_fn

typedef int() ast_vm_msg_play_fn(struct ast_channel *chan, const char *mailbox, const char *context, const char *folder, const char *msg_num, ast_vm_msg_play_cb *cb)

Play a voicemail msg back on a channel.

Parameters
chan
mailboxmsg is in.
contextof mailbox.
foldervoicemail folder to look in.
msg_nummessage number in the voicemailbox to playback to the channel.
cb
Note
Only used by voicemail unit tests.
Return values
0success
-1failure

Definition at line 554 of file include/asterisk/app.h.

◆ ast_vm_msg_remove_fn

typedef int() ast_vm_msg_remove_fn(const char *mailbox, const char *context, size_t num_msgs, const char *folder, const char *msgs[])

Remove/delete messages from a mailbox folder.

Parameters
mailboxThe mailbox from which to delete messages
contextThe voicemail context for the mailbox
num_msgsThe number of messages to delete
folderThe folder from which to remove messages
msgsThe message IDs of the messages to delete
Note
Only used by voicemail unit tests.
Return values
-1Failure
0Success

Definition at line 513 of file include/asterisk/app.h.

Enumeration Type Documentation

◆ ast_getdata_result

Enumerator
AST_GETDATA_FAILED 
AST_GETDATA_COMPLETE 
AST_GETDATA_TIMEOUT 
AST_GETDATA_INTERRUPTED 
AST_GETDATA_EMPTY_END_TERMINATED 

indicates a user terminated empty string rather than an empty string resulting from a timeout or other factors

Definition at line 1198 of file include/asterisk/app.h.

1198  {
1199  AST_GETDATA_FAILED = -1,
1201  AST_GETDATA_TIMEOUT = 1,
1203  /*! indicates a user terminated empty string rather than an empty string resulting
1204  * from a timeout or other factors */
1206 };
@ AST_GETDATA_FAILED
@ AST_GETDATA_INTERRUPTED
@ AST_GETDATA_COMPLETE
@ AST_GETDATA_TIMEOUT
@ AST_GETDATA_EMPTY_END_TERMINATED

◆ ast_ivr_action

Enumerator
AST_ACTION_UPONE 

adata is unused

AST_ACTION_EXIT 

adata is the return value for ast_ivr_menu_run if channel was not hungup

AST_ACTION_CALLBACK 

adata is an ast_ivr_callback

AST_ACTION_PLAYBACK 

adata is file to play

AST_ACTION_BACKGROUND 

adata is file to play

AST_ACTION_PLAYLIST 

adata is list of files, separated by ; to play

AST_ACTION_MENU 

adata is a pointer to an ast_ivr_menu

AST_ACTION_REPEAT 

adata is max # of repeats, cast to a pointer

AST_ACTION_RESTART 

adata is like repeat, but resets repeats to 0

AST_ACTION_TRANSFER 

adata is a string with exten[@context]

AST_ACTION_WAITOPTION 

adata is a timeout, or 0 for defaults

AST_ACTION_NOOP 

adata is unused

AST_ACTION_BACKLIST 

adata is list of files separated by ; allows interruption

Definition at line 50 of file include/asterisk/app.h.

50  {
51  AST_ACTION_UPONE, /*!< adata is unused */
52  AST_ACTION_EXIT, /*!< adata is the return value for ast_ivr_menu_run if channel was not hungup */
53  AST_ACTION_CALLBACK, /*!< adata is an ast_ivr_callback */
54  AST_ACTION_PLAYBACK, /*!< adata is file to play */
55  AST_ACTION_BACKGROUND, /*!< adata is file to play */
56  AST_ACTION_PLAYLIST, /*!< adata is list of files, separated by ; to play */
57  AST_ACTION_MENU, /*!< adata is a pointer to an ast_ivr_menu */
58  AST_ACTION_REPEAT, /*!< adata is max # of repeats, cast to a pointer */
59  AST_ACTION_RESTART, /*!< adata is like repeat, but resets repeats to 0 */
60  AST_ACTION_TRANSFER, /*!< adata is a string with exten[\@context] */
61  AST_ACTION_WAITOPTION, /*!< adata is a timeout, or 0 for defaults */
62  AST_ACTION_NOOP, /*!< adata is unused */
63  AST_ACTION_BACKLIST, /*!< adata is list of files separated by ; allows interruption */
ast_ivr_action
@ AST_ACTION_UPONE
@ AST_ACTION_BACKLIST
@ AST_ACTION_PLAYBACK
@ AST_ACTION_RESTART
@ AST_ACTION_PLAYLIST
@ AST_ACTION_CALLBACK
@ AST_ACTION_NOOP
@ AST_ACTION_EXIT
@ AST_ACTION_BACKGROUND
@ AST_ACTION_WAITOPTION
@ AST_ACTION_MENU
@ AST_ACTION_REPEAT
@ AST_ACTION_TRANSFER

◆ AST_LOCK_RESULT

Enumerator
AST_LOCK_SUCCESS 
AST_LOCK_TIMEOUT 
AST_LOCK_PATH_NOT_FOUND 
AST_LOCK_FAILURE 

Definition at line 1208 of file include/asterisk/app.h.

1208  {
1209  AST_LOCK_SUCCESS = 0,
1210  AST_LOCK_TIMEOUT = -1,
1212  AST_LOCK_FAILURE = -3,
1213 };
@ AST_LOCK_SUCCESS
@ AST_LOCK_PATH_NOT_FOUND
@ AST_LOCK_TIMEOUT
@ AST_LOCK_FAILURE

◆ AST_LOCK_TYPE

Type of locking to use in ast_lock_path / ast_unlock_path.

Enumerator
AST_LOCK_TYPE_LOCKFILE 
AST_LOCK_TYPE_FLOCK 

Definition at line 1216 of file include/asterisk/app.h.

1216  {
1218  AST_LOCK_TYPE_FLOCK = 1,
1219 };
@ AST_LOCK_TYPE_LOCKFILE
@ AST_LOCK_TYPE_FLOCK

◆ ast_record_if_exists

Possible actions to take if a recording already exists

Since
12
Enumerator
AST_RECORD_IF_EXISTS_ERROR 

Return an Error State for IF_Exists

AST_RECORD_IF_EXISTS_FAIL 

Fail the recording.

AST_RECORD_IF_EXISTS_OVERWRITE 

Overwrite the existing recording.

AST_RECORD_IF_EXISTS_APPEND 

Append to the existing recording.

Definition at line 1116 of file include/asterisk/app.h.

1116  {
1117  /*! Return an Error State for IF_Exists */
1119  /*! Fail the recording. */
1121  /*! Overwrite the existing recording. */
1123  /*! Append to the existing recording. */
1125 };
@ AST_RECORD_IF_EXISTS_FAIL
@ AST_RECORD_IF_EXISTS_APPEND
@ AST_RECORD_IF_EXISTS_OVERWRITE
@ AST_RECORD_IF_EXISTS_ERROR

◆ ast_timelen

Enumerator
TIMELEN_HOURS 
TIMELEN_MINUTES 
TIMELEN_SECONDS 
TIMELEN_MILLISECONDS 

Definition at line 114 of file include/asterisk/app.h.

114  {
119 };
@ TIMELEN_MILLISECONDS
@ TIMELEN_MINUTES
@ TIMELEN_SECONDS
@ TIMELEN_HOURS

◆ ast_vm_snapshot_sort_val

Enumerator
AST_VM_SNAPSHOT_SORT_BY_ID 
AST_VM_SNAPSHOT_SORT_BY_TIME 

Definition at line 316 of file include/asterisk/app.h.

316  {
319 };
@ AST_VM_SNAPSHOT_SORT_BY_ID
@ AST_VM_SNAPSHOT_SORT_BY_TIME

Function Documentation

◆ __ast_app_separate_args()

unsigned int __ast_app_separate_args ( char *  buf,
char  delim,
int  remove_chars,
char **  array,
int  arraylen 
)

Separate a string into arguments in an array.

Parameters
bufThe string to be parsed (this must be a writable copy, as it will be modified)
delimThe character to be used to delimit arguments
remove_charsRemove backslashes and quote characters, while parsing
arrayAn array of 'char *' to be filled in with pointers to the found arguments
arraylenThe number of elements in the array (i.e. the number of arguments you will accept)

Note: if there are more arguments in the string than the array will hold, the last element of the array will contain the remaining arguments, not separated.

The array will be completely zeroed by this function before it populates any entries.

Returns
The number of arguments found, or zero if the function arguments are not valid.

Definition at line 2416 of file main/app.c.

2417 {
2418  int argc;
2419  char *scan, *wasdelim = NULL;
2420  int paren = 0, quote = 0, bracket = 0;
2421 
2422  if (!array || !arraylen) {
2423  return 0;
2424  }
2425 
2426  memset(array, 0, arraylen * sizeof(*array));
2427 
2428  if (!buf) {
2429  return 0;
2430  }
2431 
2432  scan = buf;
2433 
2434  for (argc = 0; *scan && (argc < arraylen - 1); argc++) {
2435  array[argc] = scan;
2436  for (; *scan; scan++) {
2437  if (*scan == '(') {
2438  paren++;
2439  } else if (*scan == ')') {
2440  if (paren) {
2441  paren--;
2442  }
2443  } else if (*scan == '[') {
2444  bracket++;
2445  } else if (*scan == ']') {
2446  if (bracket) {
2447  bracket--;
2448  }
2449  } else if (*scan == '"' && delim != '"') {
2450  quote = quote ? 0 : 1;
2451  if (remove_chars) {
2452  /* Remove quote character from argument */
2453  memmove(scan, scan + 1, strlen(scan));
2454  scan--;
2455  }
2456  } else if (*scan == '\\') {
2457  if (remove_chars) {
2458  /* Literal character, don't parse */
2459  memmove(scan, scan + 1, strlen(scan));
2460  } else {
2461  scan++;
2462  }
2463  } else if ((*scan == delim) && !paren && !quote && !bracket) {
2464  wasdelim = scan;
2465  *scan++ = '\0';
2466  break;
2467  }
2468  }
2469  }
2470 
2471  /* If the last character in the original string was the delimiter, then
2472  * there is one additional argument. */
2473  if (*scan || (scan > buf && (scan - 1) == wasdelim)) {
2474  array[argc++] = scan;
2475  }
2476 
2477  return argc;
2478 }
#define paren
Definition: ael_lex.c:973
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
static int array(struct ast_channel *chan, const char *cmd, char *var, const char *value)
static int quote(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
#define NULL
Definition: resample.c:96

References array(), buf, NULL, paren, and quote().

◆ __ast_vm_greeter_register()

int __ast_vm_greeter_register ( const struct ast_vm_greeter_functions vm_table,
struct ast_module module 
)

Set voicemail greeter function callbacks.

Since
13.0.0
Parameters
vm_tableVoicemail greeter function table to install.
modulePointer to the module implementing the interface
Return values
0on success.
-1on error.
AST_MODULE_LOAD_DECLINEif there's already another greeter registered.

Definition at line 549 of file main/app.c.

550 {
552 
553  if (!vm_table->module_name) {
554  ast_log(LOG_ERROR, "Voicemail greeter provider missing required information.\n");
555  return -1;
556  }
558  ast_log(LOG_ERROR, "Voicemail greeter provider '%s' has incorrect version\n",
560  return -1;
561  }
562 
563  table = ao2_global_obj_ref(vm_greeter_provider);
564  if (table) {
565  ast_log(LOG_WARNING, "Voicemail greeter provider already registered by %s.\n",
566  table->module_name);
568  }
569 
571  if (!table) {
572  return -1;
573  }
574  *table = *vm_table;
575  table->module = module;
576 
577  ao2_global_obj_replace_unref(vm_greeter_provider, table);
578  return 0;
579 }
static const struct ast_vm_functions vm_table
#define ast_log
Definition: astobj2.c:42
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition: astobj2.h:367
#define ao2_global_obj_replace_unref(holder, obj)
Replace an ao2 object in the global holder, throwing away any old object.
Definition: astobj2.h:901
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define ao2_global_obj_ref(holder)
Get a reference to the object stored in the global holder.
Definition: astobj2.h:918
#define ao2_alloc_options(data_size, destructor_fn, options)
Definition: astobj2.h:404
static char * table
Definition: cdr_odbc.c:55
#define VM_GREETER_MODULE_VERSION
#define LOG_ERROR
#define LOG_WARNING
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78
unsigned int module_version
The version of this function table.
const char * module_name
The name of the module that provides the voicemail functionality.
Voicemail greeter function table definition.
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:936

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_cleanup, ao2_global_obj_ref, ao2_global_obj_replace_unref, ast_log, AST_MODULE_LOAD_DECLINE, LOG_ERROR, LOG_WARNING, ast_vm_greeter_functions::module, ast_vm_functions::module_name, ast_vm_functions::module_version, NULL, RAII_VAR, table, VM_GREETER_MODULE_VERSION, and vm_table.

◆ __ast_vm_register()

int __ast_vm_register ( const struct ast_vm_functions vm_table,
struct ast_module module 
)

Set voicemail function callbacks.

Parameters
vm_tableVoicemail function table to install.
modulePointer to the module implementing the interface
Return values
0on success.
-1on error.
AST_MODULE_LOAD_DECLINEif there's already another provider registered.

Definition at line 438 of file main/app.c.

439 {
441 
442  if (!vm_table->module_name) {
443  ast_log(LOG_ERROR, "Voicemail provider missing required information.\n");
444  return -1;
445  }
447  ast_log(LOG_ERROR, "Voicemail provider '%s' has incorrect version\n",
449  return -1;
450  }
451 
452  table = ao2_global_obj_ref(vm_provider);
453  if (table) {
454  ast_log(LOG_WARNING, "Voicemail provider already registered by %s.\n",
455  table->module_name);
457  }
458 
460  if (!table) {
461  return -1;
462  }
463  *table = *vm_table;
464  table->module = module;
465 
466  ao2_global_obj_replace_unref(vm_provider, table);
467  return 0;
468 }
#define VM_MODULE_VERSION
Voicemail function table definition.

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_alloc_options, ao2_cleanup, ao2_global_obj_ref, ao2_global_obj_replace_unref, ast_log, AST_MODULE_LOAD_DECLINE, LOG_ERROR, LOG_WARNING, ast_vm_functions::module, ast_vm_functions::module_name, ast_vm_functions::module_version, NULL, RAII_VAR, table, VM_MODULE_VERSION, and vm_table.

◆ app_init()

int app_init ( void  )

Initialize the application core.

Return values
0Success
-1Failure
Since
12

Definition at line 3425 of file main/app.c.

3426 {
3428 #ifdef HAVE_CAP
3429  child_cap = cap_from_text("cap_net_admin-eip");
3430 #endif
3431  queue_topic_all = stasis_topic_create("queue:all");
3432  if (!queue_topic_all) {
3433  return -1;
3434  }
3436  if (!queue_topic_pool) {
3437  return -1;
3438  }
3439  return 0;
3440 }
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
static struct stasis_topic_pool * queue_topic_pool
Definition: main/app.c:91
static struct stasis_topic * queue_topic_all
Define Stasis Message Bus API topic objects.
Definition: main/app.c:90
static void app_cleanup(void)
Definition: main/app.c:3414
struct stasis_topic * stasis_topic_create(const char *name)
Create a new topic.
Definition: stasis.c:619
struct stasis_topic_pool * stasis_topic_pool_create(struct stasis_topic *pooled_topic)
Create a topic pool that routes messages from dynamically generated topics to the given topic.
Definition: stasis.c:1835

References app_cleanup(), ast_register_cleanup(), queue_topic_all, queue_topic_pool, stasis_topic_create(), and stasis_topic_pool_create().

Referenced by asterisk_daemon().

◆ ast_app_copy_recording_to_vm()

int ast_app_copy_recording_to_vm ( struct ast_vm_recording_data vm_rec_data)

param[in] vm_rec_data Contains data needed to make the recording. retval 0 voicemail successfully created from recording. retval -1 Failure

Definition at line 666 of file main/app.c.

667 {
668  int res = -1;
669 
670  VM_API_CALL(res, copy_recording_to_vm, (vm_rec_data));
671  return res;
672 }
#define VM_API_CALL(res, api_call, api_parms)
Definition: main/app.c:617

References VM_API_CALL.

Referenced by copy_to_voicemail().

◆ ast_app_dtget()

int ast_app_dtget ( struct ast_channel chan,
const char *  context,
char *  collect,
size_t  size,
int  maxlen,
int  timeout 
)

Present a dialtone and collect a certain length extension.

Return values
1if extension exists
0if extension does not exist
-1on hangup
Note
Note that if 'collect' holds digits already, new digits will be appended, so be sure it's initialized properly

Present a dialtone and collect a certain length extension.

Parameters
chanstruct.
context
collect
size
maxlen
timeouttimeout in milliseconds

Definition at line 138 of file main/app.c.

139 {
140  struct ast_tone_zone_sound *ts;
141  int res = 0, x = 0;
142 
143  if (maxlen > size) {
144  maxlen = size;
145  }
146 
147  if (!timeout) {
148  if (ast_channel_pbx(chan) && ast_channel_pbx(chan)->dtimeoutms) {
149  timeout = ast_channel_pbx(chan)->dtimeoutms;
150  } else {
151  timeout = 5000;
152  }
153  }
154 
155  if ((ts = ast_get_indication_tone(ast_channel_zone(chan), "dial"))) {
156  res = ast_playtones_start(chan, 0, ts->data, 0);
157  ts = ast_tone_zone_sound_unref(ts);
158  } else {
159  ast_log(LOG_NOTICE, "Huh....? no dial for indications?\n");
160  }
161 
162  for (x = strlen(collect); x < maxlen; ) {
163  res = ast_waitfordigit(chan, timeout);
164  if (!ast_ignore_pattern(context, collect)) {
165  ast_playtones_stop(chan);
166  }
167  if (res < 1) {
168  break;
169  }
170  if (res == '#') {
171  break;
172  }
173  collect[x++] = res;
174  if (!ast_matchmore_extension(chan, context, collect, 1,
175  S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL))) {
176  break;
177  }
178  }
179 
180  if (res >= 0) {
181  res = ast_exists_extension(chan, context, collect, 1,
182  S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL)) ? 1 : 0;
183  }
184 
185  return res;
186 }
static char context[AST_MAX_CONTEXT]
Definition: chan_alsa.c:120
int ast_waitfordigit(struct ast_channel *c, int ms)
Waits for a digit.
Definition: channel.c:3176
struct ast_pbx * ast_channel_pbx(const struct ast_channel *chan)
struct ast_tone_zone * ast_channel_zone(const struct ast_channel *chan)
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
#define LOG_NOTICE
struct ast_tone_zone_sound * ast_get_indication_tone(const struct ast_tone_zone *zone, const char *indication)
Locate a tone zone sound.
Definition: indications.c:455
int ast_playtones_start(struct ast_channel *chan, int vol, const char *tonelist, int interruptible)
Start playing a list of tones on a channel.
Definition: indications.c:302
static struct ast_tone_zone_sound * ast_tone_zone_sound_unref(struct ast_tone_zone_sound *ts)
Release a reference to an ast_tone_zone_sound.
Definition: indications.h:227
void ast_playtones_stop(struct ast_channel *chan)
Stop playing tones on a channel.
Definition: indications.c:393
int ast_exists_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Determine whether an extension exists.
Definition: pbx.c:4182
int ast_ignore_pattern(const char *context, const char *pattern)
Checks to see if a number should be ignored.
int ast_matchmore_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Looks to see if adding anything to this extension might match something. (exists ^ canmatch)
Definition: pbx.c:4202
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
Definition: strings.h:87
int dtimeoutms
Definition: pbx.h:215
Description of a tone.
Definition: indications.h:35
const char * data
Description of a tone.
Definition: indications.h:52
Number structure.
Definition: app_followme.c:154

References ast_channel_caller(), ast_channel_pbx(), ast_channel_zone(), ast_exists_extension(), ast_get_indication_tone(), ast_ignore_pattern(), ast_log, ast_matchmore_extension(), ast_playtones_start(), ast_playtones_stop(), ast_tone_zone_sound_unref(), ast_waitfordigit(), context, ast_tone_zone_sound::data, ast_pbx::dtimeoutms, LOG_NOTICE, NULL, and S_COR.

Referenced by grab_transfer().

◆ ast_app_exec_macro()

int ast_app_exec_macro ( struct ast_channel autoservice_chan,
struct ast_channel macro_chan,
const char *  macro_args 
)

Run a macro on a channel, placing an optional second channel into autoservice.

Since
11.0

This is a shorthand method that makes it very easy to run a macro on any given channel. It is perfectly reasonable to supply a NULL autoservice_chan here in case there is no channel to place into autoservice.

Note
Absolutely NO channel locks should be held before calling this function.
Parameters
autoservice_chanA channel to place into autoservice while the macro is run
macro_chanChannel to execute macro on.
macro_argsMacro application argument string.
Return values
0success
-1on error

Definition at line 270 of file main/app.c.

271 {
272  struct ast_app *macro_app;
273  int res;
274 
275  macro_app = pbx_findapp("Macro");
276  if (!macro_app) {
278  "Cannot run 'Macro(%s)'. The application is not available.\n", macro_args);
279  return -1;
280  }
281  if (autoservice_chan) {
282  ast_autoservice_start(autoservice_chan);
283  }
284 
285  ast_debug(4, "%s Original location: %s,%s,%d\n", ast_channel_name(macro_chan),
286  ast_channel_context(macro_chan), ast_channel_exten(macro_chan),
287  ast_channel_priority(macro_chan));
288 
289  res = pbx_exec(macro_chan, macro_app, macro_args);
290  ast_debug(4, "Macro exited with status %d\n", res);
291 
292  /*
293  * Assume anything negative from Macro is an error.
294  * Anything else is success.
295  */
296  if (res < 0) {
297  res = -1;
298  } else {
299  res = 0;
300  }
301 
302  ast_debug(4, "%s Ending location: %s,%s,%d\n", ast_channel_name(macro_chan),
303  ast_channel_context(macro_chan), ast_channel_exten(macro_chan),
304  ast_channel_priority(macro_chan));
305 
306  if (autoservice_chan) {
307  ast_autoservice_stop(autoservice_chan);
308  }
309 
310  if (ast_check_hangup_locked(macro_chan)) {
311  ast_queue_hangup(macro_chan);
312  }
313 
314  return res;
315 }
int ast_autoservice_stop(struct ast_channel *chan)
Stop servicing a channel for us...
Definition: autoservice.c:266
int ast_queue_hangup(struct ast_channel *chan)
Queue a hangup frame.
Definition: channel.c:1144
const char * ast_channel_context(const struct ast_channel *chan)
int ast_channel_priority(const struct ast_channel *chan)
int ast_check_hangup_locked(struct ast_channel *chan)
Definition: channel.c:459
int ast_autoservice_start(struct ast_channel *chan)
Automatically service a channel for us...
Definition: autoservice.c:200
const char * ast_channel_name(const struct ast_channel *chan)
const char * ast_channel_exten(const struct ast_channel *chan)
#define ast_debug(level,...)
Log a DEBUG message.
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
ast_app: A registered application
Definition: pbx_app.c:45

References ast_autoservice_start(), ast_autoservice_stop(), ast_channel_context(), ast_channel_exten(), ast_channel_name(), ast_channel_priority(), ast_check_hangup_locked(), ast_debug, ast_log, ast_queue_hangup(), LOG_WARNING, pbx_exec(), and pbx_findapp().

Referenced by ast_app_run_macro(), dial_exec_full(), generic_recall(), run_app_helper(), and try_calling().

◆ ast_app_exec_sub()

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.

Since
11

This is a shorthand method that makes it very easy to run a subroutine on any given channel. It is perfectly reasonable to supply a NULL autoservice_chan here in case there is no channel to place into autoservice.

Note
Absolutely NO channel locks should be held before calling this function.
Parameters
autoservice_chanA channel to place into autoservice while the subroutine is run
sub_chanChannel to execute subroutine on.
sub_argsGosub application argument string.
ignore_hangupTRUE if a hangup does not stop execution of the routine.
Return values
0success
-1on error

Definition at line 367 of file main/app.c.

368 {
369  const struct ast_app_stack_funcs *funcs;
370  int res;
371 
372  funcs = app_stack_callbacks;
373  if (!funcs || !funcs->run_sub || !ast_module_running_ref(funcs->module)) {
375  "Cannot run 'Gosub(%s)'. The app_stack module is not available.\n",
376  sub_args);
377  return -1;
378  }
379 
380  if (autoservice_chan) {
381  ast_autoservice_start(autoservice_chan);
382  }
383 
384  res = funcs->run_sub(sub_chan, sub_args, ignore_hangup);
385  ast_module_unref(funcs->module);
386 
387  if (autoservice_chan) {
388  ast_autoservice_stop(autoservice_chan);
389  }
390 
391  if (!ignore_hangup && ast_check_hangup_locked(sub_chan)) {
392  ast_queue_hangup(sub_chan);
393  }
394 
395  return res;
396 }
@ ignore_hangup
static const struct ast_app_stack_funcs * app_stack_callbacks
Definition: main/app.c:341
#define ast_module_unref(mod)
Release a reference to the module.
Definition: module.h:469
#define ast_module_running_ref(mod)
Hold a reference to the module if it is running.
Definition: module.h:455
Stack applications callback functions.
int(* run_sub)(struct ast_channel *chan, const char *args, int ignore_hangup)
Callback for the routine to run a subroutine on a channel.

References app_stack_callbacks, ast_autoservice_start(), ast_autoservice_stop(), ast_check_hangup_locked(), ast_log, ast_module_running_ref, ast_module_unref, ast_queue_hangup(), ignore_hangup, LOG_WARNING, ast_app_stack_funcs::module, and ast_app_stack_funcs::run_sub.

Referenced by app_exec(), ast_app_run_sub(), ast_pbx_hangup_handler_run(), ast_pre_call(), dial_exec_full(), generic_recall(), originate_exec(), page_exec(), queue_exec(), run_app_helper(), and try_calling().

◆ ast_app_expand_sub_args()

const char* ast_app_expand_sub_args ( struct ast_channel chan,
const char *  args 
)

Add missing context/exten to subroutine argument string.

Parameters
chanChannel to obtain context/exten.
argsGosub application argument string.

Fills in the optional context and exten from the given channel.

Returns
New-args Gosub argument string on success. Must be freed.
Return values
NULLon error.

Definition at line 348 of file main/app.c.

349 {
350  const struct ast_app_stack_funcs *funcs;
351  const char *new_args;
352 
353  funcs = app_stack_callbacks;
354  if (!funcs || !funcs->expand_sub_args || !ast_module_running_ref(funcs->module)) {
356  "Cannot expand 'Gosub(%s)' arguments. The app_stack module is not available.\n",
357  args);
358  return NULL;
359  }
360 
361  new_args = funcs->expand_sub_args(chan, args);
362  ast_module_unref(funcs->module);
363 
364  return new_args;
365 }
const char *(* expand_sub_args)(struct ast_channel *chan, const char *args)
Add missing context/exten to Gosub application argument string.
const char * args

References app_stack_callbacks, args, ast_log, ast_module_running_ref, ast_module_unref, ast_app_stack_funcs::expand_sub_args, LOG_WARNING, ast_app_stack_funcs::module, and NULL.

Referenced by app_exec(), ast_pbx_hangup_handler_push(), dial_exec_full(), and page_exec().

◆ ast_app_getdata()

int ast_app_getdata ( struct ast_channel c,
const char *  prompt,
char *  s,
int  maxlen,
int  timeout 
)

Plays a stream and gets DTMF data from a channel.

Parameters
cWhich channel one is interacting with
promptFile to pass to ast_streamfile (the one that you wish to play). It is also valid for this to be multiple files concatenated by "&". For example, "file1&file2&file3".
sThe location where the DTMF data will be stored
maxlenMax Length of the data
timeoutTimeout length waiting for data(in milliseconds). Set to 0 for standard timeout(six seconds), or -1 for no time out.

This function was designed for application programmers for situations where they need to play a message and then get some DTMF data in response to the message. If a digit is pressed during playback, it will immediately break out of the message and continue execution of your code.

Definition at line 138 of file main/app.c.

189 {
190  return ast_app_getdata_terminator(c, prompt, s, maxlen, timeout, NULL);
191 }
static struct ast_str * prompt
Definition: asterisk.c:2761
enum ast_getdata_result ast_app_getdata_terminator(struct ast_channel *c, const char *prompt, char *s, int maxlen, int timeout, char *terminator)
Plays a stream and gets DTMF data from a channel.
Definition: main/app.c:193
static struct test_val c

Referenced by auth_exec(), conf_exec(), conf_get_pin(), dictate_exec(), find_conf(), testclient_exec(), testserver_exec(), and vm_exec().

◆ ast_app_getdata_full()

int ast_app_getdata_full ( struct ast_channel c,
const char *  prompt,
char *  s,
int  maxlen,
int  timeout,
int  audiofd,
int  ctrlfd 
)

Full version with audiofd and controlfd. NOTE: returns '2' on ctrlfd available, not '1' like other full functions.

Definition at line 247 of file main/app.c.

248 {
249  int res, to = 2000, fto = 6000;
250 
251  if (!ast_strlen_zero(prompt)) {
253  if (res < 0) {
254  return res;
255  }
256  }
257 
258  if (timeout > 0) {
259  fto = to = timeout;
260  }
261  if (timeout < 0) {
262  fto = to = 1000000000;
263  }
264 
265  res = ast_readstring_full(c, s, maxlen, to, fto, "#", audiofd, ctrlfd);
266 
267  return res;
268 }
int ast_readstring_full(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders, int audiofd, int ctrlfd)
Definition: channel.c:6641
const char * ast_channel_language(const struct ast_channel *chan)
int ast_streamfile(struct ast_channel *c, const char *filename, const char *preflang)
Streams a file.
Definition: file.c:1291
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65

References ast_channel_language(), ast_readstring_full(), ast_streamfile(), ast_strlen_zero(), c, and prompt.

Referenced by handle_getdata().

◆ ast_app_getdata_terminator()

int ast_app_getdata_terminator ( struct ast_channel c,
const char *  prompt,
char *  s,
int  maxlen,
int  timeout,
char *  terminator 
)

Plays a stream and gets DTMF data from a channel.

Parameters
cWhich channel one is interacting with
promptFile to pass to ast_streamfile (the one that you wish to play). It is also valid for this to be multiple files concatenated by "&". For example, "file1&file2&file3".
sThe location where the DTMF data will be stored
maxlenMax Length of the data
timeoutTimeout length waiting for data(in milliseconds). Set to 0 for standard timeout(six seconds), or -1 for no time out.
terminatorA string of characters that may be used as terminators to end input. If NULL, "#" will be used.

This function was designed for application programmers for situations where they need to play a message and then get some DTMF data in response to the message. If a digit is pressed during playback, it will immediately break out of the message and continue execution of your code.

Definition at line 138 of file main/app.c.

195 {
196  int res = 0, to, fto;
197  char *front, *filename;
198 
199  /* XXX Merge with full version? XXX */
200 
201  if (maxlen)
202  s[0] = '\0';
203 
204  if (!prompt)
205  prompt = "";
206 
207  filename = ast_strdupa(prompt);
208  while ((front = strsep(&filename, "&"))) {
209  if (!ast_strlen_zero(front)) {
210  res = ast_streamfile(c, front, ast_channel_language(c));
211  if (res)
212  continue;
213  }
214  if (ast_strlen_zero(filename)) {
215  /* set timeouts for the last prompt */
216  fto = ast_channel_pbx(c) ? ast_channel_pbx(c)->rtimeoutms : 6000;
217  to = ast_channel_pbx(c) ? ast_channel_pbx(c)->dtimeoutms : 2000;
218 
219  if (timeout > 0) {
220  fto = to = timeout;
221  }
222  if (timeout < 0) {
223  fto = to = 1000000000;
224  }
225  } else {
226  /* there is more than one prompt, so
227  * get rid of the long timeout between
228  * prompts, and make it 50ms */
229  fto = 50;
230  to = ast_channel_pbx(c) ? ast_channel_pbx(c)->dtimeoutms : 2000;
231  }
232  res = ast_readstring(c, s, maxlen, to, fto, (terminator ? terminator : "#"));
234  return res;
235  }
236  if (!ast_strlen_zero(s)) {
237  return res;
238  }
239  }
240 
241  return res;
242 }
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders)
Reads multiple digits.
Definition: channel.c:6636
char * strsep(char **str, const char *delims)
int rtimeoutms
Definition: pbx.h:216

Referenced by read_exec().

◆ ast_app_group_discard()

int ast_app_group_discard ( struct ast_channel chan)

Discard all group counting for a channel.

Definition at line 2379 of file main/app.c.

2380 {
2381  struct ast_group_info *gi = NULL;
2382 
2385  if (gi->chan == chan) {
2387  ast_free(gi);
2388  }
2389  }
2392 
2393  return 0;
2394 }
#define ast_free(a)
Definition: astmm.h:180
#define AST_RWLIST_REMOVE_CURRENT
Definition: linkedlists.h:570
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:545
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:52
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:151
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:617
channel group info
Definition: channel.h:2915
struct ast_channel * chan
Definition: channel.h:2916
struct ast_group_info::@238 group_list

References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_group_info::chan, ast_group_info::group_list, and NULL.

Referenced by ast_channel_destructor().

◆ ast_app_group_get_count()

int ast_app_group_get_count ( const char *  group,
const char *  category 
)

Get the current channel count of the specified group and category.

Definition at line 2300 of file main/app.c.

2301 {
2302  struct ast_group_info *gi = NULL;
2303  int count = 0;
2304 
2305  if (ast_strlen_zero(group)) {
2306  return 0;
2307  }
2308 
2311  if (!strcasecmp(gi->group, group) && (ast_strlen_zero(category) || (!ast_strlen_zero(gi->category) && !strcasecmp(gi->category, category)))) {
2312  count++;
2313  }
2314  }
2316 
2317  return count;
2318 }
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
Definition: linkedlists.h:78
#define AST_RWLIST_TRAVERSE
Definition: linkedlists.h:494
char * category
Definition: channel.h:2917
char * group
Definition: channel.h:2918

References AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strlen_zero(), ast_group_info::category, ast_group_info::group, ast_group_info::group_list, and NULL.

◆ ast_app_group_list_head()

struct ast_group_info* ast_app_group_list_head ( void  )

Get the head of the group count list.

Definition at line 2406 of file main/app.c.

2407 {
2408  return AST_RWLIST_FIRST(&groups);
2409 }
#define AST_RWLIST_FIRST
Definition: linkedlists.h:423

References AST_RWLIST_FIRST.

Referenced by group_function_read(), and group_show_channels().

◆ ast_app_group_list_rdlock()

int ast_app_group_list_rdlock ( void  )

Read Lock the group count list.

Definition at line 2401 of file main/app.c.

2402 {
2403  return AST_RWLIST_RDLOCK(&groups);
2404 }

References AST_RWLIST_RDLOCK.

Referenced by group_function_read(), and group_show_channels().

◆ ast_app_group_list_unlock()

int ast_app_group_list_unlock ( void  )

Unlock the group count list.

Definition at line 2411 of file main/app.c.

2412 {
2413  return AST_RWLIST_UNLOCK(&groups);
2414 }

References AST_RWLIST_UNLOCK.

Referenced by group_function_read(), and group_show_channels().

◆ ast_app_group_list_wrlock()

int ast_app_group_list_wrlock ( void  )

Write Lock the group count list.

Definition at line 2396 of file main/app.c.

2397 {
2398  return AST_RWLIST_WRLOCK(&groups);
2399 }

References AST_RWLIST_WRLOCK.

◆ ast_app_group_match_get_count()

int ast_app_group_match_get_count ( const char *  groupmatch,
const char *  category 
)

Get the current channel count of all groups that match the specified pattern and category.

Definition at line 2320 of file main/app.c.

2321 {
2322  struct ast_group_info *gi = NULL;
2323  regex_t regexbuf_group;
2324  regex_t regexbuf_category;
2325  int count = 0;
2326 
2327  if (ast_strlen_zero(groupmatch)) {
2328  ast_log(LOG_NOTICE, "groupmatch empty\n");
2329  return 0;
2330  }
2331 
2332  /* if regex compilation fails, return zero matches */
2333  if (regcomp(&regexbuf_group, groupmatch, REG_EXTENDED | REG_NOSUB)) {
2334  ast_log(LOG_ERROR, "Regex compile failed on: %s\n", groupmatch);
2335  return 0;
2336  }
2337 
2338  if (!ast_strlen_zero(category) && regcomp(&regexbuf_category, category, REG_EXTENDED | REG_NOSUB)) {
2339  ast_log(LOG_ERROR, "Regex compile failed on: %s\n", category);
2340  regfree(&regexbuf_group);
2341  return 0;
2342  }
2343 
2346  if (!regexec(&regexbuf_group, gi->group, 0, NULL, 0) && (ast_strlen_zero(category) || (!ast_strlen_zero(gi->category) && !regexec(&regexbuf_category, gi->category, 0, NULL, 0)))) {
2347  count++;
2348  }
2349  }
2351 
2352  regfree(&regexbuf_group);
2353  if (!ast_strlen_zero(category)) {
2354  regfree(&regexbuf_category);
2355  }
2356 
2357  return count;
2358 }

References ast_log, AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strlen_zero(), ast_group_info::category, ast_group_info::group, ast_group_info::group_list, LOG_ERROR, LOG_NOTICE, and NULL.

Referenced by AST_TEST_DEFINE().

◆ ast_app_group_set_channel()

int ast_app_group_set_channel ( struct ast_channel chan,
const char *  data 
)

Set the group for a channel, splitting the provided data into group and category, if specified.

Definition at line 2253 of file main/app.c.

2254 {
2255  int res = 0;
2256  char group[80] = "", category[80] = "";
2257  struct ast_group_info *gi = NULL;
2258  size_t len = 0;
2259 
2260  if (ast_app_group_split_group(data, group, sizeof(group), category, sizeof(category))) {
2261  return -1;
2262  }
2263 
2264  /* Calculate memory we will need if this is new */
2265  len = sizeof(*gi) + strlen(group) + 1;
2266  if (!ast_strlen_zero(category)) {
2267  len += strlen(category) + 1;
2268  }
2269 
2272  if ((gi->chan == chan) && ((ast_strlen_zero(category) && ast_strlen_zero(gi->category)) || (!ast_strlen_zero(gi->category) && !strcasecmp(gi->category, category)))) {
2274  ast_free(gi);
2275  break;
2276  }
2277  }
2279 
2280  if (ast_strlen_zero(group)) {
2281  /* Enable unsetting the group */
2282  } else if ((gi = ast_calloc(1, len))) {
2283  gi->chan = chan;
2284  gi->group = (char *) gi + sizeof(*gi);
2285  strcpy(gi->group, group);
2286  if (!ast_strlen_zero(category)) {
2287  gi->category = (char *) gi + sizeof(*gi) + strlen(group) + 1;
2288  strcpy(gi->category, category);
2289  }
2291  } else {
2292  res = -1;
2293  }
2294 
2296 
2297  return res;
2298 }
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define AST_RWLIST_INSERT_TAIL
Definition: linkedlists.h:741
int ast_app_group_split_group(const char *data, char *group, int group_max, char *category, int category_max)
Split a group string into group and category, returning a default category if none is provided.
Definition: main/app.c:2226

References ast_app_group_split_group(), ast_calloc, ast_free, AST_RWLIST_INSERT_TAIL, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_strlen_zero(), ast_group_info::category, ast_group_info::chan, ast_group_info::group, ast_group_info::group_list, len(), and NULL.

Referenced by AST_TEST_DEFINE(), and dial_exec_full().

◆ ast_app_group_split_group()

int ast_app_group_split_group ( const char *  data,
char *  group,
int  group_max,
char *  category,
int  category_max 
)

Split a group string into group and category, returning a default category if none is provided.

Definition at line 2226 of file main/app.c.

2227 {
2228  int res = 0;
2229  char tmp[256];
2230  char *grp = NULL, *cat = NULL;
2231 
2232  if (!ast_strlen_zero(data)) {
2233  ast_copy_string(tmp, data, sizeof(tmp));
2234  grp = tmp;
2235  if ((cat = strchr(tmp, '@'))) {
2236  *cat++ = '\0';
2237  }
2238  }
2239 
2240  if (!ast_strlen_zero(grp)) {
2241  ast_copy_string(group, grp, group_max);
2242  } else {
2243  *group = '\0';
2244  }
2245 
2246  if (!ast_strlen_zero(cat)) {
2247  ast_copy_string(category, cat, category_max);
2248  }
2249 
2250  return res;
2251 }
static int tmp()
Definition: bt_open.c:389
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:406

References ast_copy_string(), ast_strlen_zero(), ast_frame::data, NULL, and tmp().

Referenced by ast_app_group_set_channel().

◆ ast_app_group_update()

int ast_app_group_update ( struct ast_channel oldchan,
struct ast_channel newchan 
)

Update all group counting for a channel to a new one.

Definition at line 2360 of file main/app.c.

2361 {
2362  struct ast_group_info *gi = NULL;
2363 
2366  if (gi->chan == old) {
2367  gi->chan = new;
2368  } else if (gi->chan == new) {
2370  ast_free(gi);
2371  }
2372  }
2375 
2376  return 0;
2377 }

References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_group_info::chan, ast_group_info::group_list, and NULL.

Referenced by channel_do_masquerade().

◆ ast_app_has_voicemail()

int ast_app_has_voicemail ( const char *  mailboxes,
const char *  folder 
)

Determine if a given mailbox has any voicemail If folder is NULL, defaults to "INBOX". If folder is "INBOX", includes the number of messages in the "Urgent" folder.

Return values
1Mailbox has voicemail
0No new voicemail in specified mailbox
-1Failure
Since
1.0

Definition at line 652 of file main/app.c.

653 {
654  int res = 0;
655 
656  VM_API_CALL(res, has_voicemail, (mailboxes, folder));
657  return res;
658 }
static int has_voicemail(const char *mailbox, const char *folder)
Determines if the given folder has messages.
static struct stasis_rest_handlers mailboxes
REST handler for /api-docs/mailboxes.json.

References has_voicemail(), mailboxes, and VM_API_CALL.

Referenced by action_mailboxstatus(), has_voicemail(), mwi_update_cb(), notify_new_message(), play_dialtone(), poll_mailbox(), run_externnotify(), skinny_register(), and unistim_send_mwi_to_peer().

◆ ast_app_inboxcount()

int ast_app_inboxcount ( const char *  mailboxes,
int *  newmsgs,
int *  oldmsgs 
)

Determine number of new/old messages in a mailbox.

Since
1.0
Parameters
[in]mailboxesMailbox specification in the format /code mbox[@context][&mbox2[@context2]][...] /code
[out]newmsgsNumber of messages in the "INBOX" folder. Includes number of messages in the "Urgent" folder, if any.
[out]oldmsgsNumber of messages in the "Old" folder.
Return values
0Success
-1Failure

Definition at line 674 of file main/app.c.

675 {
676  int res = 0;
677 
678  if (newmsgs) {
679  *newmsgs = 0;
680  }
681  if (oldmsgs) {
682  *oldmsgs = 0;
683  }
684 
685  VM_API_CALL(res, inboxcount, (mailboxes, newmsgs, oldmsgs));
686  return res;
687 }
static int inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)

References inboxcount(), mailboxes, and VM_API_CALL.

Referenced by sip_send_mwi_to_peer(), and update_registry().

◆ ast_app_inboxcount2()

int ast_app_inboxcount2 ( const char *  mailboxes,
int *  urgentmsgs,
int *  newmsgs,
int *  oldmsgs 
)

Determine number of urgent/new/old messages in a mailbox.

Parameters
[in]mailboxesthe mailbox context to use
[out]urgentmsgsthe urgent message count
[out]newmsgsthe new message count
[out]oldmsgsthe old message count
Return values
0for success
negativeupon error
Since
1.6.1

Definition at line 689 of file main/app.c.

690 {
691  int res = 0;
692 
693  if (newmsgs) {
694  *newmsgs = 0;
695  }
696  if (oldmsgs) {
697  *oldmsgs = 0;
698  }
699  if (urgentmsgs) {
700  *urgentmsgs = 0;
701  }
702 
703  VM_API_CALL(res, inboxcount2, (mailboxes, urgentmsgs, newmsgs, oldmsgs));
704  return res;
705 }
static int inboxcount2(const char *mailbox, int *urgentmsgs, int *newmsgs, int *oldmsgs)
Check the given mailbox's message count.

References inboxcount2(), mailboxes, and VM_API_CALL.

Referenced by action_mailboxcount(), mwi_retrieve_then_create_state(), notify_new_message(), notify_new_state(), and vm_execmain().

◆ ast_app_messagecount()

int ast_app_messagecount ( const char *  mailbox_id,
const char *  folder 
)

Get the number of messages in a given mailbox folder.

Parameters
[in]mailbox_idMailbox name
[in]folderThe folder to look in. Default is INBOX if not provided.
Note
If requesting INBOX then the returned count is INBOX + Urgent.
Returns
The number of messages in the mailbox folder (zero or more).

Definition at line 715 of file main/app.c.

716 {
717  int res = 0;
718 
719  VM_API_CALL(res, messagecount, (mailbox_id, folder));
720  return res;
721 }
static int messagecount(const char *mailbox_id, const char *folder)

References messagecount(), and VM_API_CALL.

◆ ast_app_options2str64()

void ast_app_options2str64 ( const struct ast_app_option options,
struct ast_flags64 flags,
char *  buf,
size_t  len 
)

Given a list of options array, return an option string based on passed flags.

Parameters
optionsThe array of possible options declared with AST_APP_OPTIONS
flagsThe flags of the options that you wish to populate the buffer with
bufThe buffer to fill with the string of options
lenThe maximum length of buf

Definition at line 3136 of file main/app.c.

3137 {
3138  unsigned int i, found = 0;
3139  for (i = 32; i < 128 && found < len; i++) {
3140  if (ast_test_flag64(flags, options[i].flag)) {
3141  buf[found++] = i;
3142  }
3143  }
3144  buf[found] = '\0';
3145 }
long int flag
Definition: f2c.h:83
#define ast_test_flag64(p, flag)
Definition: utils.h:120

References ast_test_flag64, buf, ast_flags64::flags, len(), and options.

◆ ast_app_parse_options()

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.

Parameters
optionsThe array of possible options declared with AST_APP_OPTIONS
flagsThe flag structure to have option flags set
argsThe array of argument pointers to hold arguments found
optstrThe string containing the options to be parsed
Return values
zerofor success
non-zeroif an error occurs
See also
AST_APP_OPTIONS
Examples
app_skel.c.

Definition at line 3126 of file main/app.c.

3127 {
3128  return parse_options(options, flags, args, optstr, 32);
3129 }
static int parse_options(const struct ast_app_option *options, void *_flags, char **args, char *optstr, int flaglen)
Definition: main/app.c:3043

References args, ast_flags64::flags, options, and parse_options().

Referenced by agent_login_exec(), app_exec(), ast_multicast_rtp_create_options(), AST_TEST_DEFINE(), audiosocket_request(), auth_exec(), bridge_exec(), bridgewait_exec(), cdr_read_callback(), cdr_write_callback(), chanspy_exec(), connectedline_write(), controlplayback_exec(), custom_devstate_callback(), detect_write(), directory_exec(), disa_exec(), extenspy_exec(), forkcdr_exec(), handle_options(), manager_mixmonitor(), minivm_accmess_exec(), minivm_greet_exec(), minivm_record_exec(), mixmonitor_exec(), page_exec(), park_app_parse_data(), pbx_builtin_background(), pbx_builtin_waitexten(), pickupchan_exec(), queue_exec(), read_exec(), read_mf_exec(), read_sf_exec(), readexten_exec(), realtime_common(), receivefax_exec(), record_exec(), resetcdr_exec(), sendfax_exec(), sla_state(), smdi_msg_retrieve_read(), sms_exec(), softhangup_exec(), speech_background(), start_monitor_exec(), unicast_rtp_request(), vm_exec(), vm_execmain(), volume_write(), and wait_exec().

◆ ast_app_parse_options64()

int ast_app_parse_options64 ( const struct ast_app_option options,
struct ast_flags64 flags,
char **  args,
char *  optstr 
)

Parses a string containing application options and sets flags/arguments.

Parameters
optionsThe array of possible options declared with AST_APP_OPTIONS
flagsThe 64-bit flag structure to have option flags set
argsThe array of argument pointers to hold arguments found
optstrThe string containing the options to be parsed
Return values
zerofor success
non-zeroif an error occurs
See also
AST_APP_OPTIONS

Definition at line 3131 of file main/app.c.

3132 {
3133  return parse_options(options, flags, args, optstr, 64);
3134 }

References args, ast_flags64::flags, options, and parse_options().

Referenced by AST_TEST_DEFINE(), conf_exec(), dial_exec_full(), find_conf_realtime(), originate_exec(), and sayunixtime_exec().

◆ ast_app_parse_timelen()

int ast_app_parse_timelen ( const char *  timestr,
int *  result,
enum ast_timelen  defunit 
)

Common routine to parse time lengths, with optional time unit specifier.

Parameters
[in]timestrString to parse
[in]defunitDefault unit type
[out]resultResulting value, specified in milliseconds
Return values
0Success
-1Failure
Since
1.8

Definition at line 3333 of file main/app.c.

3334 {
3335  int res;
3336  char u[10];
3337 #ifdef HAVE_LONG_DOUBLE_WIDER
3338  long double amount;
3339  #define FMT "%30Lf%9s"
3340 #else
3341  double amount;
3342  #define FMT "%30lf%9s"
3343 #endif
3344  if (!timestr) {
3345  return -1;
3346  }
3347 
3348  res = sscanf(timestr, FMT, &amount, u);
3349 
3350  if (res == 0 || res == EOF) {
3351 #undef FMT
3352  return -1;
3353  } else if (res == 2) {
3354  switch (u[0]) {
3355  case 'h':
3356  case 'H':
3357  unit = TIMELEN_HOURS;
3358  if (u[1] != '\0') {
3359  return -1;
3360  }
3361  break;
3362  case 's':
3363  case 'S':
3364  unit = TIMELEN_SECONDS;
3365  if (u[1] != '\0') {
3366  return -1;
3367  }
3368  break;
3369  case 'm':
3370  case 'M':
3371  if (toupper(u[1]) == 'S') {
3372  unit = TIMELEN_MILLISECONDS;
3373  if (u[2] != '\0') {
3374  return -1;
3375  }
3376  } else if (u[1] == '\0') {
3377  unit = TIMELEN_MINUTES;
3378  } else {
3379  return -1;
3380  }
3381  break;
3382  default:
3383  return -1;
3384  }
3385  }
3386 
3387  switch (unit) {
3388  case TIMELEN_HOURS:
3389  amount *= 60;
3390  /* fall-through */
3391  case TIMELEN_MINUTES:
3392  amount *= 60;
3393  /* fall-through */
3394  case TIMELEN_SECONDS:
3395  amount *= 1000;
3396  /* fall-through */
3397  case TIMELEN_MILLISECONDS:
3398  ;
3399  }
3400  *result = amount > INT_MAX ? INT_MAX : (int) amount;
3401  return 0;
3402 }
static PGresult * result
Definition: cel_pgsql.c:84
#define FMT

References FMT, result, TIMELEN_HOURS, TIMELEN_MILLISECONDS, TIMELEN_MINUTES, and TIMELEN_SECONDS.

Referenced by ast_eivr_senddtmf(), ast_parse_arg(), new_realtime_sqlite3_db(), pbx_builtin_wait(), pbx_builtin_waitdigit(), pbx_builtin_waitexten(), senddtmf_exec(), and sendmf_exec().

◆ ast_app_run_macro()

int ast_app_run_macro ( struct ast_channel autoservice_chan,
struct ast_channel macro_chan,
const char *  macro_name,
const char *  macro_args 
)

Run a macro on a channel, placing an optional second channel into autoservice.

Since
1.8

This is a shorthand method that makes it very easy to run a macro on any given channel. It is perfectly reasonable to supply a NULL autoservice_chan here in case there is no channel to place into autoservice.

Note
Absolutely NO channel locks should be held before calling this function.
Parameters
autoservice_chanA channel to place into autoservice while the macro is run
macro_chanChannel to execute macro on.
macro_nameThe name of the macro to run.
macro_argsThe arguments to pass to the macro.
Return values
0success
-1on error

Definition at line 317 of file main/app.c.

318 {
319  int res;
320  char *args_str;
321  size_t args_len;
322 
323  if (ast_strlen_zero(macro_args)) {
324  return ast_app_exec_macro(autoservice_chan, macro_chan, macro_name);
325  }
326 
327  /* Create the Macro application argument string. */
328  args_len = strlen(macro_name) + strlen(macro_args) + 2;
329  args_str = ast_malloc(args_len);
330  if (!args_str) {
331  return -1;
332  }
333  snprintf(args_str, args_len, "%s,%s", macro_name, macro_args);
334 
335  res = ast_app_exec_macro(autoservice_chan, macro_chan, args_str);
336  ast_free(args_str);
337  return res;
338 }
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
int ast_app_exec_macro(struct ast_channel *autoservice_chan, struct ast_channel *macro_chan, const char *macro_args)
Run a macro on a channel, placing an optional second channel into autoservice.
Definition: main/app.c:270

References ast_app_exec_macro(), ast_free, ast_malloc, and ast_strlen_zero().

Referenced by ast_channel_connected_line_macro(), and ast_channel_redirecting_macro().

◆ ast_app_run_sub()

int ast_app_run_sub ( struct ast_channel autoservice_chan,
struct ast_channel sub_chan,
const char *  sub_location,
const char *  sub_args,
int  ignore_hangup 
)

Run a subroutine on a channel, placing an optional second channel into autoservice.

Since
11

This is a shorthand method that makes it very easy to run a subroutine on any given channel. It is perfectly reasonable to supply a NULL autoservice_chan here in case there is no channel to place into autoservice.

Note
Absolutely NO channel locks should be held before calling this function.
Parameters
autoservice_chanA channel to place into autoservice while the subroutine is run
sub_chanChannel to execute subroutine on.
sub_locationThe location of the subroutine to run.
sub_argsThe arguments to pass to the subroutine.
ignore_hangupTRUE if a hangup does not stop execution of the routine.
Return values
0success
-1on error

Definition at line 398 of file main/app.c.

399 {
400  int res;
401  char *args_str;
402  size_t args_len;
403 
404  if (ast_strlen_zero(sub_args)) {
405  return ast_app_exec_sub(autoservice_chan, sub_chan, sub_location, ignore_hangup);
406  }
407 
408  /* Create the Gosub application argument string. */
409  args_len = strlen(sub_location) + strlen(sub_args) + 3;
410  args_str = ast_malloc(args_len);
411  if (!args_str) {
412  return -1;
413  }
414  snprintf(args_str, args_len, "%s(%s)", sub_location, sub_args);
415 
416  res = ast_app_exec_sub(autoservice_chan, sub_chan, args_str, ignore_hangup);
417  ast_free(args_str);
418  return res;
419 }
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:367

References ast_app_exec_sub(), ast_free, ast_malloc, ast_strlen_zero(), and ignore_hangup.

Referenced by ast_channel_connected_line_sub(), and ast_channel_redirecting_sub().

◆ ast_app_sayname()

int ast_app_sayname ( struct ast_channel chan,
const char *  mailbox_id 
)

Play a recorded user name for the mailbox to the specified channel.

Parameters
chanWhere to play the recorded name file.
mailbox_idThe mailbox name.
Return values
0Name played without interruption
dtmfASCII value of the DTMF which interrupted playback.
-1Unable to locate mailbox or hangup occurred.

Definition at line 707 of file main/app.c.

708 {
709  int res = -1;
710 
711  VM_GREETER_API_CALL(res, sayname, (chan, mailbox_id));
712  return res;
713 }
static int sayname(struct ast_channel *chan, const char *mailbox, const char *context)
#define VM_GREETER_API_CALL(res, api_call, api_parms)
Definition: main/app.c:638

References sayname(), and VM_GREETER_API_CALL.

Referenced by play_mailbox_owner(), and spy_sayname().

◆ ast_close_fds_above_n()

void ast_close_fds_above_n ( int  n)

Common routine for child processes, to close all fds prior to exec(2)

Parameters
[in]nstarting file descriptor number for closing all higher file descriptors
Since
1.6.1

Definition at line 3262 of file main/app.c.

3263 {
3264  closefrom(n + 1);
3265 }
void closefrom(int lowfd)
Definition: strcompat.c:429

References closefrom().

Referenced by app_exec(), asterisk_daemon(), mp3play(), safe_exec_prep(), send_waveform_to_fd(), spawn_mp3(), and vm_check_password_shell().

◆ ast_control_streamfile()

int ast_control_streamfile ( struct ast_channel chan,
const char *  file,
const char *  fwd,
const char *  rev,
const char *  stop,
const char *  pause,
const char *  restart,
int  skipms,
long *  offsetms 
)

Stream a file with fast forward, pause, reverse, restart.

Parameters
chanChannel
fileFile to play.
fwd,rev,stop,pause,restartDTMF keys for media control
skipmsNumber of milliseconds to skip for fwd/rev.
offsetmsNumber of milliseconds to skip when starting the media.

Before calling this function, set this to be the number of ms to start from the beginning of the file. When the function returns, it will be the number of ms from the beginning where the playback stopped. Pass NULL if you don't care.

Return values
0on success
Non-zeroon failure

Definition at line 1535 of file main/app.c.

1539 {
1540  return control_streamfile(chan, file, fwd, rev, stop, suspend, restart, skipms, offsetms, NULL, NULL);
1541 }
unsigned int stop
Definition: app_meetme.c:1098
static int skipms
static void suspend(struct cc_core_instance *core_instance)
Definition: ccss.c:3193
static int control_streamfile(struct ast_channel *chan, const char *file, const char *fwd, const char *rev, const char *stop, const char *suspend, const char *restart, int skipms, long *offsetms, const char *lang, ast_waitstream_fr_cb cb)
Definition: main/app.c:1347

References control_streamfile(), make_ari_stubs::file, NULL, skipms, stop, and suspend().

Referenced by controlplayback_exec(), handle_controlstreamfile(), and wait_file().

◆ ast_control_streamfile_lang()

int ast_control_streamfile_lang ( struct ast_channel chan,
const char *  file,
const char *  fwd,
const char *  rev,
const char *  stop,
const char *  suspend,
const char *  restart,
int  skipms,
const char *  lang,
long *  offsetms 
)

Version of ast_control_streamfile() which allows the language of the media file to be specified.

Return values
0on success
Non-zeroon failure

Definition at line 1543 of file main/app.c.

1546 {
1547  return control_streamfile(chan, file, fwd, rev, stop, suspend, restart, skipms, offsetms, lang, NULL);
1548 }

References control_streamfile(), make_ari_stubs::file, NULL, skipms, stop, and suspend().

Referenced by play_on_channel().

◆ ast_control_streamfile_w_cb()

int ast_control_streamfile_w_cb ( struct ast_channel chan,
const char *  file,
const char *  fwd,
const char *  rev,
const char *  stop,
const char *  pause,
const char *  restart,
int  skipms,
long *  offsetms,
ast_waitstream_fr_cb  cb 
)

Stream a file with fast forward, pause, reverse, restart.

Parameters
chan
filefilename
fwd,rev,stop,pause,restart,skipms,offsetms
cbwaitstream callback to invoke when fastforward or rewind occurs.

Before calling this function, set this to be the number of ms to start from the beginning of the file. When the function returns, it will be the number of ms from the beginning where the playback stopped. Pass NULL if you don't care.

Definition at line 1521 of file main/app.c.

1531 {
1532  return control_streamfile(chan, file, fwd, rev, stop, suspend, restart, skipms, offsetms, NULL, cb);
1533 }

References control_streamfile(), make_ari_stubs::file, NULL, skipms, stop, and suspend().

◆ ast_control_tone()

int ast_control_tone ( struct ast_channel chan,
const char *  tone 
)

Controls playback of a tone.

Return values
0on success
Non-zeroon failure

Definition at line 1615 of file main/app.c.

1616 {
1617  struct ast_tone_zone *zone = NULL;
1618  struct ast_tone_zone_sound *ts;
1619  int paused = 0;
1620  int res = 0;
1621 
1622  const char *tone_indication = NULL;
1623  const char *tone_zone = NULL;
1624  char *tone_uri_parser;
1625 
1626  if (ast_strlen_zero(tone)) {
1627  return -1;
1628  }
1629 
1630  tone_uri_parser = ast_strdupa(tone);
1631 
1632  if (parse_tone_uri(tone_uri_parser, &tone_indication, &tone_zone)) {
1633  return -1;
1634  }
1635 
1636  if (tone_zone) {
1637  zone = ast_get_indication_zone(tone_zone);
1638  }
1639 
1640  ts = ast_get_indication_tone(zone ? zone : ast_channel_zone(chan), tone_indication);
1641 
1642  if (ast_playtones_start(chan, 0, ts ? ts->data : tone_indication, 0)) {
1643  res = -1;
1644  }
1645 
1646  while (!res) {
1647  struct ast_frame *fr;
1648 
1649  if (ast_waitfor(chan, -1) < 0) {
1650  res = -1;
1651  break;
1652  }
1653 
1654  fr = ast_read_noaudio(chan);
1655 
1656  if (!fr) {
1657  res = -1;
1658  break;
1659  }
1660 
1661  if (fr->frametype != AST_FRAME_CONTROL) {
1662  continue;
1663  }
1664 
1665  res = control_tone_frame_response(chan, fr, ts, tone_indication, &paused);
1666  if (res == CONTROL_TONE_RESPONSE_FINISHED) {
1667  res = 0;
1668  break;
1669  } else if (res == CONTROL_TONE_RESPONSE_FAILED) {
1670  res = -1;
1671  break;
1672  }
1673  }
1674 
1675  if (ts) {
1677  }
1678 
1679  if (zone) {
1680  ast_tone_zone_unref(zone);
1681  }
1682 
1683  return res;
1684 }
struct ast_frame * ast_read_noaudio(struct ast_channel *chan)
Reads a frame, returning AST_FRAME_NULL frame if audio.
Definition: channel.c:4302
int ast_waitfor(struct ast_channel *chan, int ms)
Wait for input on a channel.
Definition: channel.c:3163
@ AST_FRAME_CONTROL
struct ast_tone_zone * ast_get_indication_zone(const char *country)
locate ast_tone_zone
Definition: indications.c:433
static struct ast_tone_zone * ast_tone_zone_unref(struct ast_tone_zone *tz)
Release a reference to an ast_tone_zone.
Definition: indications.h:205
static enum control_tone_frame_response_result control_tone_frame_response(struct ast_channel *chan, struct ast_frame *fr, struct ast_tone_zone_sound *ts, const char *tone, int *paused)
Definition: main/app.c:1556
@ CONTROL_TONE_RESPONSE_FAILED
Definition: main/app.c:1551
@ CONTROL_TONE_RESPONSE_FINISHED
Definition: main/app.c:1553
static int parse_tone_uri(char *tone_parser, const char **tone_indication, const char **tone_zone)
Definition: main/app.c:1594
Data structure associated with a single frame of data.
enum ast_frame_type frametype
A set of tones for a given locale.
Definition: indications.h:74

References ast_channel_zone(), AST_FRAME_CONTROL, ast_get_indication_tone(), ast_get_indication_zone(), ast_playtones_start(), ast_read_noaudio(), ast_strdupa, ast_strlen_zero(), ast_tone_zone_sound_unref(), ast_tone_zone_unref(), ast_waitfor(), control_tone_frame_response(), CONTROL_TONE_RESPONSE_FAILED, CONTROL_TONE_RESPONSE_FINISHED, ast_tone_zone_sound::data, ast_frame::frametype, NULL, parse_tone_uri(), and ast_frame::ts.

Referenced by play_on_channel().

◆ ast_dtmf_stream()

int ast_dtmf_stream ( struct ast_channel chan,
struct ast_channel peer,
const char *  digits,
int  between,
unsigned int  duration 
)

Send a string of DTMF digits to a channel.

Parameters
chanThe channel that will receive the DTMF frames
peer(optional) Peer channel that will be autoserviced while the primary channel is receiving DTMF
digitsThis is a string of characters representing the DTMF digits to be sent to the channel. Valid characters are "0123456789*#abcdABCD". Note: You can pass arguments 'f' or 'F', if you want to Flash the channel (if supported by the channel), or 'w' to add a 500 millisecond pause to the DTMF sequence.
betweenThis is the number of milliseconds to wait in between each DTMF digit. If zero milliseconds is specified, then the default value of 100 will be used.
durationThis is the duration that each DTMF digit should have.
Precondition
This must only be called by the channel's media handler thread.
Return values
0on success.
-1on failure or a channel hung up.

Definition at line 1197 of file main/app.c.

1198 {
1199  int res;
1200 
1201  if (peer && ast_autoservice_start(peer)) {
1202  return -1;
1203  }
1204  res = dtmf_stream(chan, digits, between, duration, 0);
1205  if (peer && ast_autoservice_stop(peer)) {
1206  res = -1;
1207  }
1208 
1209  return res;
1210 }
static int dtmf_stream(struct ast_channel *chan, const char *digits, int between, unsigned int duration, int is_external)
Definition: main/app.c:1099

References ast_autoservice_start(), ast_autoservice_stop(), and dtmf_stream().

Referenced by ast_eivr_senddtmf(), bridge_channel_dtmf_stream(), dial_exec_full(), dtmf_no_bridge(), senddtmf_exec(), testclient_exec(), testserver_exec(), and wait_for_answer().

◆ ast_dtmf_stream_external()

void ast_dtmf_stream_external ( struct ast_channel chan,
const char *  digits,
int  between,
unsigned int  duration 
)

Send a string of DTMF digits to a channel from an external thread.

Parameters
chanThe channel that will receive the DTMF frames
digitsThis is a string of characters representing the DTMF digits to be sent to the channel. Valid characters are "0123456789*#abcdABCD". Note: You can pass arguments 'f' or 'F', if you want to Flash the channel (if supported by the channel), or 'w' to add a 500 millisecond pause to the DTMF sequence.
betweenThis is the number of milliseconds to wait in between each DTMF digit. If zero milliseconds is specified, then the default value of 100 will be used.
durationThis is the duration that each DTMF digit should have.
Precondition
This must only be called by threads that are not the channel's media handler thread.

Definition at line 1212 of file main/app.c.

1213 {
1214  dtmf_stream(chan, digits, between, duration, 1);
1215 }

References dtmf_stream().

Referenced by dtmf_in_bridge().

◆ ast_get_encoded_char()

int ast_get_encoded_char ( const char *  stream,
char *  result,
size_t *  consumed 
)

Decode an encoded control or extended ASCII character.

Parameters
[in]streamString to decode
[out]resultDecoded character
[out]consumedNumber of characters used in stream to encode the character
Return values
-1Stream is of zero length
0Success

Definition at line 3147 of file main/app.c.

3148 {
3149  int i;
3150  *consumed = 1;
3151  *result = 0;
3152  if (ast_strlen_zero(stream)) {
3153  *consumed = 0;
3154  return -1;
3155  }
3156 
3157  if (*stream == '\\') {
3158  *consumed = 2;
3159  switch (*(stream + 1)) {
3160  case 'n':
3161  *result = '\n';
3162  break;
3163  case 'r':
3164  *result = '\r';
3165  break;
3166  case 't':
3167  *result = '\t';
3168  break;
3169  case 'x':
3170  /* Hexadecimal */
3171  if (strchr("0123456789ABCDEFabcdef", *(stream + 2)) && *(stream + 2) != '\0') {
3172  *consumed = 3;
3173  if (*(stream + 2) <= '9') {
3174  *result = *(stream + 2) - '0';
3175  } else if (*(stream + 2) <= 'F') {
3176  *result = *(stream + 2) - 'A' + 10;
3177  } else {
3178  *result = *(stream + 2) - 'a' + 10;
3179  }
3180  } else {
3181  ast_log(LOG_ERROR, "Illegal character '%c' in hexadecimal string\n", *(stream + 2));
3182  return -1;
3183  }
3184 
3185  if (strchr("0123456789ABCDEFabcdef", *(stream + 3)) && *(stream + 3) != '\0') {
3186  *consumed = 4;
3187  *result <<= 4;
3188  if (*(stream + 3) <= '9') {
3189  *result += *(stream + 3) - '0';
3190  } else if (*(stream + 3) <= 'F') {
3191  *result += *(stream + 3) - 'A' + 10;
3192  } else {
3193  *result += *(stream + 3) - 'a' + 10;
3194  }
3195  }
3196  break;
3197  case '0':
3198  /* Octal */
3199  *consumed = 2;
3200  for (i = 2; ; i++) {
3201  if (strchr("01234567", *(stream + i)) && *(stream + i) != '\0') {
3202  (*consumed)++;
3203  ast_debug(5, "result was %d, ", *result);
3204  *result <<= 3;
3205  *result += *(stream + i) - '0';
3206  ast_debug(5, "is now %d\n", *result);
3207  } else {
3208  break;
3209  }
3210  }
3211  break;
3212  default:
3213  *result = *(stream + 1);
3214  }
3215  } else {
3216  *result = *stream;
3217  *consumed = 1;
3218  }
3219  return 0;
3220 }

References ast_debug, ast_log, ast_strlen_zero(), LOG_ERROR, and result.

Referenced by ast_get_encoded_str(), ast_str_get_encoded_str(), cut_internal(), filter(), function_fieldnum_helper(), function_fieldqty_helper(), and replace().

◆ ast_get_encoded_str()

char* ast_get_encoded_str ( const char *  stream,
char *  result,
size_t  result_len 
)

Decode a stream of encoded control or extended ASCII characters.

Parameters
[in]streamEncoded string
[out]resultDecoded string
[in]result_lenMaximum size of the result buffer
Returns
A pointer to the result string

Definition at line 3222 of file main/app.c.

3223 {
3224  char *cur = result;
3225  size_t consumed;
3226 
3227  while (cur < result + result_size - 1 && !ast_get_encoded_char(stream, cur, &consumed)) {
3228  cur++;
3229  stream += consumed;
3230  }
3231  *cur = '\0';
3232  return result;
3233 }
int ast_get_encoded_char(const char *stream, char *result, size_t *consumed)
Decode an encoded control or extended ASCII character.
Definition: main/app.c:3147

References ast_get_encoded_char(), and result.

Referenced by chan_pjsip_new(), listfilter(), mgcp_new(), replace(), sip_addheader(), and sip_new().

◆ ast_install_stack_functions()

void ast_install_stack_functions ( const struct ast_app_stack_funcs funcs)

Set stack application function callbacks.

Since
11
Parameters
funcsStack applications callback functions.

Definition at line 343 of file main/app.c.

344 {
345  app_stack_callbacks = funcs;
346 }

References app_stack_callbacks.

◆ ast_ivr_menu_run()

int ast_ivr_menu_run ( struct ast_channel c,
struct ast_ivr_menu menu,
void *  cbdata 
)

Runs an IVR menu.

Return values
0on successful completion.
-1on hangup.
-2on user error in menu.

Definition at line 3002 of file main/app.c.

3003 {
3004  int res = ast_ivr_menu_run_internal(chan, menu, cbdata);
3005  /* Hide internal coding */
3006  return res > 0 ? 0 : res;
3007 }
static int ast_ivr_menu_run_internal(struct ast_channel *chan, struct ast_ivr_menu *menu, void *cbdata)
Definition: main/app.c:2917

References ast_ivr_menu_run_internal().

Referenced by skel_exec().

◆ ast_linear_stream()

int ast_linear_stream ( struct ast_channel chan,
const char *  filename,
int  fd,
int  allowoverride 
)

Stream a filename (or file descriptor) as a generator.

Definition at line 1305 of file main/app.c.

1306 {
1307  struct linear_state *lin;
1308  char tmpf[256];
1309  int autoclose = 0;
1310 
1311  if (fd < 0) {
1312  if (ast_strlen_zero(filename)) {
1313  return -1;
1314  }
1315 
1316  autoclose = 1;
1317 
1318  if (filename[0] == '/') {
1319  ast_copy_string(tmpf, filename, sizeof(tmpf));
1320  } else {
1321  snprintf(tmpf, sizeof(tmpf), "%s/%s/%s", ast_config_AST_DATA_DIR, "sounds", filename);
1322  }
1323 
1324  fd = open(tmpf, O_RDONLY);
1325  if (fd < 0) {
1326  ast_log(LOG_WARNING, "Unable to open file '%s': %s\n", tmpf, strerror(errno));
1327  return -1;
1328  }
1329  }
1330 
1331  lin = ast_calloc(1, sizeof(*lin));
1332  if (!lin) {
1333  if (autoclose) {
1334  close(fd);
1335  }
1336 
1337  return -1;
1338  }
1339 
1340  lin->fd = fd;
1342  lin->autoclose = autoclose;
1343 
1344  return ast_activate_generator(chan, &linearstream, lin);
1345 }
int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, void *params)
Definition: channel.c:2952
static struct ast_generator linearstream
Definition: main/app.c:1298
int errno
const char * ast_config_AST_DATA_DIR
Definition: options.c:158
int allowoverride
Definition: main/app.c:1220

References linear_state::allowoverride, ast_activate_generator(), ast_calloc, ast_config_AST_DATA_DIR, ast_copy_string(), ast_log, ast_strlen_zero(), linear_state::autoclose, errno, linear_state::fd, linearstream, and LOG_WARNING.

◆ ast_lock_path()

enum AST_LOCK_RESULT ast_lock_path ( const char *  path)

Lock a filesystem path.

Parameters
paththe path to be locked
Returns
one of AST_LOCK_RESULT values

Definition at line 2669 of file main/app.c.

2675 {
2677 
2678  switch (ast_lock_type) {
2680  r = ast_lock_path_lockfile(path);
2681  break;
2682  case AST_LOCK_TYPE_FLOCK:
2683  r = ast_lock_path_flock(path);
2684  break;
2685  }
2686 
2687  return r;
2688 }
ast_lock_type
Definition: check_expr.c:35
static enum AST_LOCK_RESULT ast_lock_path_lockfile(const char *path)
Definition: main/app.c:2480
static enum AST_LOCK_RESULT ast_lock_path_flock(const char *path)
Definition: main/app.c:2554

References type.

Referenced by test_vm_api_create_voicemail_files(), and vm_lock_path().

◆ ast_mf_stream()

int ast_mf_stream ( struct ast_channel chan,
struct ast_channel peer,
struct ast_channel chan2,
const char *  digits,
int  between,
unsigned int  duration,
unsigned int  durationkp,
unsigned int  durationst,
int  is_external 
)

Send a string of MF digits to a channel.

Parameters
chanThe channel that will receive the MF digits.
peer(optional) Peer channel that will be autoserviced while the primary channel is receiving MF
chan2A second channel that will simultaneously receive MF digits. This option may only be used if is_external is 0.
digitsThis is a string of characters representing the MF digits to be sent to the channel. Valid characters are "0123456789*#abcdABCD". Note: You can pass arguments 'f' or 'F', if you want to Flash the channel (if supported by the channel), or 'w' or 'W' to add a wink (if supported by the channel).
betweenThis is the number of milliseconds to wait in between each MF digit. If zero milliseconds is specified, then the default value of 50 will be used.
durationThis is the duration that each numeric MF digit should have. Default value is 55.
durationkpThis is the duration that each KP digit should have. Default is 120.
durationstThis is the duration that each ST, STP, ST2P, or ST3P digit should have. Default is 65.
is_external1 if called by a thread that is not the channel's media handler thread, 0 if called by the channel's media handler thread.
Return values
0on success.
-1on failure or a channel hung up.

Definition at line 1183 of file main/app.c.

1185 {
1186  int res;
1187  if (!is_external && !chan2 && peer && ast_autoservice_start(peer)) {
1188  return -1;
1189  }
1190  res = mf_stream(chan, chan2, digits, between, duration, durationkp, durationst, is_external);
1191  if (!is_external && !chan2 && peer && ast_autoservice_stop(peer)) {
1192  res = -1;
1193  }
1194  return res;
1195 }
static int mf_stream(struct ast_channel *chan, struct ast_channel *chan2, const char *digits, int between, unsigned int duration, unsigned int durationkp, unsigned int durationst, int is_external)
Definition: main/app.c:984

References ast_autoservice_start(), ast_autoservice_stop(), and mf_stream().

Referenced by manager_play_mf(), sendmf_exec(), and wait_for_answer().

◆ ast_play_and_prepend()

int ast_play_and_prepend ( struct ast_channel chan,
char *  playfile,
char *  recordfile,
int  maxtime_sec,
char *  fmt,
int *  duration,
int *  sound_duration,
int  beep,
int  silencethreshold,
int  maxsilence_ms 
)

Record a file based on input frm a channel. Recording is performed in 'prepend' mode which works a little differently from normal recordings This function will not play a success message due to post-recording control in the application this was added for.

Parameters
chanthe channel being recorded
playfileFilename of sound to play before recording begins
recordfileFilename to save the recording
maxtime_secLongest possible message length in seconds
fmtstring containing all formats to be recorded delimited by '|'
durationpointer to integer for storing length of the recording
sound_durationpointer to integer for storing length of the recording minus all silence
beepwhether to play a beep to prompt the recording
silencethresholdtolerance of noise levels that can be considered silence for the purpose of silence timeout, -1 for default
maxsilence_mslength of time in milliseconds which will trigger a timeout from silence, -1 for default.
Return values
-1failure or hangup
'S'Recording ended from silence timeout
't'Recording either exceeded maximum duration or the call was ended via DTMF

Definition at line 2219 of file main/app.c.

2220 {
2221  return __ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, sound_duration, beep, silencethreshold, maxsilence, NULL, 1, default_acceptdtmf, default_canceldtmf, 1, AST_RECORD_IF_EXISTS_OVERWRITE);
2222 }
static int silencethreshold
static int maxsilence
static const char default_acceptdtmf[]
Definition: main/app.c:2206
static int __ast_play_and_record(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime, const char *fmt, int *duration, int *sound_duration, int beep, int silencethreshold, int maxsilence, const char *path, int prepend, const char *acceptdtmf, const char *canceldtmf, int skip_confirmation_sound, enum ast_record_if_exists if_exists)
Definition: main/app.c:1797
static const char default_canceldtmf[]
Definition: main/app.c:2207

References __ast_play_and_record(), AST_RECORD_IF_EXISTS_OVERWRITE, default_acceptdtmf, default_canceldtmf, maxsilence, NULL, and silencethreshold.

Referenced by vm_forwardoptions().

◆ ast_play_and_record()

int ast_play_and_record ( struct ast_channel chan,
const char *  playfile,
const char *  recordfile,
int  maxtime_sec,
const char *  fmt,
int *  duration,
int *  sound_duration,
int  silencethreshold,
int  maxsilence_ms,
const char *  path 
)

Record a file based on input from a channel. Use default accept and cancel DTMF. This function will play "auth-thankyou" upon successful recording.

Parameters
chanthe channel being recorded
playfileFilename of sound to play before recording begins
recordfileFilename to save the recording
maxtime_secLongest possible message length in seconds
fmtstring containing all formats to be recorded delimited by '|'
durationpointer to integer for storing length of the recording
sound_durationpointer to integer for storing length of the recording minus all silence
silencethresholdtolerance of noise levels that can be considered silence for the purpose of silence timeout, -1 for default
maxsilence_mslength of time in milliseconds which will trigger a timeout from silence, -1 for default
pathOptional filesystem path to unlock
Return values
-1failure or hangup
'S'Recording ended from silence timeout
't'Recording ended from the message exceeding the maximum duration
dtmfcharRecording ended via the return value's DTMF character for either cancel or accept.

Definition at line 2214 of file main/app.c.

2215 {
2216  return __ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, sound_duration, 0, silencethreshold, maxsilence, path, 0, default_acceptdtmf, default_canceldtmf, 0, AST_RECORD_IF_EXISTS_OVERWRITE);
2217 }

References __ast_play_and_record(), AST_RECORD_IF_EXISTS_OVERWRITE, default_acceptdtmf, default_canceldtmf, maxsilence, and silencethreshold.

Referenced by app_exec(), ast_record_review(), conf_rec_name(), conf_run(), and setup_privacy_args().

◆ ast_play_and_record_full()

int ast_play_and_record_full ( struct ast_channel chan,
const char *  playfile,
const char *  recordfile,
int  maxtime_sec,
const char *  fmt,
int *  duration,
int *  sound_duration,
int  beep,
int  silencethreshold,
int  maxsilence_ms,
const char *  path,
const char *  acceptdtmf,
const char *  canceldtmf,
int  skip_confirmation_sound,
enum ast_record_if_exists  if_exists 
)

Record a file based on input from a channel This function will play "auth-thankyou" upon successful recording if skip_confirmation_sound is false.

Parameters
chanthe channel being recorded
playfileFilename of sound to play before recording begins. A beep is also played when playfile completes, before the recording begins.
recordfileFilename to save the recording
maxtime_secLongest possible message length in seconds
fmtstring containing all formats to be recorded delimited by '|'
durationpointer to integer for storing length of the recording
beepIf true, play a beep before recording begins (and doesn't play playfile)
sound_durationpointer to integer for storing length of the recording minus all silence
silencethresholdtolerance of noise levels that can be considered silence for the purpose of silence timeout, -1 for default
maxsilence_msLength of time in milliseconds which will trigger a timeout from silence, -1 for default
pathOptional filesystem path to unlock
acceptdtmfCharacter of DTMF to end and accept the recording
canceldtmfCharacter of DTMF to end and cancel the recording
skip_confirmation_soundIf true, don't play auth-thankyou at end. Nice for custom recording prompts in apps.
if_existsAction to take if recording already exists.
Return values
-1failure or hangup
'S'Recording ended from silence timeout
't'Recording ended from the message exceeding the maximum duration
dtmfcharRecording ended via the return value's DTMF character for either cancel or accept.

Definition at line 2209 of file main/app.c.

2210 {
2211  return __ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, sound_duration, beep, silencethreshold, maxsilence, path, 0, S_OR(acceptdtmf, ""), S_OR(canceldtmf, default_canceldtmf), skip_confirmation_sound, if_exists);
2212 }
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80

References __ast_play_and_record(), default_canceldtmf, maxsilence, S_OR, and silencethreshold.

Referenced by play_record_review(), and record_file().

◆ ast_play_and_wait()

int ast_play_and_wait ( struct ast_channel chan,
const char *  fn 
)

Play a stream and wait for a digit, returning the digit that was pressed.

Definition at line 1686 of file main/app.c.

1687 {
1688  int d = 0;
1689 
1690  if ((d = ast_streamfile(chan, fn, ast_channel_language(chan)))) {
1691  return d;
1692  }
1693 
1694  d = ast_waitstream(chan, AST_DIGIT_ANY);
1695 
1696  ast_stopstream(chan);
1697 
1698  return d;
1699 }
int ast_stopstream(struct ast_channel *c)
Stops a stream.
Definition: file.c:222
#define AST_DIGIT_ANY
Definition: file.h:48
int ast_waitstream(struct ast_channel *c, const char *breakon)
Waits for a stream to stop or digit to be pressed.
Definition: file.c:1817
static struct test_val d

References ast_channel_language(), AST_DIGIT_ANY, ast_stopstream(), ast_streamfile(), ast_waitstream(), and d.

Referenced by __ast_play_and_record(), advanced_options(), ast_record_review(), ast_say_counted_adjective(), ast_say_counted_noun(), dialout(), forward_message(), get_folder(), get_folder2(), get_folder_ja(), leave_voicemail(), minivm_greet_exec(), play_message_category(), play_message_duration(), play_record_review(), vm_authenticate(), vm_browse_messages_en(), vm_browse_messages_es(), vm_browse_messages_gr(), vm_browse_messages_he(), vm_browse_messages_it(), vm_browse_messages_ja(), vm_browse_messages_pt(), vm_browse_messages_vi(), vm_browse_messages_zh(), vm_exec(), vm_execmain(), vm_forwardoptions(), vm_instructions_en(), vm_instructions_ja(), vm_instructions_zh(), vm_intro(), vm_intro_cs(), vm_intro_da(), vm_intro_de(), vm_intro_en(), vm_intro_es(), vm_intro_fr(), vm_intro_gr(), vm_intro_he(), vm_intro_is(), vm_intro_it(), vm_intro_ja(), vm_intro_multilang(), vm_intro_nl(), vm_intro_no(), vm_intro_pl(), vm_intro_pt(), vm_intro_pt_BR(), vm_intro_se(), vm_intro_vi(), vm_intro_zh(), vm_newuser_setup(), vm_options(), vm_play_folder_name(), vm_play_folder_name_gr(), vm_play_folder_name_ja(), vm_play_folder_name_pl(), vm_play_folder_name_ua(), vm_tempgreeting(), and vmauthenticate().

◆ ast_queue_topic()

struct stasis_topic* ast_queue_topic ( const char *  queuename)

Get the Stasis Message Bus API topic for queue messages for a particular queue name.

Parameters
queuenameThe name for which to get the topic
Returns
The topic structure for queue messages for a given name
Return values
NULLif it failed to be found or allocated
Since
12

Definition at line 3409 of file main/app.c.

3410 {
3411  return stasis_topic_pool_get_topic(queue_topic_pool, queuename);
3412 }
struct stasis_topic * stasis_topic_pool_get_topic(struct stasis_topic_pool *pool, const char *topic_name)
Find or create a topic in the pool.
Definition: stasis.c:1886

References queue_topic_pool, and stasis_topic_pool_get_topic().

Referenced by send_agent_complete().

◆ ast_queue_topic_all()

struct stasis_topic* ast_queue_topic_all ( void  )

Get the Stasis Message Bus API topic for queue messages.

Returns
The topic structure for queue messages
Return values
NULLif it has not been allocated
Since
12

Definition at line 3404 of file main/app.c.

3405 {
3406  return queue_topic_all;
3407 }

References queue_topic_all.

◆ ast_read_textfile()

char* ast_read_textfile ( const char *  file)

Read a file into asterisk.

Definition at line 3009 of file main/app.c.

3010 {
3011  int fd, count = 0, res;
3012  char *output = NULL;
3013  struct stat filesize;
3014 
3015  if (stat(filename, &filesize) == -1) {
3016  ast_log(LOG_WARNING, "Error can't stat %s\n", filename);
3017  return NULL;
3018  }
3019 
3020  count = filesize.st_size + 1;
3021 
3022  if ((fd = open(filename, O_RDONLY)) < 0) {
3023  ast_log(LOG_WARNING, "Cannot open file '%s' for reading: %s\n", filename, strerror(errno));
3024  return NULL;
3025  }
3026 
3027  if ((output = ast_malloc(count))) {
3028  res = read(fd, output, count - 1);
3029  if (res == count - 1) {
3030  output[res] = '\0';
3031  } else {
3032  ast_log(LOG_WARNING, "Short read of %s (%d of %d): %s\n", filename, res, count - 1, strerror(errno));
3033  ast_free(output);
3034  output = NULL;
3035  }
3036  }
3037 
3038  close(fd);
3039 
3040  return output;
3041 }

References ast_free, ast_log, ast_malloc, errno, LOG_WARNING, and NULL.

Referenced by ast_tcptls_server_start().

◆ ast_record_review()

int ast_record_review ( struct ast_channel chan,
const char *  playfile,
const char *  recordfile,
int  maxtime,
const char *  fmt,
int *  duration,
const char *  path 
)

Allow to record message and have a review option.

Definition at line 2706 of file main/app.c.

2707 {
2708  int silencethreshold;
2709  int maxsilence = 0;
2710  int res = 0;
2711  int cmd = 0;
2712  int max_attempts = 3;
2713  int attempts = 0;
2714  int recorded = 0;
2715  int message_exists = 0;
2716  /* Note that urgent and private are for flagging messages as such in the future */
2717 
2718  /* barf if no pointer passed to store duration in */
2719  if (!duration) {
2720  ast_log(LOG_WARNING, "Error ast_record_review called without duration pointer\n");
2721  return -1;
2722  }
2723 
2724  cmd = '3'; /* Want to start by recording */
2725 
2727 
2728  while ((cmd >= 0) && (cmd != 't')) {
2729  switch (cmd) {
2730  case '1':
2731  if (!message_exists) {
2732  /* In this case, 1 is to record a message */
2733  cmd = '3';
2734  break;
2735  } else {
2736  ast_stream_and_wait(chan, "vm-msgsaved", "");
2737  cmd = 't';
2738  return res;
2739  }
2740  case '2':
2741  /* Review */
2742  ast_verb(3, "Reviewing the recording\n");
2743  cmd = ast_stream_and_wait(chan, recordfile, AST_DIGIT_ANY);
2744  break;
2745  case '3':
2746  message_exists = 0;
2747  /* Record */
2748  ast_verb(3, "R%secording\n", recorded == 1 ? "e-r" : "");
2749  recorded = 1;
2750  if ((cmd = ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, NULL, silencethreshold, maxsilence, path)) == -1) {
2751  /* User has hung up, no options to give */
2752  return cmd;
2753  }
2754  if (cmd == '0') {
2755  break;
2756  } else if (cmd == '*') {
2757  break;
2758  } else {
2759  /* If all is well, a message exists */
2760  message_exists = 1;
2761  cmd = 0;
2762  }
2763  break;
2764  case '4':
2765  case '5':
2766  case '6':
2767  case '7':
2768  case '8':
2769  case '9':
2770  case '*':
2771  case '#':
2772  cmd = ast_play_and_wait(chan, "vm-sorry");
2773  break;
2774  default:
2775  if (message_exists) {
2776  cmd = ast_play_and_wait(chan, "vm-review");
2777  } else {
2778  if (!(cmd = ast_play_and_wait(chan, "vm-torerecord"))) {
2779  cmd = ast_waitfordigit(chan, 600);
2780  }
2781  }
2782 
2783  if (!cmd) {
2784  cmd = ast_waitfordigit(chan, 6000);
2785  }
2786  if (!cmd) {
2787  attempts++;
2788  }
2789  if (attempts > max_attempts) {
2790  cmd = 't';
2791  }
2792  }
2793  }
2794  if (cmd == 't') {
2795  cmd = 0;
2796  }
2797  return cmd;
2798 }
@ THRESHOLD_SILENCE
Definition: dsp.h:73
int ast_dsp_get_threshold_from_settings(enum threshold which)
Get silence threshold from dsp.conf.
Definition: dsp.c:1999
int ast_stream_and_wait(struct ast_channel *chan, const char *file, const char *digits)
stream file until digit If the file name is non-empty, try to play it.
Definition: file.c:1855
#define ast_verb(level,...)
int ast_play_and_wait(struct ast_channel *chan, const char *fn)
Play a stream and wait for a digit, returning the digit that was pressed.
Definition: main/app.c:1686
int ast_play_and_record(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime, const char *fmt, int *duration, int *sound_duration, int silencethreshold, int maxsilence, const char *path)
Record a file based on input from a channel. Use default accept and cancel DTMF. This function will p...
Definition: main/app.c:2214

References AST_DIGIT_ANY, ast_dsp_get_threshold_from_settings(), ast_log, ast_play_and_record(), ast_play_and_wait(), ast_stream_and_wait(), ast_verb, ast_waitfordigit(), LOG_WARNING, maxsilence, NULL, path_lock::path, silencethreshold, and THRESHOLD_SILENCE.

Referenced by conf_rec_name(), and conf_run().

◆ ast_replace_sigchld()

void ast_replace_sigchld ( void  )

Replace the SIGCHLD handler.

Normally, Asterisk has a SIGCHLD handler that is cleaning up all zombie processes from forking elsewhere in Asterisk. However, if you want to wait*() on the process to retrieve information about it's exit status, then this signal handler needs to be temporarily replaced.

Code that executes this function must call ast_unreplace_sigchld() after it is finished doing the wait*().

Definition at line 801 of file extconf.c.

802 {
803  unsigned int level;
804 
805  level = safe_system_level++;
806 
807  /* only replace the handler if it has not already been done */
808  if (level == 0) {
809  sigaction(SIGCHLD, &null_sig_handler, &safe_system_prev_handler);
810  }
811 }
static unsigned int safe_system_level
Keep track of how many threads are currently trying to wait*() on a child process.
Definition: extconf.c:785
static struct sigaction safe_system_prev_handler
Definition: extconf.c:786
static struct sigaction null_sig_handler
Definition: extconf.c:794

References ast_mutex_lock, ast_mutex_unlock, null_sig_handler, safe_system_level, safe_system_lock, and safe_system_prev_handler.

Referenced by ast_safe_fork(), ast_safe_system(), and safe_exec_prep().

◆ ast_safe_execvp()

int ast_safe_execvp ( int  dualfork,
const char *  file,
char *const  argv[] 
)

Safely spawn an external program while closing file descriptors.

Note
This replaces the execvp call in all Asterisk modules
Parameters
dualforkNon-zero to simulate running the program in the background by forking twice. The option provides similar functionality to the '&' in the OS shell command "cmd &". The option allows Asterisk to run a reaper loop to watch the first fork which immediately exits after spaning the second fork. The actual program is run in the second fork.
fileexecvp(file, argv) file parameter
argvexecvp(file, argv) argv parameter

Definition at line 1216 of file asterisk.c.

1217 {
1218  pid_t pid = safe_exec_prep(dualfork);
1219 
1220  if (pid == 0) {
1221  execvp(file, argv);
1222  _exit(1);
1223  /* noreturn from _exit */
1224  }
1225 
1226  return safe_exec_wait(pid);
1227 }
static int safe_exec_wait(pid_t pid)
wait for spawned application to complete and unreplace sigchld
Definition: asterisk.c:1190
static pid_t safe_exec_prep(int dualfork)
fork and perform other preparations for spawning applications
Definition: asterisk.c:1129

References make_ari_stubs::file, safe_exec_prep(), and safe_exec_wait().

Referenced by run_externnotify().

◆ ast_safe_fork()

int ast_safe_fork ( int  stop_reaper)

Common routine to safely fork without a chance of a signal handler firing badly in the child.

Parameters
[in]stop_reaperflag to determine if sigchld handler is replaced or not
Since
1.6.1

Definition at line 3267 of file main/app.c.

3268 {
3269  sigset_t signal_set, old_set;
3270  int pid;
3271 
3272  /* Don't let the default signal handler for children reap our status */
3273  if (stop_reaper) {
3275  }
3276 
3277  /* GCC 4.9 gives a bogus "right-hand operand of comma expression has
3278  * no effect" warning */
3279  (void) sigfillset(&signal_set);
3280  pthread_sigmask(SIG_BLOCK, &signal_set, &old_set);
3281 
3282  pid = fork();
3283 
3284  if (pid != 0) {
3285  /* Fork failed or parent */
3286  pthread_sigmask(SIG_SETMASK, &old_set, NULL);
3287  if (!stop_reaper && pid > 0) {
3288  struct zombie *cur = ast_calloc(1, sizeof(*cur));
3289  if (cur) {
3290  cur->pid = pid;
3296  ast_log(LOG_ERROR, "Shaun of the Dead wants to kill zombies, but can't?!!\n");
3298  }
3299  }
3300  }
3301  }
3302  return pid;
3303  } else {
3304  /* Child */
3305 #ifdef HAVE_CAP
3306  cap_set_proc(child_cap);
3307 #endif
3308 
3309  /* Before we unblock our signals, return our trapped signals back to the defaults */
3310  signal(SIGHUP, SIG_DFL);
3311  signal(SIGCHLD, SIG_DFL);
3312  signal(SIGINT, SIG_DFL);
3313  signal(SIGURG, SIG_DFL);
3314  signal(SIGTERM, SIG_DFL);
3315  signal(SIGPIPE, SIG_DFL);
3316  signal(SIGXFSZ, SIG_DFL);
3317 
3318  /* unblock important signal handlers */
3319  if (pthread_sigmask(SIG_UNBLOCK, &signal_set, NULL)) {
3320  ast_log(LOG_WARNING, "unable to unblock signals: %s\n", strerror(errno));
3321  _exit(1);
3322  }
3323 
3324  return pid;
3325  }
3326 }
void ast_replace_sigchld(void)
Replace the SIGCHLD handler.
Definition: extconf.c:801
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:731
#define AST_LIST_LOCK(head)
Locks a list.
Definition: linkedlists.h:40
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Definition: linkedlists.h:140
#define AST_PTHREADT_NULL
Definition: lock.h:66
static pthread_t shaun_of_the_dead_thread
Definition: main/app.c:74
static void * shaun_of_the_dead(void *data)
Definition: main/app.c:95
pid_t pid
Definition: main/app.c:77
struct zombie::@323 list
#define ast_pthread_create_background(a, b, c, d)
Definition: utils.h:587

References ast_calloc, AST_LIST_INSERT_TAIL, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_log, ast_pthread_create_background, AST_PTHREADT_NULL, ast_replace_sigchld(), errno, zombie::list, LOG_ERROR, LOG_WARNING, NULL, zombie::pid, shaun_of_the_dead(), and shaun_of_the_dead_thread.

Referenced by app_exec(), filestream_destructor(), mp3play(), send_waveform_to_fd(), spawn_mp3(), and vm_check_password_shell().

◆ ast_safe_fork_cleanup()

void ast_safe_fork_cleanup ( void  )

Common routine to cleanup after fork'ed process is complete (if reaping was stopped)

Since
1.6.1

Definition at line 3328 of file main/app.c.

3329 {
3331 }
void ast_unreplace_sigchld(void)
Restore the SIGCHLD handler.
Definition: extconf.c:815

References ast_unreplace_sigchld().

Referenced by agi_exec_full().

◆ ast_safe_system()

int ast_safe_system ( const char *  s)

Safely spawn an OS shell command while closing file descriptors.

Note
This replaces the system call in all Asterisk modules
Parameters
s- OS shell command string to execute.
Warning
Command injection can happen using this call if the passed in string is created using untrusted data from an external source. It is best not to use untrusted data. However, the caller could filter out dangerous characters to avoid command injection.

Definition at line 829 of file extconf.c.

830 {
831  pid_t pid;
832 #ifdef HAVE_WORKING_FORK
833  int x;
834 #endif
835  int res;
836  int status;
837 
838 #if defined(HAVE_WORKING_FORK) || defined(HAVE_WORKING_VFORK)
840 
841 #ifdef HAVE_WORKING_FORK
842  pid = fork();
843 #else
844  pid = vfork();
845 #endif
846 
847  if (pid == 0) {
848 #ifdef HAVE_WORKING_FORK
849  /* Close file descriptors and launch system command */
850  for (x = STDERR_FILENO + 1; x < 4096; x++)
851  close(x);
852 #endif
853  execl("/bin/sh", "/bin/sh", "-c", s, (char *) NULL);
854  _exit(1);
855  } else if (pid > 0) {
856  for(;;) {
857  res = waitpid(pid, &status, 0);
858  if (res > -1) {
859  res = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
860  break;
861  } else if (errno != EINTR)
862  break;
863  }
864  } else {
865  ast_log(LOG_WARNING, "Fork failed: %s\n", strerror(errno));
866  res = -1;
867  }
868 
870 #else
871  res = -1;
872 #endif
873 
874  return res;
875 }
jack_status_t status
Definition: app_jack.c:146
void ast_replace_sigchld(void)
Replace the SIGCHLD handler.
Definition: extconf.c:801
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2194
void ast_unreplace_sigchld(void)
Restore the SIGCHLD handler.
Definition: extconf.c:815
#define LOG_WARNING
Definition: extconf.c:139
#define WEXITSTATUS(status)
#define WIFEXITED(status)

References ast_log(), ast_replace_sigchld(), ast_unreplace_sigchld(), errno, LOG_WARNING, NULL, safe_exec_prep(), safe_exec_wait(), status, WEXITSTATUS, and WIFEXITED.

Referenced by add_email_attachment(), alarmreceiver_exec(), ast_monitor_stop(), AST_TEST_DEFINE(), consolehandler(), convert_bdb_to_sqlite3(), mixmonitor_thread(), notify_message(), process_text_line(), remoteconsolehandler(), rotate_file(), run_externnotify(), sendmail(), sendpage(), system_exec_helper(), and vm_change_password_shell().

◆ ast_set_lock_type()

void ast_set_lock_type ( enum AST_LOCK_TYPE  type)

Set the type of locks used by ast_lock_path()

Parameters
typethe locking type to use

Definition at line 2669 of file main/app.c.

2670 {
2671  ast_lock_type = type;
2672 }
static const char type[]
Definition: chan_ooh323.c:109

Referenced by load_asterisk_conf().

◆ ast_sf_stream()

int ast_sf_stream ( struct ast_channel chan,
struct ast_channel peer,
struct ast_channel chan2,
const char *  digits,
int  frequency,
int  is_external 
)

Send a string of SF digits to a channel.

Parameters
chanThe channel that will receive the SF digits
peer(optional) Peer channel that will be autoserviced while the primary channel is receiving SF
chan2A second channel that will simultaneously receive SF digits. This option may only be used if is_external is 0.
digitsThis is a string of characters representing the SF digits to be sent to the channel. Valid characters are "0123456789". Note: You can pass arguments 'f' or 'F', if you want to Flash the channel (if supported by the channel), or 'w' or 'W' to add a wink (if supported by the channel).
frequencyThe frequency to use for signaling. 0 can be specified for the default, which is 2600 Hz.
is_external1 if called by a thread that is not the channel's media handler thread, 0 if called by the channel's media handler thread.
Return values
0on success.
-1on failure or a channel hung up.

Definition at line 1167 of file main/app.c.

1168 {
1169  int res;
1170  if (frequency <= 0) {
1171  frequency = 2600;
1172  }
1173  if (!is_external && !chan2 && peer && ast_autoservice_start(peer)) {
1174  return -1;
1175  }
1176  res = sf_stream(chan, chan2, digits, frequency, is_external);
1177  if (!is_external && !chan2 && peer && ast_autoservice_stop(peer)) {
1178  res = -1;
1179  }
1180  return res;
1181 }
static int sf_stream(struct ast_channel *chan, struct ast_channel *chan2, const char *digits, int frequency, int is_external)
Definition: main/app.c:833

References ast_autoservice_start(), ast_autoservice_stop(), and sf_stream().

Referenced by sendsf_exec(), and wait_for_answer().

◆ ast_str_get_encoded_str()

int ast_str_get_encoded_str ( struct ast_str **  str,
int  maxlen,
const char *  stream 
)

Decode a stream of encoded control or extended ASCII characters.

Definition at line 3235 of file main/app.c.

3236 {
3237  char next, *buf;
3238  size_t offset = 0;
3239  size_t consumed;
3240 
3241  if (strchr(stream, '\\')) {
3242  while (!ast_get_encoded_char(stream, &next, &consumed)) {
3243  if (offset + 2 > ast_str_size(*str) && maxlen > -1) {
3244  ast_str_make_space(str, maxlen > 0 ? maxlen : (ast_str_size(*str) + 48) * 2 - 48);
3245  }
3246  if (offset + 2 > ast_str_size(*str)) {
3247  break;
3248  }
3249  buf = ast_str_buffer(*str);
3250  buf[offset++] = next;
3251  stream += consumed;
3252  }
3253  buf = ast_str_buffer(*str);
3254  buf[offset++] = '\0';
3255  ast_str_update(*str);
3256  } else {
3257  ast_str_set(str, maxlen, "%s", stream);
3258  }
3259  return 0;
3260 }
const char * str
Definition: app_jack.c:147
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:739
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1091
#define ast_str_make_space(buf, new_len)
Definition: strings.h:806
void ast_str_update(struct ast_str *buf)
Update the length of the buffer, after using ast_str merely as a buffer.
Definition: strings.h:684
size_t ast_str_size(const struct ast_str *buf)
Returns the current maximum length (without reallocation) of the current buffer.
Definition: strings.h:723

References ast_get_encoded_char(), ast_str_buffer(), ast_str_make_space, ast_str_set(), ast_str_size(), ast_str_update(), buf, and str.

Referenced by sendtext_exec(), and system_exec_helper().

◆ AST_THREADSTORAGE_EXTERNAL()

AST_THREADSTORAGE_EXTERNAL ( ast_str_thread_global_buf  )

◆ ast_unlock_path()

int ast_unlock_path ( const char *  path)

Unlock a path.

Definition at line 2690 of file main/app.c.

2691 {
2692  int r = 0;
2693 
2694  switch (ast_lock_type) {
2696  r = ast_unlock_path_lockfile(path);
2697  break;
2698  case AST_LOCK_TYPE_FLOCK:
2699  r = ast_unlock_path_flock(path);
2700  break;
2701  }
2702 
2703  return r;
2704 }
static int ast_unlock_path_flock(const char *path)
Definition: main/app.c:2639
static int ast_unlock_path_lockfile(const char *path)
Definition: main/app.c:2517

References AST_LOCK_TYPE_FLOCK, AST_LOCK_TYPE_LOCKFILE, ast_unlock_path_flock(), ast_unlock_path_lockfile(), and path_lock::path.

Referenced by __ast_play_and_record(), access_counter_file(), close_mailbox(), copy_message(), count_messages(), leave_voicemail(), msg_create_from_file(), open_mailbox(), resequence_mailbox(), save_to_folder(), and test_vm_api_create_voicemail_files().

◆ ast_unreplace_sigchld()

void ast_unreplace_sigchld ( void  )

Restore the SIGCHLD handler.

This function is called after a call to ast_replace_sigchld. It restores the SIGCHLD handler that cleans up any zombie processes.

Definition at line 815 of file extconf.c.

816 {
817  unsigned int level;
818 
819  level = --safe_system_level;
820 
821  /* only restore the handler if we are the last one */
822  if (level == 0) {
823  sigaction(SIGCHLD, &safe_system_prev_handler, NULL);
824  }
825 }

References ast_mutex_lock, ast_mutex_unlock, NULL, safe_system_level, safe_system_lock, and safe_system_prev_handler.

Referenced by ast_safe_fork_cleanup(), ast_safe_system(), and safe_exec_wait().

◆ ast_vm_greeter_is_registered()

int ast_vm_greeter_is_registered ( void  )

Determine if a voicemail greeter provider is registered.

Since
13.0.0
Return values
0if no provider registered.
1if a provider is registered.

Definition at line 538 of file main/app.c.

539 {
541  int is_registered;
542 
543  table = ao2_global_obj_ref(vm_greeter_provider);
544  is_registered = table ? 1 : 0;
546  return is_registered;
547 }

References ao2_cleanup, ao2_global_obj_ref, and table.

◆ ast_vm_greeter_unregister()

void ast_vm_greeter_unregister ( const char *  module_name)

Unregister the specified voicemail greeter provider.

Since
13.0.0
Parameters
module_nameThe module name of the provider to unregister

Definition at line 581 of file main/app.c.

582 {
584 
585  table = ao2_global_obj_ref(vm_greeter_provider);
586  if (table && !strcmp(table->module_name, module_name)) {
587  ao2_global_obj_release(vm_greeter_provider);
588  }
590 }
#define ao2_global_obj_release(holder)
Release the ao2 object held in the global holder.
Definition: astobj2.h:859
const char * module_name
The name of the module that provides the voicemail greeter functionality.

References ao2_cleanup, ao2_global_obj_ref, ao2_global_obj_release, ast_vm_greeter_functions::module_name, and table.

Referenced by unload_module().

◆ ast_vm_index_to_foldername()

const char* ast_vm_index_to_foldername ( int  id)

Return name of folder, given an id.

Parameters
[in]idFolder id
Returns
Name of folder

Definition at line 723 of file main/app.c.

724 {
725  const char *res = NULL;
726 
727  VM_API_CALL(res, index_to_foldername, (id));
728  return res;
729 }

References NULL, and VM_API_CALL.

◆ ast_vm_is_registered()

int ast_vm_is_registered ( void  )

Determine if a voicemail provider is registered.

Since
12.0.0
Return values
0if no provider registered.
1if a provider is registered.

Definition at line 427 of file main/app.c.

428 {
429  struct ast_vm_functions *table;
430  int is_registered;
431 
432  table = ao2_global_obj_ref(vm_provider);
433  is_registered = table ? 1 : 0;
435  return is_registered;
436 }

References ao2_cleanup, ao2_global_obj_ref, and table.

◆ ast_vm_mailbox_snapshot_create()

struct ast_vm_mailbox_snapshot* ast_vm_mailbox_snapshot_create ( const char *  mailbox,
const char *  context,
const char *  folder,
int  descending,
enum ast_vm_snapshot_sort_val  sort_val,
int  combine_INBOX_and_OLD 
)

Create a snapshot of a mailbox which contains information about every msg.

Parameters
mailboxthe mailbox to look for
contextthe context to look for the mailbox in
folderOPTIONAL. When not NULL only msgs from the specified folder will be included.
descendinglist the msgs in descending order rather than ascending order.
sort_valWhat to sort in the snapshot.
combine_INBOX_and_OLDWhen this argument is set, The OLD folder will be represented in the INBOX folder of the snapshot. This allows the snapshot to represent the OLD and INBOX messages in sorted order merged together.
Returns
snapshot on success
Return values
NULLon failure

Definition at line 731 of file main/app.c.

737 {
738  struct ast_vm_mailbox_snapshot *res = NULL;
739 
740  VM_API_CALL(res, mailbox_snapshot_create, (mailbox, context, folder, descending,
741  sort_val, combine_INBOX_and_OLD));
742  return res;
743 }
static char mailbox[AST_MAX_MAILBOX_UNIQUEID]
Definition: chan_mgcp.c:207

References context, mailbox, NULL, and VM_API_CALL.

Referenced by test_vm_api_remove_all_messages().

◆ ast_vm_mailbox_snapshot_destroy()

struct ast_vm_mailbox_snapshot* ast_vm_mailbox_snapshot_destroy ( struct ast_vm_mailbox_snapshot mailbox_snapshot)

destroy a snapshot

Parameters
mailbox_snapshotThe snapshot to destroy.
Return values
NULL

Definition at line 745 of file main/app.c.

746 {
747  struct ast_vm_mailbox_snapshot *res = NULL;
748 
749  VM_API_CALL(res, mailbox_snapshot_destroy, (mailbox_snapshot));
750  return res;
751 }

References NULL, and VM_API_CALL.

Referenced by AST_TEST_DEFINE(), and test_vm_api_remove_all_messages().

◆ ast_vm_msg_forward()

int ast_vm_msg_forward ( const char *  from_mailbox,
const char *  from_context,
const char *  from_folder,
const char *  to_mailbox,
const char *  to_context,
const char *  to_folder,
size_t  num_msgs,
const char *  msg_ids[],
int  delete_old 
)

forward a message from one mailbox to another.

from_mailbox The original mailbox the message is being forwarded from

from_context The voicemail context of the from_mailbox

from_folder The folder from which the message is being forwarded

to_mailbox The mailbox to forward the message to

to_context The voicemail context of the to_mailbox

to_folder The folder to which the message is being forwarded

num_msgs The number of messages being forwarded

msg_ids The message IDs of the messages in from_mailbox to forward

delete_old If non-zero, the forwarded messages are also deleted from from_mailbox. Otherwise, the messages will remain in the from_mailbox.

Return values
-1Failure
0Success

Definition at line 779 of file main/app.c.

788 {
789  int res = 0;
790 
791  VM_API_CALL(res, msg_forward, (from_mailbox, from_context, from_folder, to_mailbox,
792  to_context, to_folder, num_msgs, msg_ids, delete_old));
793  return res;
794 }
def from_mailbox(key, val, section, pjsip, nmapped)

References sip_to_pjsip::from_mailbox(), and VM_API_CALL.

◆ ast_vm_msg_move()

int ast_vm_msg_move ( const char *  mailbox,
const char *  context,
size_t  num_msgs,
const char *  oldfolder,
const char *  old_msg_ids[],
const char *  newfolder 
)

Move messages from one folder to another.

Parameters
mailboxThe mailbox to which the folders belong
contextThe voicemail context for the mailbox
num_msgsThe number of messages to move
oldfolderThe folder from where messages should be moved
old_msg_idsThe message IDs of the messages to move
newfolderThe folder to which messages should be moved new folder. This array must be num_msgs sized.
Return values
-1Failure
0Success

Definition at line 753 of file main/app.c.

759 {
760  int res = 0;
761 
762  VM_API_CALL(res, msg_move, (mailbox, context, num_msgs, oldfolder, old_msg_ids,
763  newfolder));
764  return res;
765 }

References context, mailbox, and VM_API_CALL.

◆ ast_vm_msg_play()

int ast_vm_msg_play ( struct ast_channel chan,
const char *  mailbox,
const char *  context,
const char *  folder,
const char *  msg_num,
ast_vm_msg_play_cb cb 
)

Play a voicemail msg back on a channel.

Parameters
chan
mailboxmsg is in.
contextof mailbox.
foldervoicemail folder to look in.
msg_nummessage number in the voicemailbox to playback to the channel.
cb
Return values
0success
-1failure

Definition at line 796 of file main/app.c.

802 {
803  int res = 0;
804 
805  VM_API_CALL(res, msg_play, (chan, mailbox, context, folder, msg_num, cb));
806  return res;
807 }

References context, mailbox, and VM_API_CALL.

◆ ast_vm_msg_remove()

int ast_vm_msg_remove ( const char *  mailbox,
const char *  context,
size_t  num_msgs,
const char *  folder,
const char *  msgs[] 
)

Remove/delete messages from a mailbox folder.

Parameters
mailboxThe mailbox from which to delete messages
contextThe voicemail context for the mailbox
num_msgsThe number of messages to delete
folderThe folder from which to remove messages
msgsThe message IDs of the messages to delete
Return values
-1Failure
0Success

Definition at line 767 of file main/app.c.

772 {
773  int res = 0;
774 
775  VM_API_CALL(res, msg_remove, (mailbox, context, num_msgs, folder, msgs));
776  return res;
777 }

References context, mailbox, and VM_API_CALL.

◆ ast_vm_unregister()

void ast_vm_unregister ( const char *  module_name)

Unregister the specified voicemail provider.

Parameters
module_nameThe module name of the provider to unregister

Definition at line 470 of file main/app.c.

471 {
472  struct ast_vm_functions *table;
473 
474  table = ao2_global_obj_ref(vm_provider);
475  if (table && !strcmp(table->module_name, module_name)) {
476  ao2_global_obj_release(vm_provider);
477  }
479 }

References ao2_cleanup, ao2_global_obj_ref, ao2_global_obj_release, ast_vm_functions::module_name, and table.

Referenced by unload_module().