440#define DEFAULT_FEATURE_DIGIT_TIMEOUT 1000
441#define DEFAULT_COURTESY_TONE ""
442#define DEFAULT_RECORDING_FAIL_SOUND ""
445#define DEFAULT_TRANSFER_DIGIT_TIMEOUT 3
446#define DEFAULT_NOANSWER_TIMEOUT_ATTENDED_TRANSFER 15
447#define DEFAULT_ATXFER_DROP_CALL 0
448#define DEFAULT_ATXFER_LOOP_DELAY 10
449#define DEFAULT_ATXFER_CALLBACK_RETRIES 2
450#define DEFAULT_XFERSOUND "beep"
451#define DEFAULT_XFERFAILSOUND "beeperr"
452#define DEFAULT_ATXFER_ABORT "*1"
453#define DEFAULT_ATXFER_COMPLETE "*2"
454#define DEFAULT_ATXFER_THREEWAY "*3"
455#define DEFAULT_ATXFER_SWAP "*4"
456#define DEFAULT_TRANSFER_DIAL_ATTEMPTS 3
457#define DEFAULT_TRANSFER_RETRY_SOUND "pbx-invalid"
458#define DEFAULT_TRANSFER_INVALID_SOUND "privacy-incorrect"
459#define DEFAULT_TRANSFER_ANNOUNCE_SOUND "pbx-transfer"
462#define DEFAULT_PICKUPEXTEN "*8"
463#define DEFAULT_PICKUPSOUND ""
464#define DEFAULT_PICKUPFAILSOUND ""
467#define DEFAULT_FEATUREMAP_BLINDXFER "#"
468#define DEFAULT_FEATUREMAP_DISCONNECT "*"
469#define DEFAULT_FEATUREMAP_AUTOMON ""
470#define DEFAULT_FEATUREMAP_ATXFER ""
471#define DEFAULT_FEATUREMAP_PARKCALL ""
472#define DEFAULT_FEATUREMAP_AUTOMIXMON ""
499 return strcasecmp(item1->
name, key2);
502 return strncasecmp(item1->
name, key2, strlen(key2));
506 return strcasecmp(item1->
name, item2->
name);
594 return strncasecmp(group1->
name, key2, strlen(key2)) ? 0 :
CMP_MATCH;
658 .category =
"general",
664 .name =
"featuremap",
666 .category =
"featuremap",
672 .name =
"applicationmap",
674 .category =
"applicationmap",
680 .name =
"featuregroup",
682 .category =
"^(general|featuremap|applicationmap|parkinglot_.*)$",
690 .name =
"parkinglot",
692 .category =
"^parkinglot_.*$",
825 cfg->parkinglots =
ao2_alloc(
sizeof(*cfg->parkinglots),
NULL);
826 if (!cfg->parkinglots) {
830 if (allocate_applicationmap) {
832 if (!cfg->applicationmap) {
838 if (!cfg->featuregroups) {
917 if (!strcasecmp(
name,
"featuredigittimeout")) {
919 }
else if (!strcasecmp(
name,
"courtesytone")) {
921 }
else if (!strcasecmp(
name,
"recordingfailsound")) {
936 if (!strcasecmp(field,
"featuredigittimeout")) {
938 }
else if (!strcasecmp(field,
"courtesytone")) {
940 }
else if (!strcasecmp(field,
"recordingfailsound")) {
955 if (!strcasecmp(
name,
"transferdigittimeout")) {
957 }
else if (!strcasecmp(
name,
"atxfernoanswertimeout")) {
959 }
else if (!strcasecmp(
name,
"atxferloopdelay")) {
961 }
else if (!strcasecmp(
name,
"atxfercallbackretries")) {
963 }
else if (!strcasecmp(
name,
"atxferdropcall")) {
965 }
else if (!strcasecmp(
name,
"xfersound")) {
967 }
else if (!strcasecmp(
name,
"xferfailsound")) {
969 }
else if (!strcasecmp(
name,
"atxferabort")) {
971 }
else if (!strcasecmp(
name,
"atxfercomplete")) {
973 }
else if (!strcasecmp(
name,
"atxferthreeway")) {
975 }
else if (!strcasecmp(
name,
"atxferswap")) {
977 }
else if (!strcasecmp(
name,
"transferdialattempts")) {
979 }
else if (!strcasecmp(
name,
"transferretrysound")) {
981 }
else if (!strcasecmp(
name,
"transferinvalidsound")) {
983 }
else if (!strcasecmp(
name,
"transferannouncesound")) {
998 if (!strcasecmp(field,
"transferdigittimeout")) {
1000 }
else if (!strcasecmp(field,
"atxfernoanswertimeout")) {
1002 }
else if (!strcasecmp(field,
"atxferloopdelay")) {
1004 }
else if (!strcasecmp(field,
"atxfercallbackretries")) {
1006 }
else if (!strcasecmp(field,
"atxferdropcall")) {
1008 }
else if (!strcasecmp(field,
"xfersound")) {
1010 }
else if (!strcasecmp(field,
"xferfailsound")) {
1012 }
else if (!strcasecmp(field,
"atxferabort")) {
1014 }
else if (!strcasecmp(field,
"atxfercomplete")) {
1016 }
else if (!strcasecmp(field,
"atxferthreeway")) {
1018 }
else if (!strcasecmp(field,
"atxferswap")) {
1020 }
else if (!strcasecmp(field,
"transferdialattempts")) {
1022 }
else if (!strcasecmp(field,
"transferretrysound")) {
1024 }
else if (!strcasecmp(field,
"transferinvalidsound")) {
1039 if (!strcasecmp(
name,
"pickupsound")) {
1041 }
else if (!strcasecmp(
name,
"pickupfailsound")) {
1043 }
else if (!strcasecmp(
name,
"pickupexten")) {
1058 if (!strcasecmp(field,
"pickupsound")) {
1060 }
else if (!strcasecmp(field,
"pickupfailsound")) {
1062 }
else if (!strcasecmp(field,
"pickupexten")) {
1077 if (!strcasecmp(
name,
"blindxfer")) {
1079 }
else if (!strcasecmp(
name,
"disconnect")) {
1081 }
else if (!strcasecmp(
name,
"atxfer")) {
1083 }
else if (!strcasecmp(
name,
"automixmon")) {
1085 }
else if (!strcasecmp(
name,
"parkcall")) {
1100 if (!strcasecmp(field,
"blindxfer")) {
1102 }
else if (!strcasecmp(field,
"disconnect")) {
1104 }
else if (!strcasecmp(field,
"atxfer")) {
1106 }
else if (!strcasecmp(field,
"automixmon")) {
1108 }
else if (!strcasecmp(field,
"parkcall")) {
1209 ast_assert(cfg->global && cfg->global->general);
1211 ao2_ref(cfg->global->general, +1);
1212 return cfg->global->general;
1229 ast_assert(cfg->global && cfg->global->xfer);
1231 ao2_ref(cfg->global->xfer, +1);
1232 return cfg->global->xfer;
1279 ast_assert(cfg->global && cfg->global->pickup);
1281 ao2_ref(cfg->global->pickup, +1);
1282 return cfg->global->pickup;
1302 return cfg->featuremap;
1333 if (!applicationmap) {
1393 ao2_link(applicationmap, appmap_item);
1412 ao2_ref(cfg->applicationmap, +1);
1413 return cfg->applicationmap;
1422 if (!applicationmap) {
1451 return applicationmap;
1469 unsigned int activate_on_self;
1476 ast_log(
LOG_WARNING,
"Invalid applicationmap syntax for '%s'. Missing required argument\n",
var->name);
1484 slash = strchr(
args.activate_on,
'/');
1490 if (!
args.app_data) {
1507 close_paren = strrchr(
paren,
')');
1509 *close_paren =
'\0';
1515 ast_log(
LOG_WARNING,
"Applicationmap item '%s' does not contain an application name.\n",
var->name);
1518 }
else if (strchr(
args.app_data,
'"')) {
1523 if (!strcasecmp(
args.activate_on,
"self") || !strcasecmp(
args.activate_on,
"caller")) {
1524 activate_on_self = 1;
1525 }
else if (!strcasecmp(
args.activate_on,
"peer") || !strcasecmp(
args.activate_on,
"callee")) {
1526 activate_on_self = 0;
1533 ast_debug(1,
"Allocating applicationmap item: dtmf = %s, app = %s, app_data = %s, moh_class = %s\n",
1537 args.moh_class,
args.dtmf, activate_on_self);
1606 "parking is now handled by res_parking.conf\n");
1685 if (!strcasecmp(data,
"inherit")) {
1689 snprintf(
buf,
len,
"%s", inherit ?
"yes" :
"no");
1716 if (!strcasecmp(
data,
"inherit")) {
1825 .
name =
"FEATUREMAP",
1833 ast_log(
LOG_ERROR,
"Unable to initialize configuration info for features\n");
1942 ast_log(
LOG_ERROR,
"Failed to load features.conf and failed to initialize defaults.\n");
1958 ast_cli(
a->fd,
"===> --> %s (%s)\n",
item->appmap_item_name,
1975#define HFS_FORMAT "%-25s %-7s %-7s\n"
2004 "Usage: features show\n"
2005 " Lists configured features\n";
2032 ast_cli(
a->fd,
"\nFeature Groups:\n");
2033 ast_cli(
a->fd,
"---------------\n");
char * strsep(char **str, const char *delims)
Asterisk main include file. File version handling, generic pbx functions.
#define ast_strdup(str)
A wrapper for strdup()
#define ast_strdupa(s)
duplicate a string in memory from the stack
#define ao2_link(container, obj)
Add an object to a container.
@ AO2_ALLOC_OPT_LOCK_NOLOCK
#define ao2_global_obj_replace_unref(holder, obj)
Replace an ao2 object in the global holder, throwing away any old object.
#define ao2_callback(c, flags, cb_fn, arg)
ao2_callback() is a generic function that applies cb_fn() to all objects in a container,...
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
#define ao2_callback_data(container, flags, cb_fn, arg, data)
#define ao2_global_obj_ref(holder)
Get a reference to the object stored in the global holder.
#define ao2_find(container, arg, flags)
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
#define ao2_global_obj_release(holder)
Release the ao2 object held in the global holder.
#define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn)
Allocate and initialize a list container.
#define ao2_alloc(data_size, destructor_fn)
#define ao2_container_alloc_hash(ao2_options, container_options, n_buckets, hash_fn, sort_fn, cmp_fn)
Allocate and initialize a hash container with the desired number of buckets.
@ AO2_CONTAINER_ALLOC_OPT_DUPS_ALLOW
Allow objects with duplicate keys in container.
@ AO2_CONTAINER_ALLOC_OPT_DUPS_REPLACE
Replace objects with duplicate keys in container.
static struct console_pvt globals
General Asterisk PBX channel definitions.
const char * ast_channel_name(const struct ast_channel *chan)
int ast_channel_datastore_add(struct ast_channel *chan, struct ast_datastore *datastore)
Add a datastore to a channel.
#define DATASTORE_INHERIT_FOREVER
struct ast_datastore * ast_channel_datastore_find(struct ast_channel *chan, const struct ast_datastore_info *info, const char *uid)
Find a datastore on a channel.
Standard Command Line Interface.
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
#define AST_CLI_DEFINE(fn, txt,...)
void ast_cli(int fd, const char *fmt,...)
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Configuration option-handling.
int aco_set_defaults(struct aco_type *type, const char *category, void *obj)
Set all default options of obj.
void aco_info_destroy(struct aco_info *info)
Destroy an initialized aco_info struct.
@ ACO_PROCESS_ERROR
Their was an error and no changes were applied.
int aco_info_init(struct aco_info *info)
Initialize an aco_info structure.
#define aco_option_register_custom(info, name, matchtype, types, default_val, handler, flags)
Register a config option.
#define aco_option_register_custom_nodoc(info, name, matchtype, types, default_val, handler, flags)
Register a config option with no expected documentation.
void * aco_pending_config(struct aco_info *info)
Get pending config changes.
enum aco_process_status aco_process_config(struct aco_info *info, int reload)
Process a config info via the options registered with an aco_info.
#define ACO_TYPES(...)
A helper macro to ensure that aco_info types always have a sentinel.
Asterisk datastore objects.
#define ast_datastore_alloc(info, uid)
AO2_GLOBAL_OBJ_STATIC(globals)
static struct ao2_container * applicationmap_alloc(int replace_duplicates)
static void * featuregroup_alloc(const char *cat)
static void xfer_copy(struct ast_features_xfer_config *dest, const struct ast_features_xfer_config *src)
static struct aco_type * global_options[]
static int feature_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int check_featuregroup_item(void *obj, void *arg, void *data, int flags)
static int pickup_set(struct ast_features_pickup_config *pickup, const char *name, const char *value)
#define DEFAULT_NOANSWER_TIMEOUT_ATTENDED_TRANSFER
static struct ast_applicationmap_item * applicationmap_item_alloc(const char *name, const char *app, const char *app_data, const char *moh_class, const char *dtmf, unsigned int activate_on_self)
static char * handle_feature_show(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
CLI command to list configured features.
static int check_featuregroup(void *obj, void *arg, void *data, int flags)
#define DEFAULT_FEATUREMAP_BLINDXFER
static struct aco_type featuregroup_option
struct ast_features_general_config * ast_get_chan_features_general_config(struct ast_channel *chan)
Get the general configuration options for a channel.
static struct features_config * get_feature_ds(struct ast_channel *chan)
#define DEFAULT_TRANSFER_INVALID_SOUND
static struct ast_datastore * get_feature_chan_ds(struct ast_channel *chan)
#define DEFAULT_ATXFER_LOOP_DELAY
static void xfer_destructor(void *obj)
static struct ast_custom_function feature_function
static int group_item_sort(const void *obj, const void *arg, int flags)
static void * feature_ds_duplicate(void *data)
static int pickup_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static int features_pre_apply_config(void)
static void ast_applicationmap_item_destructor(void *obj)
static int feature_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
#define DEFAULT_ATXFER_ABORT
static void pickup_destructor(void *obj)
#define DEFAULT_TRANSFER_ANNOUNCE_SOUND
struct ast_featuremap_config * ast_get_chan_featuremap_config(struct ast_channel *chan)
Get the featuremap configuration options for a channel.
static int internal_featuremap_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
#define DEFAULT_ATXFER_SWAP
char * ast_get_chan_features_xferfailsound(struct ast_channel *chan)
Get the transfer configuration option xferfailsound.
static void global_copy(struct features_global_config *dest, const struct features_global_config *src)
static void general_destructor(void *obj)
static struct features_config * features_config_dup(const struct features_config *orig)
static void featuremap_copy(struct ast_featuremap_config *dest, const struct ast_featuremap_config *src)
#define DEFAULT_PICKUPFAILSOUND
static const struct ast_datastore_info feature_ds_info
static int internal_feature_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int general_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
struct ast_features_xfer_config * ast_get_chan_features_xfer_config(struct ast_channel *chan)
Get the transfer configuration options for a channel.
CONFIG_INFO_CORE("features", cfg_info, globals, features_config_alloc,.files=ACO_FILES(&features_conf),.pre_apply_config=features_pre_apply_config,)
#define DEFAULT_COURTESY_TONE
static int featuregroup_hash(const void *obj, int flags)
static int featuremap_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
#define DEFAULT_ATXFER_THREEWAY
static int featuremap_set(struct ast_featuremap_config *featuremap, const char *name, const char *value)
static int unsupported_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
#define DEFAULT_ATXFER_CALLBACK_RETRIES
static int featuremap_get(struct ast_featuremap_config *featuremap, const char *field, char *buf, size_t len)
static void features_config_destructor(void *obj)
static void * features_config_alloc(void)
#define DEFAULT_FEATUREMAP_DISCONNECT
static void global_config_destructor(void *obj)
static int featuregroup_cmp(void *obj, void *arg, int flags)
static int print_featuregroups(void *obj, void *arg, int flags)
static struct aco_type * parkinglot_options[]
#define DEFAULT_FEATURE_DIGIT_TIMEOUT
static int general_set(struct ast_features_general_config *general, const char *name, const char *value)
#define DEFAULT_TRANSFER_DIGIT_TIMEOUT
static void featuregroup_item_destructor(void *obj)
struct ast_features_pickup_config * ast_get_chan_features_pickup_config(struct ast_channel *chan)
Get the pickup configuration options for a channel.
static void featuremap_config_destructor(void *obj)
#define DEFAULT_TRANSFER_RETRY_SOUND
static int internal_feature_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
static void featuregroup_destructor(void *obj)
int ast_get_feature(struct ast_channel *chan, const char *feature, char *buf, size_t len)
Get the DTMF code for a call feature.
static void feature_ds_destroy(void *data)
int ast_get_builtin_feature(struct ast_channel *chan, const char *feature, char *buf, size_t len)
Get the DTMF code for a builtin feature.
static int applicationmap_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static struct aco_file features_conf
static int xfer_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
#define DEFAULT_ATXFER_DROP_CALL
#define DEFAULT_PICKUPSOUND
void unload_features_config(void)
#define DEFAULT_FEATUREMAP_ATXFER
int load_features_config(void)
static struct aco_type * applicationmap_options[]
static struct ast_cli_entry cli_features_config[]
static struct ast_custom_function featuremap_function
static int xfer_set(struct ast_features_xfer_config *xfer, const char *name, const char *value)
static struct aco_type parkinglot_option
#define DEFAULT_FEATUREMAP_PARKCALL
static int xfer_get(struct ast_features_xfer_config *xfer, const char *field, char *buf, size_t len)
#define DEFAULT_ATXFER_COMPLETE
static int featuregroup_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
static struct features_config * __features_config_alloc(int allocate_applicationmap)
static int add_item(void *obj, void *arg, int flags)
static int print_applicationmap(void *obj, void *arg, int flags)
static int print_featuregroup(void *obj, void *arg, int flags)
char * ast_get_chan_features_atxferabort(struct ast_channel *chan)
Get the transfer configuration option atxferabort.
static int parking_warning
static int pickup_get(struct ast_features_pickup_config *pickup, const char *field, char *buf, size_t len)
static void pickup_copy(struct ast_features_pickup_config *dest, const struct ast_features_pickup_config *src)
static void features_copy(struct features_config *dest, const struct features_config *src)
static struct features_global_config * global_config_alloc(void)
static struct aco_type * featuregroup_options[]
static int featuremap_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
static void * featuregroup_find(struct ao2_container *group_container, const char *category)
#define DEFAULT_TRANSFER_DIAL_ATTEMPTS
#define DEFAULT_PICKUPEXTEN
static int applicationmap_sort(const void *obj, const void *arg, int flags)
struct ao2_container * ast_get_chan_applicationmap(struct ast_channel *chan)
Get the applicationmap for a given channel.
#define DEFAULT_XFERFAILSOUND
static void general_copy(struct ast_features_general_config *dest, const struct ast_features_general_config *src)
static int general_get(struct ast_features_general_config *general, const char *field, char *buf, size_t len)
static struct aco_type featuremap_option
static struct aco_type applicationmap_option
static int featuremap_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
#define DEFAULT_FEATUREMAP_AUTOMIXMON
static struct aco_type global_option
int reload_features_config(void)
static int load_config(void)
#define DEFAULT_RECORDING_FAIL_SOUND
#define DEFAULT_XFERSOUND
static struct aco_type * featuremap_options[]
static int internal_featuremap_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
static struct ao2_container * group_container
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
Application convenience functions, designed to give consistent look and feel to Asterisk apps.
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
int ast_parse_arg(const char *arg, enum ast_parse_flags flags, void *p_result,...)
The argument parsing routine.
#define ast_debug(level,...)
Log a DEBUG message.
#define SCOPED_CHANNELLOCK(varname, chan)
scoped lock specialization for channels.
Core PBX routines and definitions.
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.
int __ast_custom_function_register(struct ast_custom_function *acf, struct ast_module *mod)
Register a custom function.
#define AST_DECLARE_STRING_FIELDS(field_list)
Declare the fields needed in a structure.
#define AST_STRING_FIELD(name)
Declare a string field.
#define ast_string_fields_copy(copy, orig)
Copy all string fields from one instance to another of the same structure.
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
static force_inline int attribute_pure ast_strlen_zero(const char *s)
char * ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes)
Strip leading/trailing whitespace and quotes from a string.
static force_inline int attribute_pure ast_str_case_hash(const char *str)
Compute a hash value on a case-insensitive string.
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
The representation of a single configuration file to be processed.
Type information about a category-level configurable object.
An applicationmap configuration item.
unsigned int activate_on_self
const ast_string_field moh_class
const ast_string_field app_data
const ast_string_field app
char dtmf[AST_FEATURE_MAX_LEN]
const ast_string_field name
Main Channel structure associated with a channel.
descriptor for a cli entry.
Data structure associated with a custom dialplan function.
Structure for a data store type.
Structure for a data store object.
Configuration for the builtin features.
const ast_string_field automixmon
const ast_string_field blindxfer
const ast_string_field parkcall
const ast_string_field disconnect
const ast_string_field atxfer
General features configuration items.
const ast_string_field recordingfailsound
unsigned int featuredigittimeout
const ast_string_field courtesytone
Configuration relating to call pickup.
const ast_string_field pickupsound
const ast_string_field pickupfailsound
const ast_string_field pickupexten
Feature configuration relating to transfers.
const ast_string_field atxferthreeway
unsigned int atxferdropcall
unsigned int transferdialattempts
unsigned int atxfercallbackretries
unsigned int transferdigittimeout
const ast_string_field atxfercomplete
const ast_string_field transferretrysound
const ast_string_field xfersound
const ast_string_field transferinvalidsound
const ast_string_field atxferabort
const ast_string_field atxferswap
unsigned int atxferloopdelay
unsigned int atxfernoanswertimeout
const ast_string_field xferfailsound
Structure for variables, used for configurations and for channel variables.
Entry in the container of featuregroups.
struct ast_applicationmap_item * appmap_item
const ast_string_field dtmf_override
const ast_string_field appmap_item_name
Featuregroup representation.
struct ao2_container * items
struct ast_featuremap_config * featuremap
struct ao2_container * applicationmap
struct ao2_container * featuregroups
struct features_global_config * global
struct dummy_config * parkinglots
Configuration from the "general" section of features.conf.
struct ast_features_pickup_config * pickup
struct ast_features_general_config * general
struct ast_features_xfer_config * xfer
char name[AST_MAX_EXTENSION]
static struct aco_type global
static struct aco_type item
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.