360#define DEFAULT_FEATURE_DIGIT_TIMEOUT 1000
361#define DEFAULT_COURTESY_TONE ""
362#define DEFAULT_RECORDING_FAIL_SOUND ""
365#define DEFAULT_TRANSFER_DIGIT_TIMEOUT 3
366#define DEFAULT_NOANSWER_TIMEOUT_ATTENDED_TRANSFER 15
367#define DEFAULT_ATXFER_DROP_CALL 0
368#define DEFAULT_ATXFER_LOOP_DELAY 10
369#define DEFAULT_ATXFER_CALLBACK_RETRIES 2
370#define DEFAULT_XFERSOUND "beep"
371#define DEFAULT_XFERFAILSOUND "beeperr"
372#define DEFAULT_ATXFER_ABORT "*1"
373#define DEFAULT_ATXFER_COMPLETE "*2"
374#define DEFAULT_ATXFER_THREEWAY "*3"
375#define DEFAULT_ATXFER_SWAP "*4"
376#define DEFAULT_TRANSFER_DIAL_ATTEMPTS 3
377#define DEFAULT_TRANSFER_RETRY_SOUND "pbx-invalid"
378#define DEFAULT_TRANSFER_INVALID_SOUND "privacy-incorrect"
379#define DEFAULT_TRANSFER_ANNOUNCE_SOUND "pbx-transfer"
382#define DEFAULT_PICKUPEXTEN "*8"
383#define DEFAULT_PICKUPSOUND ""
384#define DEFAULT_PICKUPFAILSOUND ""
387#define DEFAULT_FEATUREMAP_BLINDXFER "#"
388#define DEFAULT_FEATUREMAP_DISCONNECT "*"
389#define DEFAULT_FEATUREMAP_AUTOMON ""
390#define DEFAULT_FEATUREMAP_ATXFER ""
391#define DEFAULT_FEATUREMAP_PARKCALL ""
392#define DEFAULT_FEATUREMAP_AUTOMIXMON ""
419 return strcasecmp(item1->
name, key2);
422 return strncasecmp(item1->
name, key2, strlen(key2));
426 return strcasecmp(item1->
name, item2->
name);
514 return strncasecmp(group1->
name, key2, strlen(key2)) ? 0 :
CMP_MATCH;
578 .category =
"general",
584 .name =
"featuremap",
586 .category =
"featuremap",
592 .name =
"applicationmap",
594 .category =
"applicationmap",
600 .name =
"featuregroup",
602 .category =
"^(general|featuremap|applicationmap|parkinglot_.*)$",
610 .name =
"parkinglot",
612 .category =
"^parkinglot_.*$",
745 cfg->parkinglots =
ao2_alloc(
sizeof(*cfg->parkinglots),
NULL);
746 if (!cfg->parkinglots) {
750 if (allocate_applicationmap) {
752 if (!cfg->applicationmap) {
758 if (!cfg->featuregroups) {
837 if (!strcasecmp(
name,
"featuredigittimeout")) {
839 }
else if (!strcasecmp(
name,
"courtesytone")) {
841 }
else if (!strcasecmp(
name,
"recordingfailsound")) {
856 if (!strcasecmp(field,
"featuredigittimeout")) {
858 }
else if (!strcasecmp(field,
"courtesytone")) {
860 }
else if (!strcasecmp(field,
"recordingfailsound")) {
875 if (!strcasecmp(
name,
"transferdigittimeout")) {
877 }
else if (!strcasecmp(
name,
"atxfernoanswertimeout")) {
879 }
else if (!strcasecmp(
name,
"atxferloopdelay")) {
881 }
else if (!strcasecmp(
name,
"atxfercallbackretries")) {
883 }
else if (!strcasecmp(
name,
"atxferdropcall")) {
885 }
else if (!strcasecmp(
name,
"xfersound")) {
887 }
else if (!strcasecmp(
name,
"xferfailsound")) {
889 }
else if (!strcasecmp(
name,
"atxferabort")) {
891 }
else if (!strcasecmp(
name,
"atxfercomplete")) {
893 }
else if (!strcasecmp(
name,
"atxferthreeway")) {
895 }
else if (!strcasecmp(
name,
"atxferswap")) {
897 }
else if (!strcasecmp(
name,
"transferdialattempts")) {
899 }
else if (!strcasecmp(
name,
"transferretrysound")) {
901 }
else if (!strcasecmp(
name,
"transferinvalidsound")) {
903 }
else if (!strcasecmp(
name,
"transferannouncesound")) {
918 if (!strcasecmp(field,
"transferdigittimeout")) {
920 }
else if (!strcasecmp(field,
"atxfernoanswertimeout")) {
922 }
else if (!strcasecmp(field,
"atxferloopdelay")) {
924 }
else if (!strcasecmp(field,
"atxfercallbackretries")) {
926 }
else if (!strcasecmp(field,
"atxferdropcall")) {
928 }
else if (!strcasecmp(field,
"xfersound")) {
930 }
else if (!strcasecmp(field,
"xferfailsound")) {
932 }
else if (!strcasecmp(field,
"atxferabort")) {
934 }
else if (!strcasecmp(field,
"atxfercomplete")) {
936 }
else if (!strcasecmp(field,
"atxferthreeway")) {
938 }
else if (!strcasecmp(field,
"atxferswap")) {
940 }
else if (!strcasecmp(field,
"transferdialattempts")) {
942 }
else if (!strcasecmp(field,
"transferretrysound")) {
944 }
else if (!strcasecmp(field,
"transferinvalidsound")) {
959 if (!strcasecmp(
name,
"pickupsound")) {
961 }
else if (!strcasecmp(
name,
"pickupfailsound")) {
963 }
else if (!strcasecmp(
name,
"pickupexten")) {
978 if (!strcasecmp(field,
"pickupsound")) {
980 }
else if (!strcasecmp(field,
"pickupfailsound")) {
982 }
else if (!strcasecmp(field,
"pickupexten")) {
997 if (!strcasecmp(
name,
"blindxfer")) {
999 }
else if (!strcasecmp(
name,
"disconnect")) {
1001 }
else if (!strcasecmp(
name,
"atxfer")) {
1003 }
else if (!strcasecmp(
name,
"automixmon")) {
1005 }
else if (!strcasecmp(
name,
"parkcall")) {
1020 if (!strcasecmp(field,
"blindxfer")) {
1022 }
else if (!strcasecmp(field,
"disconnect")) {
1024 }
else if (!strcasecmp(field,
"atxfer")) {
1026 }
else if (!strcasecmp(field,
"automixmon")) {
1028 }
else if (!strcasecmp(field,
"parkcall")) {
1129 ast_assert(cfg->global && cfg->global->general);
1131 ao2_ref(cfg->global->general, +1);
1132 return cfg->global->general;
1149 ast_assert(cfg->global && cfg->global->xfer);
1151 ao2_ref(cfg->global->xfer, +1);
1152 return cfg->global->xfer;
1199 ast_assert(cfg->global && cfg->global->pickup);
1201 ao2_ref(cfg->global->pickup, +1);
1202 return cfg->global->pickup;
1222 return cfg->featuremap;
1253 if (!applicationmap) {
1313 ao2_link(applicationmap, appmap_item);
1332 ao2_ref(cfg->applicationmap, +1);
1333 return cfg->applicationmap;
1342 if (!applicationmap) {
1371 return applicationmap;
1389 unsigned int activate_on_self;
1396 ast_log(
LOG_WARNING,
"Invalid applicationmap syntax for '%s'. Missing required argument\n",
var->name);
1404 slash = strchr(
args.activate_on,
'/');
1410 if (!
args.app_data) {
1427 close_paren = strrchr(
paren,
')');
1429 *close_paren =
'\0';
1435 ast_log(
LOG_WARNING,
"Applicationmap item '%s' does not contain an application name.\n",
var->name);
1438 }
else if (strchr(
args.app_data,
'"')) {
1443 if (!strcasecmp(
args.activate_on,
"self") || !strcasecmp(
args.activate_on,
"caller")) {
1444 activate_on_self = 1;
1445 }
else if (!strcasecmp(
args.activate_on,
"peer") || !strcasecmp(
args.activate_on,
"callee")) {
1446 activate_on_self = 0;
1453 ast_debug(1,
"Allocating applicationmap item: dtmf = %s, app = %s, app_data = %s, moh_class = %s\n",
1457 args.moh_class,
args.dtmf, activate_on_self);
1526 "parking is now handled by res_parking.conf\n");
1605 if (!strcasecmp(data,
"inherit")) {
1609 snprintf(
buf,
len,
"%s", inherit ?
"yes" :
"no");
1636 if (!strcasecmp(
data,
"inherit")) {
1745 .
name =
"FEATUREMAP",
1753 ast_log(
LOG_ERROR,
"Unable to initialize configuration info for features\n");
1862 ast_log(
LOG_ERROR,
"Failed to load features.conf and failed to initialize defaults.\n");
1878 ast_cli(
a->fd,
"===> --> %s (%s)\n",
item->appmap_item_name,
1895#define HFS_FORMAT "%-25s %-7s %-7s\n"
1924 "Usage: features show\n"
1925 " Lists configured features\n";
1952 ast_cli(
a->fd,
"\nFeature Groups:\n");
1953 ast_cli(
a->fd,
"---------------\n");
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.
char * strsep(char **str, const char *delims)
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.