Asterisk - The Open Source Telephony Project GIT-master-8f1982c
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
Data Structures | Functions | Variables
res_parking.c File Reference

Call Parking Resource. More...

#include "asterisk.h"
#include "parking/res_parking.h"
#include "asterisk/config.h"
#include "asterisk/config_options.h"
#include "asterisk/utils.h"
#include "asterisk/module.h"
#include "asterisk/cli.h"
#include "asterisk/astobj2.h"
#include "asterisk/features.h"
#include "asterisk/manager.h"
#include "asterisk/pbx.h"
Include dependency graph for res_parking.c:

Go to the source code of this file.

Data Structures

struct  parking_config
 
struct  parking_global_config
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
static struct parking_lotalloc_new_parking_lot (struct parking_lot_cfg *lot_cfg)
 
static AO2_GLOBAL_OBJ_STATIC (globals)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static struct parking_lot_cfgclone_parkinglot_cfg (struct parking_lot_cfg *source, const char *name)
 
 CONFIG_INFO_STANDARD (cfg_info, globals, parking_config_alloc,.files=ACO_FILES(&parking_lot_conf),.pre_apply_config=config_parking_preapply,.post_apply_config=link_configured_disable_marked_lots,)
 
static int config_parking_preapply (void)
 
static int configure_parking_extensions (void)
 
static struct parking_lotcreate_dynamic_lot_full (const char *name, struct ast_channel *chan, int forced)
 
static void disable_marked_lots (void)
 
static int extension_is_compatible (struct parking_lot_cfg *lot_cfg, const char *app_type, struct ast_exten *extension)
 
const char * find_channel_parking_lot_name (struct ast_channel *chan)
 Find parking lot name from channel. More...
 
static void generate_or_link_lots_to_configs (void)
 
struct ao2_containerget_parking_lot_container (void)
 Get a pointer to the parking lot container for purposes such as iteration. More...
 
static void link_configured_disable_marked_lots (void)
 
static int load_module (void)
 
static void mark_lots_as_disabled (void)
 
static void * named_item_find (struct ao2_container *container, const char *name)
 find an item in a container by its name More...
 
static int option_handler_findslot (const struct aco_option *opt, struct ast_variable *var, void *obj)
 Custom field handler for the findslot option. More...
 
static int option_handler_parkedfeature (const struct aco_option *opt, struct ast_variable *var, void *obj)
 Custom field handler for feature mapping on parked call pickup options. More...
 
static int option_handler_parkpos (const struct aco_option *opt, struct ast_variable *var, void *obj)
 Custom field handler for parking positions. More...
 
static int parked_user_cmp_fn (void *obj, void *arg, int flags)
 
static int parked_user_sort_fn (const void *obj_left, const void *obj_right, int flags)
 
static int parking_add_extension (struct ast_context *context, int replace, const char *extension, int priority, const char *application, const char *data, const char *registrar)
 
static void * parking_config_alloc (void)
 allocator callback for parking_config. Notice it returns void * since it is only used by the backend config code More...
 
static void parking_config_destructor (void *obj)
 destructor for parking_config More...
 
struct parking_lotparking_create_dynamic_lot (const char *name, struct ast_channel *chan)
 Create a dynamic parking lot. More...
 
int parking_dynamic_lots_enabled (void)
 Check global configuration to see if dynamic parking is enabled. More...
 
static int parking_feature_flag_cfg (int *param, const char *var)
 Maps string values for option_handler_parkedfeature to their ENUM values. More...
 
static void parking_global_config_destructor (void *obj)
 destructor for parking_global_config More...
 
struct parking_lotparking_lot_build_or_update (struct parking_lot_cfg *lot_cfg, int dynamic)
 If a parking lot exists in the parking lot list already, update its status to match the provided configuration and return a reference return a reference to it. Otherwise, create a parking lot struct based on a parking lot configuration and return a reference to the new one. More...
 
static void * parking_lot_cfg_alloc (const char *cat)
 create a parking lot structure More...
 
static int parking_lot_cfg_cmp_fn (void *obj, void *arg, const int flags)
 
int parking_lot_cfg_create_extensions (struct parking_lot_cfg *lot_cfg)
 Add extensions for a parking lot configuration. More...
 
static void parking_lot_cfg_destructor (void *obj)
 Destroy a parking lot cfg object. More...
 
static int parking_lot_cfg_hash_fn (const void *obj, const int flags)
 
void parking_lot_cfg_remove_extensions (struct parking_lot_cfg *lot_cfg)
 Remove extensions belonging to a parking lot configuration. More...
 
static void parking_lot_destructor (void *obj)
 
static void parking_lot_disable (struct parking_lot *lot)
 
struct parking_lotparking_lot_find_by_name (const char *lot_name)
 Find a parking lot based on its name. More...
 
int parking_lot_remove_if_unused (struct parking_lot *lot)
 Remove a parking lot from the usable lists if it is no longer involved in any calls and no configuration currently claims it. More...
 
static int parking_lot_sort_fn (const void *obj_left, const void *obj_right, int flags)
 
static int reload_module (void)
 
static void remove_all_configured_parking_lot_extensions (void)
 
static void remove_pending_parking_lot_extensions (struct parking_config *cfg_pending)
 
static int unload_module (void)
 
static int verify_default_parking_lot (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Call Parking Resource" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_DEVSTATE_PROVIDER, }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct aco_type global_option
 
struct aco_typeglobal_options [] = ACO_TYPES(&global_option)
 
struct aco_file parking_lot_conf
 
static struct ao2_containerparking_lot_container
 
static struct aco_type parking_lot_type
 
struct aco_typeparking_lot_types [] = ACO_TYPES(&parking_lot_type)
 

Detailed Description

Call Parking Resource.

Author
Jonathan Rose jrose.nosp@m.@dig.nosp@m.ium.c.nosp@m.om

Definition in file res_parking.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 1356 of file res_parking.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 1356 of file res_parking.c.

◆ alloc_new_parking_lot()

static struct parking_lot * alloc_new_parking_lot ( struct parking_lot_cfg lot_cfg)
static

Definition at line 698 of file res_parking.c.

699{
700 struct parking_lot *lot;
701 if (!(lot = ao2_alloc(sizeof(*lot), parking_lot_destructor))) {
702 return NULL;
703 }
704
705 if (ast_string_field_init(lot, 32)) {
706 return NULL;
707 }
708
709 /* Create parked user ordered list */
714
715 if (!lot->parked_users) {
716 ao2_cleanup(lot);
717 return NULL;
718 }
719
720 ast_string_field_set(lot, name, lot_cfg->name);
721 return lot;
722}
@ AO2_ALLOC_OPT_LOCK_RWLOCK
Definition: astobj2.h:365
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn)
Allocate and initialize a list container.
Definition: astobj2.h:1327
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:409
@ AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT
Reject objects with duplicate keys in container.
Definition: astobj2.h:1188
static const char name[]
Definition: format_mp3.c:68
static int parked_user_cmp_fn(void *obj, void *arg, int flags)
Definition: res_parking.c:495
static int parked_user_sort_fn(const void *obj_left, const void *obj_right, int flags)
Definition: res_parking.c:507
static void parking_lot_destructor(void *obj)
Definition: res_parking.c:686
#define NULL
Definition: resample.c:96
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:521
#define ast_string_field_init(x, size)
Initialize a field pool and fields.
Definition: stringfields.h:359
const ast_string_field name
Definition: res_parking.h:89
struct ao2_container * parked_users
Definition: res_parking.h:95

References ao2_alloc, AO2_ALLOC_OPT_LOCK_RWLOCK, ao2_cleanup, ao2_container_alloc_list, AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT, ast_string_field_init, ast_string_field_set, name, parking_lot_cfg::name, NULL, parked_user_cmp_fn(), parked_user_sort_fn(), parking_lot::parked_users, and parking_lot_destructor().

Referenced by parking_lot_build_or_update().

◆ AO2_GLOBAL_OBJ_STATIC()

static AO2_GLOBAL_OBJ_STATIC ( globals  )
static

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 1356 of file res_parking.c.

◆ clone_parkinglot_cfg()

static struct parking_lot_cfg * clone_parkinglot_cfg ( struct parking_lot_cfg source,
const char *  name 
)
static

Definition at line 1000 of file res_parking.c.

1001{
1003
1004 if (!cfg) {
1005 return NULL;
1006 }
1007
1008 ast_string_fields_copy(cfg, source);
1009
1010 /* Needs to be reset after being copied */
1012
1013 /* Stuff that should be cloned that isn't hit by string field copy */
1014 cfg->parking_start = source->parking_start;
1015 cfg->parking_stop = source->parking_stop;
1016 cfg->parkingtime = source->parkingtime;
1017 cfg->comebackdialtime = source->comebackdialtime;
1018 cfg->parkfindnext = source->parkfindnext;
1019 cfg->parkext_exclusive = source->parkext_exclusive;
1020 cfg->parkaddhints = source->parkaddhints;
1021 cfg->comebacktoorigin = source->comebacktoorigin;
1022 cfg->parkedplay = source->parkedplay;
1025 cfg->parkedcallhangup = source->parkedcallhangup;
1027
1028 return cfg;
1029}
static void * parking_lot_cfg_alloc(const char *cat)
create a parking lot structure
Definition: res_parking.c:521
#define ast_string_fields_copy(copy, orig)
Copy all string fields from one instance to another of the same structure.
Definition: stringfields.h:630
int parkedcalltransfers
Definition: res_parking.h:76
int parkedcallreparking
Definition: res_parking.h:77
unsigned int comebacktoorigin
Definition: res_parking.h:74
unsigned int parkingtime
Definition: res_parking.h:69
unsigned int parkfindnext
Definition: res_parking.h:71
unsigned int parkext_exclusive
Definition: res_parking.h:72
unsigned int parkaddhints
Definition: res_parking.h:73
unsigned int comebackdialtime
Definition: res_parking.h:70
int parkedcallrecording
Definition: res_parking.h:79

References ast_string_field_set, ast_string_fields_copy, parking_lot_cfg::comebackdialtime, parking_lot_cfg::comebacktoorigin, name, NULL, parking_lot_cfg::parkaddhints, parking_lot_cfg::parkedcallhangup, parking_lot_cfg::parkedcallrecording, parking_lot_cfg::parkedcallreparking, parking_lot_cfg::parkedcalltransfers, parking_lot_cfg::parkedplay, parking_lot_cfg::parkext_exclusive, parking_lot_cfg::parkfindnext, parking_lot_cfg_alloc(), parking_lot_cfg::parking_start, parking_lot_cfg::parking_stop, and parking_lot_cfg::parkingtime.

Referenced by create_dynamic_lot_full().

◆ CONFIG_INFO_STANDARD()

CONFIG_INFO_STANDARD ( cfg_info  ,
globals  ,
parking_config_alloc  ,
files = ACO_FILES(&parking_lot_conf),
pre_apply_config = config_parking_preapply,
post_apply_config = link_configured_disable_marked_lots 
)

◆ config_parking_preapply()

static int config_parking_preapply ( void  )
static

Definition at line 1216 of file res_parking.c.

1217{
1219
1221 return -1;
1222 }
1223
1225 return -1;
1226 }
1227
1228 return 0;
1229}
static int verify_default_parking_lot(void)
Definition: res_parking.c:1132
static void mark_lots_as_disabled(void)
Definition: res_parking.c:1204
static int configure_parking_extensions(void)
Definition: res_parking.c:1171

References configure_parking_extensions(), mark_lots_as_disabled(), and verify_default_parking_lot().

◆ configure_parking_extensions()

static int configure_parking_extensions ( void  )
static

Definition at line 1171 of file res_parking.c.

1172{
1173 struct parking_config *cfg = aco_pending_config(&cfg_info);
1174 struct ao2_iterator iter;
1175 RAII_VAR(struct parking_lot_cfg *, lot_cfg, NULL, ao2_cleanup);
1176 int res = 0;
1177
1178 if (!cfg) {
1179 return 0;
1180 }
1181
1182 /* Clear existing extensions */
1184
1185 /* Attempt to build new extensions for each lot */
1186 for (iter = ao2_iterator_init(cfg->parking_lots, 0); (lot_cfg = ao2_iterator_next(&iter)); ao2_ref(lot_cfg, -1)) {
1187 if (parking_lot_cfg_create_extensions(lot_cfg)) {
1188 ao2_cleanup(lot_cfg);
1189 lot_cfg = NULL;
1190 res = -1;
1191 break;
1192 }
1193 }
1194 ao2_iterator_destroy(&iter);
1195
1196 if (res) {
1198 ast_log(LOG_ERROR, "Extension registration failed. Previously configured lot extensions were removed and can not be safely restored.\n");
1199 }
1200
1201 return res;
1202}
#define ast_log
Definition: astobj2.c:42
#define ao2_iterator_next(iter)
Definition: astobj2.h:1911
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
void * aco_pending_config(struct aco_info *info)
Get pending config changes.
#define LOG_ERROR
static void remove_all_configured_parking_lot_extensions(void)
Definition: res_parking.c:739
static void remove_pending_parking_lot_extensions(struct parking_config *cfg_pending)
Definition: res_parking.c:1156
int parking_lot_cfg_create_extensions(struct parking_lot_cfg *lot_cfg)
Add extensions for a parking lot configuration.
Definition: res_parking.c:819
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1821
struct ao2_container * parking_lots
Definition: res_parking.c:342
#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:941

References aco_pending_config(), ao2_cleanup, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_log, LOG_ERROR, NULL, parking_lot_cfg_create_extensions(), parking_config::parking_lots, RAII_VAR, remove_all_configured_parking_lot_extensions(), and remove_pending_parking_lot_extensions().

Referenced by config_parking_preapply().

◆ create_dynamic_lot_full()

static struct parking_lot * create_dynamic_lot_full ( const char *  name,
struct ast_channel chan,
int  forced 
)
static

Definition at line 1031 of file res_parking.c.

1032{
1033 RAII_VAR(struct parking_lot_cfg *, cfg, NULL, ao2_cleanup);
1034 RAII_VAR(struct parking_lot *, template_lot, NULL, ao2_cleanup);
1035
1036 struct parking_lot *lot;
1037 const char *dyn_context;
1038 const char *dyn_exten;
1039 const char *dyn_range;
1040 const char *template_name;
1041 const char *chan_template_name;
1042 int dyn_start;
1043 int dyn_end;
1044
1045 if (!forced && !parking_dynamic_lots_enabled()) {
1046 return NULL;
1047 }
1048
1049 ast_channel_lock(chan);
1050 chan_template_name = ast_strdupa(S_OR(pbx_builtin_getvar_helper(chan, "PARKINGDYNAMIC"), ""));
1051 dyn_context = ast_strdupa(S_OR(pbx_builtin_getvar_helper(chan, "PARKINGDYNCONTEXT"), ""));
1052 dyn_exten = ast_strdupa(S_OR(pbx_builtin_getvar_helper(chan, "PARKINGDYNEXTEN"), ""));
1053 dyn_range = ast_strdupa(S_OR(pbx_builtin_getvar_helper(chan, "PARKINGDYNPOS"), ""));
1054 ast_channel_unlock(chan);
1055
1056 template_name = S_OR(chan_template_name, DEFAULT_PARKING_LOT);
1057
1058 template_lot = parking_lot_find_by_name(template_name);
1059 if (!template_lot) {
1060 ast_log(LOG_ERROR, "Lot %s does not exist. Can not use it as a dynamic parking lot template.\n",
1061 template_name);
1062 return NULL;
1063 }
1064
1065 cfg = clone_parkinglot_cfg(template_lot->cfg, name);
1066
1067 if (!cfg) {
1068 ast_log(LOG_ERROR, "Failed to allocate dynamic parking lot configuration.\n");
1069 return NULL;
1070 }
1071
1072 if (!ast_strlen_zero(dyn_exten)) {
1073 ast_string_field_set(cfg, parkext, dyn_exten);
1074 }
1075
1076 if (!ast_strlen_zero(dyn_context)) {
1077 ast_string_field_set(cfg, parking_con, dyn_context);
1078 }
1079
1080 if (!ast_strlen_zero(dyn_range)) {
1081 if (sscanf(dyn_range, "%30d-%30d", &dyn_start, &dyn_end) != 2) {
1083 "Invalid parking range %s specified in PARKINGDYNPOS: could not parse minimum/maximum parking space range\n", dyn_range);
1084 return NULL;
1085 }
1086 if (dyn_end < dyn_start || dyn_start < 0) {
1088 "Invalid parking range %s specified for PARKINGDYNPOS: end parking space must be greater than starting parking space.\n", dyn_range);
1089 return NULL;
1090 }
1091
1092 cfg->parking_start = dyn_start;
1093 cfg->parking_stop = dyn_end;
1094 }
1095
1097 ast_log(LOG_ERROR, "Extensions for dynamic parking lot '%s' could not be registered. Dynamic lot creation failed.\n", name);
1098 return NULL;
1099 }
1100
1102
1103 if ((lot = parking_lot_find_by_name(name))) {
1105 ast_log(LOG_ERROR, "Started creating dynamic parking lot '%s', but a parking lot with that name already exists.\n", name);
1106 ao2_ref(lot, -1);
1107 return NULL;
1108 }
1109
1112
1113 if (!lot) {
1114 ast_log(LOG_NOTICE, "Failed to build dynamic parking lot '%s'\n", name);
1115 }
1116
1117 return lot;
1118}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define ao2_unlock(a)
Definition: astobj2.h:729
#define ao2_lock(a)
Definition: astobj2.h:717
#define ast_channel_lock(chan)
Definition: channel.h:2972
#define ast_channel_unlock(chan)
Definition: channel.h:2973
#define LOG_NOTICE
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
static struct parking_lot_cfg * clone_parkinglot_cfg(struct parking_lot_cfg *source, const char *name)
Definition: res_parking.c:1000
static struct ao2_container * parking_lot_container
Definition: res_parking.c:326
struct parking_lot * parking_lot_build_or_update(struct parking_lot_cfg *lot_cfg, int dynamic)
If a parking lot exists in the parking lot list already, update its status to match the provided conf...
Definition: res_parking.c:929
struct parking_lot * parking_lot_find_by_name(const char *lot_name)
Find a parking lot based on its name.
Definition: res_parking.c:662
int parking_dynamic_lots_enabled(void)
Check global configuration to see if dynamic parking is enabled.
Definition: res_parking.c:989
#define DEFAULT_PARKING_LOT
Definition: res_parking.h:34
#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
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
struct parking_lot_cfg * cfg
Definition: res_parking.h:96

References ao2_cleanup, ao2_lock, ao2_ref, ao2_unlock, ast_channel_lock, ast_channel_unlock, ast_log, ast_strdupa, ast_string_field_set, ast_strlen_zero(), parking_lot::cfg, clone_parkinglot_cfg(), DEFAULT_PARKING_LOT, LOG_ERROR, LOG_NOTICE, name, NULL, parking_dynamic_lots_enabled(), parking_lot_build_or_update(), parking_lot_cfg_create_extensions(), parking_lot_container, parking_lot_find_by_name(), parking_lot_cfg::parking_start, parking_lot_cfg::parking_stop, pbx_builtin_getvar_helper(), RAII_VAR, and S_OR.

Referenced by parking_create_dynamic_lot().

◆ disable_marked_lots()

static void disable_marked_lots ( void  )
static

Definition at line 1231 of file res_parking.c.

1232{
1233 struct ao2_iterator iter;
1234 struct parking_lot *lot;
1235
1236 for (iter = ao2_iterator_init(parking_lot_container, 0); (lot = ao2_iterator_next(&iter)); ao2_ref(lot, -1)) {
1237 if (lot->disable_mark) {
1239 }
1240 }
1241
1242 ao2_iterator_destroy(&iter);
1243}
static void parking_lot_disable(struct parking_lot *lot)
Definition: res_parking.c:474
int disable_mark
Definition: res_parking.h:98

References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, parking_lot::disable_mark, parking_lot_container, and parking_lot_disable().

Referenced by link_configured_disable_marked_lots().

◆ extension_is_compatible()

static int extension_is_compatible ( struct parking_lot_cfg lot_cfg,
const char *  app_type,
struct ast_exten extension 
)
static

Definition at line 791 of file res_parking.c.

792{
793 const char *extension_registrar = ast_get_extension_registrar(extension);
794 const char *extension_context = ast_get_context_name(ast_get_extension_context(extension));
795 const char *extension_name = ast_get_extension_name(extension);
796 const char *extension_application = ast_get_extension_app(extension);
797
798 ast_assert(extension_registrar && extension_context && extension_name && extension_application);
799
800 if (strcmp(extension_registrar, BASE_REGISTRAR)) {
801 ast_log(LOG_ERROR, "Parking lot '%s' -- Needs an extension '%s@%s', but that extension is already owned by %s.\n",
802 lot_cfg->name, extension_name, extension_context, extension_registrar);
803 return 0;
804 }
805
806 if (strcmp(extension_application, app_type)) {
807 ast_log(LOG_ERROR, "Parking lot '%s' -- Needs an extension '%s@%s' with a non-exclusive %s application, "
808 "but a/an %s application is already registered to that extension by %s.\n",
809 lot_cfg->name, extension_name, extension_context, app_type,
810 extension_application, BASE_REGISTRAR);
811 return 0;
812 }
813
814 ast_debug(3, "Parking lot '%s' -- extension '%s@%s' with application %s is compatible.\n",
815 lot_cfg->name, extension_name, extension_context, app_type);
816 return 1;
817}
#define ast_debug(level,...)
Log a DEBUG message.
const char * ast_get_extension_app(struct ast_exten *e)
Definition: pbx.c:8572
const char * ast_get_context_name(struct ast_context *con)
Definition: ael_main.c:421
struct ast_context * ast_get_extension_context(struct ast_exten *exten)
Definition: pbx.c:8519
const char * ast_get_extension_name(struct ast_exten *exten)
Definition: pbx.c:8524
const char * ast_get_extension_registrar(struct ast_exten *e)
Definition: pbx.c:8547
#define BASE_REGISTRAR
Definition: res_parking.h:36
structure to hold extensions
#define ast_assert(a)
Definition: utils.h:739

References ast_assert, ast_debug, ast_get_context_name(), ast_get_extension_app(), ast_get_extension_context(), ast_get_extension_name(), ast_get_extension_registrar(), ast_log, BASE_REGISTRAR, LOG_ERROR, and parking_lot_cfg::name.

Referenced by parking_lot_cfg_create_extensions().

◆ find_channel_parking_lot_name()

const char * find_channel_parking_lot_name ( struct ast_channel chan)

Find parking lot name from channel.

Since
12.0.0
Parameters
chanThe channel we want the parking lot name for
Returns
name of the parking lot to use for the channel.
Note
Always returns a parking lot name.
Channel needs to be locked while the returned string is in use.

Definition at line 668 of file res_parking.c.

669{
670 const char *name;
671
672 /* The channel variable overrides everything */
673 name = pbx_builtin_getvar_helper(chan, "PARKINGLOT");
674 if (ast_strlen_zero(name)) {
675 /* Try the channel's parking lot. */
677 if (ast_strlen_zero(name)) {
678 /* Fall back to the default parking lot. */
680 }
681 }
682
683 return name;
684}
const char * ast_channel_parkinglot(const struct ast_channel *chan)

References ast_channel_parkinglot(), ast_strlen_zero(), DEFAULT_PARKING_LOT, name, and pbx_builtin_getvar_helper().

Referenced by park_common_setup2(), parked_call_app_exec(), and parking_park_call().

◆ generate_or_link_lots_to_configs()

static void generate_or_link_lots_to_configs ( void  )
static

Definition at line 976 of file res_parking.c.

977{
979 struct parking_lot_cfg *lot_cfg;
980 struct ao2_iterator iter;
981
982 iter = ao2_iterator_init(cfg->parking_lots, 0);
983 for (; (lot_cfg = ao2_iterator_next(&iter)); ao2_ref(lot_cfg, -1)) {
985 }
987}
#define ao2_global_obj_ref(holder)
Get a reference to the object stored in the global holder.
Definition: astobj2.h:918
static struct console_pvt globals

References ao2_cleanup, ao2_global_obj_ref, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, globals, parking_lot_build_or_update(), and RAII_VAR.

Referenced by link_configured_disable_marked_lots().

◆ get_parking_lot_container()

struct ao2_container * get_parking_lot_container ( void  )

Get a pointer to the parking lot container for purposes such as iteration.

Since
12.0.0
Returns
pointer to the parking lot container.

Definition at line 657 of file res_parking.c.

658{
660}

References parking_lot_container.

Referenced by cli_display_parking_lot_list(), complete_parking_lot(), manager_parking_lot_list(), manager_parking_status_all_lots(), and metermaidstate().

◆ link_configured_disable_marked_lots()

static void link_configured_disable_marked_lots ( void  )
static

Definition at line 1245 of file res_parking.c.

1246{
1249}
static void disable_marked_lots(void)
Definition: res_parking.c:1231
static void generate_or_link_lots_to_configs(void)
Definition: res_parking.c:976

References disable_marked_lots(), and generate_or_link_lots_to_configs().

◆ load_module()

static int load_module ( void  )
static

Definition at line 1268 of file res_parking.c.

1269{
1273 NULL);
1274 if (!parking_lot_container) {
1275 goto error;
1276 }
1277
1278 if (aco_info_init(&cfg_info)) {
1279 goto error;
1280 }
1281
1282 /* Global options */
1283 aco_option_register(&cfg_info, "parkeddynamic", ACO_EXACT, global_options, "no", OPT_BOOL_T, 1, FLDSET(struct parking_global_config, parkeddynamic));
1284
1285 /* Register the per parking lot options. */
1286 aco_option_register(&cfg_info, "parkext", ACO_EXACT, parking_lot_types, "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct parking_lot_cfg, parkext));
1287 aco_option_register(&cfg_info, "context", ACO_EXACT, parking_lot_types, "parkedcalls", OPT_STRINGFIELD_T, 0, STRFLDSET(struct parking_lot_cfg, parking_con));
1288 aco_option_register(&cfg_info, "parkingtime", ACO_EXACT, parking_lot_types, "45", OPT_UINT_T, 0, FLDSET(struct parking_lot_cfg, parkingtime));
1289 aco_option_register(&cfg_info, "comebacktoorigin", ACO_EXACT, parking_lot_types, "yes", OPT_BOOL_T, 1, FLDSET(struct parking_lot_cfg, comebacktoorigin));
1290 aco_option_register(&cfg_info, "comebackcontext", ACO_EXACT, parking_lot_types, "parkedcallstimeout", OPT_STRINGFIELD_T, 0, STRFLDSET(struct parking_lot_cfg, comebackcontext));
1291 aco_option_register(&cfg_info, "comebackdialtime", ACO_EXACT, parking_lot_types, "30", OPT_UINT_T, 0, FLDSET(struct parking_lot_cfg, comebackdialtime));
1292 aco_option_register(&cfg_info, "parkedmusicclass", ACO_EXACT, parking_lot_types, "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct parking_lot_cfg, mohclass));
1293 aco_option_register(&cfg_info, "parkext_exclusive", ACO_EXACT, parking_lot_types, "no", OPT_BOOL_T, 1, FLDSET(struct parking_lot_cfg, parkext_exclusive));
1294 aco_option_register(&cfg_info, "parkinghints", ACO_EXACT, parking_lot_types, "no", OPT_BOOL_T, 1, FLDSET(struct parking_lot_cfg, parkaddhints));
1295 aco_option_register(&cfg_info, "courtesytone", ACO_EXACT, parking_lot_types, "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct parking_lot_cfg, courtesytone));
1296
1297 /* More complicated parking lot options that require special handling */
1305
1306 if (aco_process_config(&cfg_info, 0) == ACO_PROCESS_ERROR) {
1307 goto error;
1308 }
1309
1311 goto error;
1312 }
1313
1314 if (load_parking_ui()) {
1315 goto error;
1316 }
1317
1318 if (load_parking_manager()) {
1319 goto error;
1320 }
1321
1323 goto error;
1324 }
1325
1326 if (load_parking_devstate()) {
1327 goto error;
1328 }
1329
1330 if (load_parking_tests()) {
1331 goto error;
1332 }
1333
1335
1336error:
1337 unload_module();
1339}
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition: astobj2.h:363
@ ACO_EXACT
@ ACO_PROCESS_ERROR
Their was an error and no changes were applied.
#define STRFLDSET(type,...)
Convert a struct and a list of stringfield fields to an argument list of field offsets.
int aco_info_init(struct aco_info *info)
Initialize an aco_info structure.
#define FLDSET(type,...)
Convert a struct and list of fields to an argument list of field offsets.
#define aco_option_register(info, name, matchtype, types, default_val, opt_type, flags,...)
Register a config option.
@ OPT_UINT_T
Type for default option handler for unsigned integers.
@ OPT_BOOL_T
Type for default option handler for bools (ast_true/ast_false)
@ OPT_STRINGFIELD_T
Type for default option handler for stringfields.
#define aco_option_register_custom(info, name, matchtype, types, default_val, handler, flags)
Register a config option.
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.
@ AST_MODULE_LOAD_SUCCESS
Definition: module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78
int load_parking_applications(void)
Register parking applications.
int load_parking_bridge_features(void)
Register bridge features for parking.
int load_parking_devstate(void)
Register Parking devstate handler.
int load_parking_manager(void)
Register manager actions and setup subscriptions for stasis events.
int load_parking_tests(void)
Register parking unit tests.
int load_parking_ui(void)
Register CLI commands.
Definition: parking_ui.c:198
static int option_handler_parkedfeature(const struct aco_option *opt, struct ast_variable *var, void *obj)
Custom field handler for feature mapping on parked call pickup options.
Definition: res_parking.c:625
struct aco_type * global_options[]
Definition: res_parking.c:353
struct aco_type * parking_lot_types[]
Definition: res_parking.c:365
static int option_handler_findslot(const struct aco_option *opt, struct ast_variable *var, void *obj)
Custom field handler for the findslot option.
Definition: res_parking.c:586
static int option_handler_parkpos(const struct aco_option *opt, struct ast_variable *var, void *obj)
Custom field handler for parking positions.
Definition: res_parking.c:565
static int parking_lot_sort_fn(const void *obj_left, const void *obj_right, int flags)
Definition: res_parking.c:304
static int unload_module(void)
Definition: res_parking.c:1251
@ OPT_PARKEDREPARKING
Definition: res_parking.h:51
@ OPT_PARKEDTRANSFERS
Definition: res_parking.h:50
@ OPT_PARKEDPLAY
Definition: res_parking.h:49
@ OPT_PARKEDRECORDING
Definition: res_parking.h:53
@ OPT_PARKEDHANGUP
Definition: res_parking.h:52
int error(const char *format,...)
Definition: utils/frame.c:999

References ACO_EXACT, aco_info_init(), aco_option_register, aco_option_register_custom, aco_process_config(), ACO_PROCESS_ERROR, AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_list, AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT, AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, error(), FLDSET, global_options, load_parking_applications(), load_parking_bridge_features(), load_parking_devstate(), load_parking_manager(), load_parking_tests(), load_parking_ui(), NULL, OPT_BOOL_T, OPT_PARKEDHANGUP, OPT_PARKEDPLAY, OPT_PARKEDRECORDING, OPT_PARKEDREPARKING, OPT_PARKEDTRANSFERS, OPT_STRINGFIELD_T, OPT_UINT_T, option_handler_findslot(), option_handler_parkedfeature(), option_handler_parkpos(), parking_lot_container, parking_lot_sort_fn(), parking_lot_types, STRFLDSET, and unload_module().

◆ mark_lots_as_disabled()

static void mark_lots_as_disabled ( void  )
static

Definition at line 1204 of file res_parking.c.

1205{
1206 struct ao2_iterator iter;
1207 struct parking_lot *lot;
1208
1209 for (iter = ao2_iterator_init(parking_lot_container, 0); (lot = ao2_iterator_next(&iter)); ao2_ref(lot, -1)) {
1210 lot->disable_mark = 1;
1211 }
1212
1213 ao2_iterator_destroy(&iter);
1214}

References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, parking_lot::disable_mark, and parking_lot_container.

Referenced by config_parking_preapply().

◆ named_item_find()

static void * named_item_find ( struct ao2_container container,
const char *  name 
)
static

find an item in a container by its name

XXX This is actually incredibly generic and might be better placed in something like astobj2 if there isn't already an equivalent

Parameters
containerao2container where we want the item from
namename of the item wanted to be found
Returns
pointer to the parking lot if available.
Return values
NULLif not found.

Definition at line 557 of file res_parking.c.

558{
559 return ao2_find(container, name, OBJ_KEY);
560}
#define OBJ_KEY
Definition: astobj2.h:1151
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1736
struct ao2_container * container
Definition: res_fax.c:531

References ao2_find, container, name, and OBJ_KEY.

Referenced by parking_lot_build_or_update(), and parking_lot_find_by_name().

◆ option_handler_findslot()

static int option_handler_findslot ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Custom field handler for the findslot option.

Definition at line 586 of file res_parking.c.

587{
588 struct parking_lot_cfg *lot_cfg = obj;
589
590 if (!strcmp(var->value, "first")) {
591 lot_cfg->parkfindnext = 0;
592 } else if (!strcmp(var->value, "next")) {
593 lot_cfg->parkfindnext = 1;
594 } else {
595 ast_log(LOG_WARNING, "value '%s' is not valid for findslot option.\n", var->value);
596 return -1;
597 }
598
599 return 0;
600}
#define var
Definition: ast_expr2f.c:605
#define LOG_WARNING

References ast_log, LOG_WARNING, parking_lot_cfg::parkfindnext, and var.

Referenced by load_module().

◆ option_handler_parkedfeature()

static int option_handler_parkedfeature ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Custom field handler for feature mapping on parked call pickup options.

Definition at line 625 of file res_parking.c.

626{
627 struct parking_lot_cfg *cfg = obj;
629 int *parameter = NULL;
630
631 switch (option) {
632 case OPT_PARKEDPLAY:
633 parameter = &cfg->parkedplay;
634 break;
636 parameter = &cfg->parkedcalltransfers;
637 break;
639 parameter = &cfg->parkedcallreparking;
640 break;
641 case OPT_PARKEDHANGUP:
642 parameter = &cfg->parkedcallhangup;
643 break;
645 parameter = &cfg->parkedcallrecording;
646 break;
647 }
648
649 ast_assert(parameter != NULL);
650 if (!parameter || parking_feature_flag_cfg(parameter, var->value)) {
651 return -1;
652 }
653
654 return 0;
655}
unsigned int aco_option_get_flags(const struct aco_option *option)
Read the flags of a config option - useful when using a custom callback for a config option.
static int parking_feature_flag_cfg(int *param, const char *var)
Maps string values for option_handler_parkedfeature to their ENUM values.
Definition: res_parking.c:605
parked_call_feature_options
Definition: res_parking.h:48

References aco_option_get_flags(), ast_assert, NULL, OPT_PARKEDHANGUP, OPT_PARKEDPLAY, OPT_PARKEDRECORDING, OPT_PARKEDREPARKING, OPT_PARKEDTRANSFERS, parking_lot_cfg::parkedcallhangup, parking_lot_cfg::parkedcallrecording, parking_lot_cfg::parkedcallreparking, parking_lot_cfg::parkedcalltransfers, parking_lot_cfg::parkedplay, parking_feature_flag_cfg(), and var.

Referenced by load_module().

◆ option_handler_parkpos()

static int option_handler_parkpos ( const struct aco_option opt,
struct ast_variable var,
void *  obj 
)
static

Custom field handler for parking positions.

Definition at line 565 of file res_parking.c.

566{
567 struct parking_lot_cfg *lot_cfg = obj;
568 int low;
569 int high;
570
571 if (sscanf(var->value, "%30d-%30d", &low, &high) != 2) {
572 ast_log(LOG_WARNING, "Format for parking positions is a-b, where a and b are numbers\n");
573 } else if (high < low || low <= 0 || high <= 0) {
574 ast_log(LOG_WARNING, "Format for parking positions is a-b, where a <= b\n");
575 } else {
576 lot_cfg->parking_start = low;
577 lot_cfg->parking_stop = high;
578 return 0;
579 }
580 return -1;
581}

References ast_log, LOG_WARNING, parking_lot_cfg::parking_start, parking_lot_cfg::parking_stop, and var.

Referenced by load_module().

◆ parked_user_cmp_fn()

static int parked_user_cmp_fn ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 495 of file res_parking.c.

496{
497 int *search_space = arg;
498 struct parked_user *user = obj;
499 int object_space = user->parking_space;
500
501 if (*search_space == object_space) {
502 return CMP_MATCH;
503 }
504 return 0;
505}
@ CMP_MATCH
Definition: astobj2.h:1027
structure to hold users read from users.conf

References CMP_MATCH.

Referenced by alloc_new_parking_lot().

◆ parked_user_sort_fn()

static int parked_user_sort_fn ( const void *  obj_left,
const void *  obj_right,
int  flags 
)
static

Definition at line 507 of file res_parking.c.

508{
509 const struct parked_user *left = obj_left;
510 const struct parked_user *right = obj_right;
511
512 return left->parking_space - right->parking_space;
513}
int parking_space
Definition: res_parking.h:109

References parked_user::parking_space.

Referenced by alloc_new_parking_lot().

◆ parking_add_extension()

static int parking_add_extension ( struct ast_context context,
int  replace,
const char *  extension,
int  priority,
const char *  application,
const char *  data,
const char *  registrar 
)
static

Definition at line 774 of file res_parking.c.

776{
777 char *data_duplicate = ast_strdup(data);
778
779 if (!data_duplicate) {
780 return -1;
781 }
782
784 application, data_duplicate, ast_free_ptr, registrar, NULL, 0)) {
785 return -1;
786 }
787
788 return 0;
789}
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
void ast_free_ptr(void *ptr)
free() wrapper
Definition: astmm.c:1739
static int priority
static int replace(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **buf, ssize_t len)
Definition: func_strings.c:980
int ast_add_extension2_nolock(struct ast_context *con, int replace, const char *extension, int priority, const char *label, const char *callerid, const char *application, void *data, void(*datad)(void *), const char *registrar, const char *registrar_file, int registrar_line)
Same as ast_add_extension2, but assumes you have already locked context.
Definition: pbx.c:7281
static char * registrar
Definition: pbx_ael.c:81

References ast_add_extension2_nolock(), ast_free_ptr(), ast_strdup, voicemailpwcheck::context, NULL, priority, registrar, and replace().

Referenced by parking_lot_cfg_create_extensions().

◆ parking_config_alloc()

static void * parking_config_alloc ( void  )
static

allocator callback for parking_config. Notice it returns void * since it is only used by the backend config code

Definition at line 437 of file res_parking.c.

438{
439 RAII_VAR(struct parking_config *, cfg, NULL, ao2_cleanup);
440
441 if (!(cfg = ao2_alloc(sizeof(*cfg), parking_config_destructor))) {
442 return NULL;
443 }
444
445 cfg->parking_lots = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 37,
447 if (!cfg->parking_lots) {
448 return NULL;
449 }
450
451 if (!(cfg->global = ao2_alloc(sizeof(*cfg->global), parking_global_config_destructor))) {
452 return NULL;
453 }
454
455 /* Bump the ref count since RAII_VAR is going to eat one */
456 ao2_ref(cfg, +1);
457 return cfg;
458}
#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.
Definition: astobj2.h:1303
static void parking_config_destructor(void *obj)
destructor for parking_config
Definition: res_parking.c:423
static void parking_global_config_destructor(void *obj)
destructor for parking_global_config
Definition: res_parking.c:431
static int parking_lot_cfg_cmp_fn(void *obj, void *arg, const int flags)
Definition: res_parking.c:398
static int parking_lot_cfg_hash_fn(const void *obj, const int flags)
Definition: res_parking.c:380

References ao2_alloc, AO2_ALLOC_OPT_LOCK_MUTEX, ao2_cleanup, ao2_container_alloc_hash, ao2_ref, NULL, parking_config_destructor(), parking_global_config_destructor(), parking_lot_cfg_cmp_fn(), parking_lot_cfg_hash_fn(), and RAII_VAR.

◆ parking_config_destructor()

static void parking_config_destructor ( void *  obj)
static

destructor for parking_config

Definition at line 423 of file res_parking.c.

424{
425 struct parking_config *cfg = obj;
427 ao2_cleanup(cfg->global);
428}
struct parking_global_config * global
Definition: res_parking.c:341

References ao2_cleanup, parking_config::global, and parking_config::parking_lots.

Referenced by parking_config_alloc().

◆ parking_create_dynamic_lot()

struct parking_lot * parking_create_dynamic_lot ( const char *  name,
struct ast_channel chan 
)

Create a dynamic parking lot.

Since
12.0.0
Parameters
nameDynamic parking lot name to create
chanChannel parkee to get dynamic parking lot parameters from
Returns
dynamically created parking lot on success
Return values
NULLon error
Note
This should be called only after verifying that the named parking lot doesn't already exist in a non-dynamic way.

Definition at line 1120 of file res_parking.c.

1120 {
1121 return create_dynamic_lot_full(name, chan, 0);
1122}
static struct parking_lot * create_dynamic_lot_full(const char *name, struct ast_channel *chan, int forced)
Definition: res_parking.c:1031

References create_dynamic_lot_full(), and name.

Referenced by park_common_setup2(), and parking_park_call().

◆ parking_dynamic_lots_enabled()

int parking_dynamic_lots_enabled ( void  )

Check global configuration to see if dynamic parking is enabled.

Since
12.0.0
Return values
1if dynamic parking is enabled
0if dynamic parking is disabled

Definition at line 989 of file res_parking.c.

990{
992
993 if (!cfg) {
994 return 0;
995 }
996
997 return cfg->global->parkeddynamic;
998}

References ao2_cleanup, ao2_global_obj_ref, globals, and RAII_VAR.

Referenced by cli_display_parking_global(), and create_dynamic_lot_full().

◆ parking_feature_flag_cfg()

static int parking_feature_flag_cfg ( int *  param,
const char *  var 
)
static

Maps string values for option_handler_parkedfeature to their ENUM values.

Definition at line 605 of file res_parking.c.

606{
607 if (ast_false(var)) {
608 *param = 0;
609 } else if (!strcasecmp(var, "both")) {
611 } else if (!strcasecmp(var, "caller")) {
613 } else if (!strcasecmp(var, "callee")) {
615 } else {
616 return -1;
617 }
618
619 return 0;
620}
@ AST_FEATURE_FLAG_BYBOTH
Definition: features.h:39
@ AST_FEATURE_FLAG_BYCALLER
Definition: features.h:38
@ AST_FEATURE_FLAG_BYCALLEE
Definition: features.h:37
int attribute_pure ast_false(const char *val)
Make sure something is false. Determine if a string containing a boolean value is "false"....
Definition: utils.c:2216

References ast_false(), AST_FEATURE_FLAG_BYBOTH, AST_FEATURE_FLAG_BYCALLEE, AST_FEATURE_FLAG_BYCALLER, and var.

Referenced by option_handler_parkedfeature().

◆ parking_global_config_destructor()

static void parking_global_config_destructor ( void *  obj)
static

destructor for parking_global_config

Definition at line 431 of file res_parking.c.

432{
433 /* For now, do nothing. */
434}

Referenced by parking_config_alloc().

◆ parking_lot_build_or_update()

struct parking_lot * parking_lot_build_or_update ( struct parking_lot_cfg cfg,
int  dynamic 
)

If a parking lot exists in the parking lot list already, update its status to match the provided configuration and return a reference return a reference to it. Otherwise, create a parking lot struct based on a parking lot configuration and return a reference to the new one.

Since
12.0.0
Parameters
cfgThe configuration being used as a reference to build the parking lot from.
dynamicnon-zero if creating a dynamic parking lot with this. Don't replace existing parking lots. Ever.
Returns
A reference to the new parking lot
Return values
NULLif it was not found and could not be allocated
Note
The parking lot will need to be unreffed if it ever falls out of scope
The parking lot will automatically be added to the parking lot container if needed as part of this process

Definition at line 929 of file res_parking.c.

930{
931 struct parking_lot *lot;
932 struct parking_lot_cfg *replaced_cfg = NULL;
933 int found = 0;
934
935 /* Start by trying to find it. If that works we can skip the rest. */
937 if (!lot) {
938 lot = alloc_new_parking_lot(lot_cfg);
939
940 /* If we still don't have a lot, we failed to alloc one. */
941 if (!lot) {
942 return NULL;
943 }
944 } else {
945 found = 1;
946
947 if (dynamic) {
948 ast_log(LOG_ERROR, "Tried to create dynamic parking lot with name '%s' but a lot with that name already exists.\n", lot_cfg->name);
949 ao2_cleanup(lot);
950 return NULL;
951 }
952 }
953
954 /* Set the configuration reference. Unref the one currently in the lot if it's there. */
955 if (lot->cfg) {
956 replaced_cfg = lot->cfg;
957 }
958
959 ao2_ref(lot_cfg, +1);
960 lot->cfg = lot_cfg;
961
962 ao2_cleanup(replaced_cfg);
963
964 /* Set the operating mode to normal since the parking lot has a configuration. */
965 lot->disable_mark = 0;
966 lot->mode = dynamic ? PARKINGLOT_DYNAMIC : PARKINGLOT_NORMAL;
967
968 if (!found) {
969 /* Link after configuration is set since a lot without configuration will cause all kinds of trouble. */
971 };
972
973 return lot;
974}
#define ao2_link(container, obj)
Add an object to a container.
Definition: astobj2.h:1532
static struct parking_lot * alloc_new_parking_lot(struct parking_lot_cfg *lot_cfg)
Definition: res_parking.c:698
static void * named_item_find(struct ao2_container *container, const char *name)
find an item in a container by its name
Definition: res_parking.c:557
@ PARKINGLOT_NORMAL
Definition: res_parking.h:57
@ PARKINGLOT_DYNAMIC
Definition: res_parking.h:59
enum parking_lot_modes mode
Definition: res_parking.h:97

References alloc_new_parking_lot(), ao2_cleanup, ao2_link, ao2_ref, ast_log, parking_lot::cfg, parking_lot::disable_mark, LOG_ERROR, parking_lot::mode, parking_lot_cfg::name, named_item_find(), NULL, parking_lot_container, PARKINGLOT_DYNAMIC, and PARKINGLOT_NORMAL.

Referenced by create_dynamic_lot_full(), and generate_or_link_lots_to_configs().

◆ parking_lot_cfg_alloc()

static void * parking_lot_cfg_alloc ( const char *  cat)
static

create a parking lot structure

Parameters
catname given to the parking lot
Return values
NULLfailure
non-NULLsuccessfully allocated parking lot

Definition at line 521 of file res_parking.c.

522{
523 struct parking_lot_cfg *lot_cfg;
524
525 lot_cfg = ao2_alloc(sizeof(*lot_cfg), parking_lot_cfg_destructor);
526 if (!lot_cfg) {
527 return NULL;
528 }
529
530 if (ast_string_field_init(lot_cfg, 32)) {
531 ao2_cleanup(lot_cfg);
532 return NULL;
533 }
534
535 ast_string_field_set(lot_cfg, name, cat);
536
537 return lot_cfg;
538}
static void parking_lot_cfg_destructor(void *obj)
Destroy a parking lot cfg object.
Definition: res_parking.c:487

References ao2_alloc, ao2_cleanup, ast_string_field_init, ast_string_field_set, name, NULL, and parking_lot_cfg_destructor().

Referenced by clone_parkinglot_cfg(), and verify_default_parking_lot().

◆ parking_lot_cfg_cmp_fn()

static int parking_lot_cfg_cmp_fn ( void *  obj,
void *  arg,
const int  flags 
)
static

Definition at line 398 of file res_parking.c.

399{
400 struct parking_lot_cfg *entry1 = obj;
401
402 char *key;
403 size_t key_size;
404 struct parking_lot_cfg *entry2;
405
406 switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
407 case OBJ_KEY:
408 key = arg;
409 return (!strcmp(entry1->name, key)) ? CMP_MATCH : 0;
410 case OBJ_PARTIAL_KEY:
411 key = arg;
412 key_size = strlen(key);
413 return (!strncmp(entry1->name, key, key_size)) ? CMP_MATCH : 0;
414 case OBJ_POINTER:
415 entry2 = arg;
416 return (!strcmp(entry1->name, entry2->name)) ? CMP_MATCH : 0;
417 default:
418 return CMP_STOP;
419 }
420}
@ CMP_STOP
Definition: astobj2.h:1028
#define OBJ_POINTER
Definition: astobj2.h:1150
#define OBJ_PARTIAL_KEY
Definition: astobj2.h:1152

References CMP_MATCH, CMP_STOP, parking_lot_cfg::name, OBJ_KEY, OBJ_PARTIAL_KEY, and OBJ_POINTER.

Referenced by parking_config_alloc().

◆ parking_lot_cfg_create_extensions()

int parking_lot_cfg_create_extensions ( struct parking_lot_cfg lot_cfg)

Add extensions for a parking lot configuration.

Since
12.0.0
Parameters
lot_cfgparking lot configuration to generate extensions for
Return values
0on success
non-zeroon failure

Definition at line 819 of file res_parking.c.

820{
821 int parkingspace;
822 struct ast_exten *existing_exten;
823 struct ast_context *lot_context;
824 struct pbx_find_info find_info = { .stacklen = 0 }; /* the rest is reset in pbx_find_extension */
825 const char *parkext_registrar_pointer; /* Used for park extension */
826 const char *parkedcall_registrar_pointer; /* Used for parkedcall extensions/hints */
827
828 if (ast_strlen_zero(lot_cfg->parkext)) {
829 return 0;
830 }
831
832 ast_string_field_build(lot_cfg, registrar, "%s/%s", BASE_REGISTRAR, lot_cfg->name);
833 parkedcall_registrar_pointer = lot_cfg->registrar;
834
835 if (lot_cfg->parkext_exclusive) {
836 parkext_registrar_pointer = lot_cfg->registrar;
837 } else {
838 parkext_registrar_pointer = BASE_REGISTRAR;
839 }
840
841 /* We need the contexts list locked to safely be able to both read and lock the specific context within */
843
844 if (!(lot_context = ast_context_find_or_create(NULL, NULL, lot_cfg->parking_con, parkext_registrar_pointer))) {
845 ast_log(LOG_ERROR, "Parking lot '%s' -- Needs a context '%s' which does not exist and Asterisk was unable to create\n",
846 lot_cfg->name, lot_cfg->parking_con);
848 return -1;
849 }
850
851 /* Once we know what context we will be modifying, we need to write lock it because we will be reading extensions
852 * and we don't want something else to destroy them while we are looking at them.
853 */
854 ast_wrlock_context(lot_context);
855
857
858 /* Handle generation/confirmation for the Park extension */
859 if ((existing_exten = pbx_find_extension(NULL, NULL, &find_info, lot_cfg->parking_con, lot_cfg->parkext, 1, NULL, NULL, E_MATCH))) {
860 if (lot_cfg->parkext_exclusive || !extension_is_compatible(lot_cfg, PARK_APPLICATION, existing_exten)) {
861 ast_unlock_context(lot_context);
862 return -1;
863 }
864 } else if (parking_add_extension(lot_context, 0, lot_cfg->parkext, 1, PARK_APPLICATION,
865 lot_cfg->parkext_exclusive ? lot_cfg->name : "", parkext_registrar_pointer)) {
866 ast_log(LOG_ERROR, "Parking lot '%s' -- Failed to add %s extension '%s@%s' to the PBX.\n",
867 lot_cfg->name, PARK_APPLICATION, lot_cfg->parkext, lot_cfg->parking_con);
868 ast_unlock_context(lot_context);
869 return -1;
870 }
871
872 /* Handle generation/confirmation for the ParkedCall extensions and hints */
873 for (parkingspace = lot_cfg->parking_start; parkingspace <= lot_cfg->parking_stop; parkingspace++) {
874 char space[AST_MAX_EXTENSION];
875 RAII_VAR(struct ast_str *, arguments_string, NULL, ast_free);
876 find_info.stacklen = 0; /* reset for pbx_find_exten */
877
878 snprintf(space, sizeof(space), "%d", parkingspace);
879
880 /* Unlike the Park extensions, ParkedCall extensions and their hints may never be shared for any reason. */
881 if ((existing_exten = pbx_find_extension(NULL, NULL, &find_info, lot_cfg->parking_con, space, 1, NULL, NULL, E_MATCH))) {
882 ast_unlock_context(lot_context);
883 return -1;
884 }
885
886 arguments_string = ast_str_create(32);
887 if (!arguments_string) {
888 ast_unlock_context(lot_context);
889 return -1;
890 }
891
892 ast_str_set(&arguments_string, 0, "%s,%s", lot_cfg->name, space);
893 if (parking_add_extension(lot_context, 0, space, 1, PARKED_CALL_APPLICATION,
894 ast_str_buffer(arguments_string), parkedcall_registrar_pointer)) {
895 ast_log(LOG_ERROR, "Parking lot '%s' -- Failed to add %s extension '%s@%s' to the PBX.\n",
896 lot_cfg->name, PARKED_CALL_APPLICATION, space, lot_cfg->parking_con);
897 ast_unlock_context(lot_context);
898 return -1;
899 }
900
901 find_info.stacklen = 0; /* reset for pbx_find_exten */
902
903 if (lot_cfg->parkaddhints) {
904 char hint_device[AST_MAX_EXTENSION];
905
906 snprintf(hint_device, sizeof(hint_device), "park:%s@%s", space, lot_cfg->parking_con);
907
908 if ((existing_exten = pbx_find_extension(NULL, NULL, &find_info, lot_cfg->parking_con, space, PRIORITY_HINT, NULL, NULL, E_MATCH))) {
909 ast_log(LOG_ERROR, "Parking lot '%s' -- Needs to add a hint '%s' at '%s@%s' but one already exists owned by %s\n",
910 lot_cfg->name, hint_device, space, lot_cfg->parking_con, ast_get_extension_registrar(existing_exten));
911 ast_unlock_context(lot_context);
912 return -1;
913 }
914
915 if (parking_add_extension(lot_context, 0, space, PRIORITY_HINT, hint_device, "", parkedcall_registrar_pointer)) {
916 ast_log(LOG_ERROR, "Parking lot '%s' -- Failed to add hint '%s@%s' to the PBX.\n",
917 lot_cfg->name, space, lot_cfg->parking_con);
918 ast_unlock_context(lot_context);
919 return -1;
920 }
921 }
922 }
923
924 ast_unlock_context(lot_context);
925
926 return 0;
927}
#define ast_free(a)
Definition: astmm.h:180
#define AST_MAX_EXTENSION
Definition: channel.h:134
@ E_MATCH
Definition: extconf.h:217
#define PARK_APPLICATION
The default parking application that Asterisk expects.
Definition: parking.h:35
int ast_wrlock_contexts(void)
Write locks the context list.
Definition: pbx.c:8478
int ast_wrlock_context(struct ast_context *con)
Write locks a given context.
Definition: pbx.c:8496
struct ast_context * ast_context_find_or_create(struct ast_context **extcontexts, struct ast_hashtab *exttable, const char *name, const char *registrar)
Register a new context or find an existing one.
Definition: pbx.c:6164
int ast_unlock_context(struct ast_context *con)
Definition: pbx.c:8506
#define PRIORITY_HINT
Definition: pbx.h:54
struct ast_exten * pbx_find_extension(struct ast_channel *chan, struct ast_context *bypass, struct pbx_find_info *q, const char *context, const char *exten, int priority, const char *label, const char *callerid, enum ext_match_t action)
Definition: ael_main.c:152
int ast_unlock_contexts(void)
Unlocks contexts.
Definition: pbx.c:8488
static int parking_add_extension(struct ast_context *context, int replace, const char *extension, int priority, const char *application, const char *data, const char *registrar)
Definition: res_parking.c:774
static int extension_is_compatible(struct parking_lot_cfg *lot_cfg, const char *app_type, struct ast_exten *extension)
Definition: res_parking.c:791
#define PARKED_CALL_APPLICATION
Definition: res_parking.h:38
#define ast_string_field_build(x, field, fmt, args...)
Set a field to a complex (built) value.
Definition: stringfields.h:555
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:659
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:1113
ast_context: An extension context
Definition: pbx.c:299
ast_exten: An extension The dialplan is saved as a linked list with each context having it's own link...
Definition: pbx.c:252
Support for dynamic strings.
Definition: strings.h:623
const ast_string_field registrar
Definition: res_parking.h:89
const ast_string_field parkext
Definition: res_parking.h:89
const ast_string_field parking_con
Definition: res_parking.h:89
int stacklen
Definition: extconf.h:237

References ast_context_find_or_create(), ast_free, ast_get_extension_registrar(), ast_log, AST_MAX_EXTENSION, ast_str_buffer(), ast_str_create, ast_str_set(), ast_string_field_build, ast_strlen_zero(), ast_unlock_context(), ast_unlock_contexts(), ast_wrlock_context(), ast_wrlock_contexts(), BASE_REGISTRAR, E_MATCH, extension_is_compatible(), LOG_ERROR, parking_lot_cfg::name, NULL, PARK_APPLICATION, parking_lot_cfg::parkaddhints, PARKED_CALL_APPLICATION, parking_lot_cfg::parkext, parking_lot_cfg::parkext_exclusive, parking_add_extension(), parking_lot_cfg::parking_con, parking_lot_cfg::parking_start, pbx_find_extension(), PRIORITY_HINT, RAII_VAR, registrar, parking_lot_cfg::registrar, and pbx_find_info::stacklen.

Referenced by configure_parking_extensions(), and create_dynamic_lot_full().

◆ parking_lot_cfg_destructor()

static void parking_lot_cfg_destructor ( void *  obj)
static

Destroy a parking lot cfg object.

Definition at line 487 of file res_parking.c.

488{
489 struct parking_lot_cfg *lot_cfg = obj;
492}
void parking_lot_cfg_remove_extensions(struct parking_lot_cfg *lot_cfg)
Remove extensions belonging to a parking lot configuration.
Definition: res_parking.c:724
#define ast_string_field_free_memory(x)
free all memory - to be called before destroying the object
Definition: stringfields.h:374

References ast_string_field_free_memory, and parking_lot_cfg_remove_extensions().

Referenced by parking_lot_cfg_alloc().

◆ parking_lot_cfg_hash_fn()

static int parking_lot_cfg_hash_fn ( const void *  obj,
const int  flags 
)
static

Definition at line 380 of file res_parking.c.

381{
382 const struct parking_lot_cfg *entry;
383 const char *key;
384
385 switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
386 case OBJ_KEY:
387 key = obj;
388 return ast_str_hash(key);
389 case OBJ_PARTIAL_KEY:
390 ast_assert(0);
391 return 0;
392 default:
393 entry = obj;
394 return ast_str_hash(entry->name);
395 }
396}
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
Definition: strings.h:1259

References ast_assert, ast_str_hash(), parking_lot_cfg::name, OBJ_KEY, OBJ_PARTIAL_KEY, and OBJ_POINTER.

Referenced by parking_config_alloc().

◆ parking_lot_cfg_remove_extensions()

void parking_lot_cfg_remove_extensions ( struct parking_lot_cfg lot_cfg)

Remove extensions belonging to a parking lot configuration.

Since
12.0.0
Parameters
lot_cfgparking lot configuratin to remove extensions from
Note
This will not remove extensions registered non-exclusively even if those extensions were registered by lot_cfg. Those are only purged on a res_parking module reload.

Definition at line 724 of file res_parking.c.

725{
726 if (!ast_strlen_zero(lot_cfg->registrar)) {
727 /* Although the function is called ast_context_destroy, the use of this funtion is
728 * intended only to remove extensions, hints, etc registered by the parking lot's registrar.
729 * It won't actually destroy the context unless that context is empty afterwards and it is
730 * unreferenced.
731 */
733 }
734
735 /* If we come back for a second pass, someone else has this registrar now. */
736 ast_string_field_set(lot_cfg, registrar, "");
737}
void ast_context_destroy(struct ast_context *con, const char *registrar)
Destroy a context (matches the specified context or ANY context if NULL)
Definition: pbx.c:8236

References ast_context_destroy(), ast_string_field_set, ast_strlen_zero(), NULL, registrar, and parking_lot_cfg::registrar.

Referenced by parking_lot_cfg_destructor(), remove_all_configured_parking_lot_extensions(), and remove_pending_parking_lot_extensions().

◆ parking_lot_destructor()

static void parking_lot_destructor ( void *  obj)
static

Definition at line 686 of file res_parking.c.

687{
688 struct parking_lot *lot = obj;
689
690 if (lot->parking_bridge) {
692 }
694 ao2_cleanup(lot->cfg);
696}
int ast_bridge_destroy(struct ast_bridge *bridge, int cause)
Destroy a bridge.
Definition: bridge.c:1009
struct ast_bridge * parking_bridge
Definition: res_parking.h:94

References ao2_cleanup, ast_bridge_destroy(), ast_string_field_free_memory, parking_lot::cfg, parking_lot::parked_users, and parking_lot::parking_bridge.

Referenced by alloc_new_parking_lot().

◆ parking_lot_disable()

static void parking_lot_disable ( struct parking_lot lot)
static

Definition at line 474 of file res_parking.c.

475{
476 /* If a dynamic lot wasn't removed, we need to restore it to full functionality afterwards. */
477 int was_dynamic = (lot->mode == PARKINGLOT_DYNAMIC);
478
480 if (parking_lot_remove_if_unused(lot) && was_dynamic) {
482 lot->disable_mark = 0;
483 }
484}
int parking_lot_remove_if_unused(struct parking_lot *lot)
Remove a parking lot from the usable lists if it is no longer involved in any calls and no configurat...
Definition: res_parking.c:460
@ PARKINGLOT_DISABLED
Definition: res_parking.h:61

References parking_lot::disable_mark, parking_lot::mode, parking_lot_remove_if_unused(), PARKINGLOT_DISABLED, and PARKINGLOT_DYNAMIC.

Referenced by disable_marked_lots().

◆ parking_lot_find_by_name()

struct parking_lot * parking_lot_find_by_name ( const char *  lot_name)

Find a parking lot based on its name.

Since
12.0.0
Parameters
lot_nameName of the parking lot sought
Returns
The parking lot if found
Return values
NULLif no parking lot with the name specified exists
Note
ao2_cleanup this reference when you are done using it or you'll cause leaks.

Definition at line 662 of file res_parking.c.

663{
664 struct parking_lot *lot = named_item_find(parking_lot_container, lot_name);
665 return lot;
666}

References named_item_find(), and parking_lot_container.

Referenced by cli_display_parking_lot(), create_dynamic_lot_full(), func_get_parkingslot_channel(), manager_parking_status_single_lot(), park_common_setup2(), parked_call_app_exec(), and parking_park_call().

◆ parking_lot_remove_if_unused()

int parking_lot_remove_if_unused ( struct parking_lot lot)

Remove a parking lot from the usable lists if it is no longer involved in any calls and no configuration currently claims it.

Since
12.0.0
Parameters
lotWhich parking lot is being checked for elimination
Return values
0if the parking lot was removed
-1if the parking lot wasn't removed.
Note
This should generally be called when something is happening that could cause a parking lot to die such as a call being unparked or a parking lot no longer existing in configurations.

Definition at line 460 of file res_parking.c.

461{
462 if (lot->mode != PARKINGLOT_DISABLED) {
463 return -1;
464 }
465
468 return 0;
469 }
470
471 return -1;
472}
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
#define ao2_unlink(container, obj)
Remove an object from a container.
Definition: astobj2.h:1578

References ao2_container_count(), ao2_unlink, parking_lot::mode, parking_lot::parked_users, parking_lot_container, and PARKINGLOT_DISABLED.

Referenced by parking_lot_disable(), parking_lot_retrieve_parked_user(), and unpark_parked_user().

◆ parking_lot_sort_fn()

static int parking_lot_sort_fn ( const void *  obj_left,
const void *  obj_right,
int  flags 
)
static

Definition at line 304 of file res_parking.c.

305{
306 const struct parking_lot *left = obj_left;
307 const struct parking_lot *right = obj_right;
308 const char *right_key = obj_right;
309 int cmp;
310
311 switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
312 default:
313 case OBJ_POINTER:
314 right_key = right->name;
315 /* Fall through */
316 case OBJ_KEY:
317 cmp = strcmp(left->name, right_key);
318 break;
319 case OBJ_PARTIAL_KEY:
320 cmp = strncmp(left->name, right_key, strlen(right_key));
321 }
322 return cmp;
323}
const ast_string_field name
Definition: res_parking.h:102

References parking_lot::name, OBJ_KEY, OBJ_PARTIAL_KEY, and OBJ_POINTER.

Referenced by load_module().

◆ reload_module()

static int reload_module ( void  )
static

Definition at line 1341 of file res_parking.c.

1342{
1343 if (aco_process_config(&cfg_info, 1) == ACO_PROCESS_ERROR) {
1345 }
1346
1347 return 0;
1348}

References aco_process_config(), ACO_PROCESS_ERROR, and AST_MODULE_LOAD_DECLINE.

◆ remove_all_configured_parking_lot_extensions()

static void remove_all_configured_parking_lot_extensions ( void  )
static

Definition at line 739 of file res_parking.c.

740{
742 struct parking_lot_cfg *lot_cfg;
743 struct ao2_iterator iter;
744
745 if (!cfg) {
746 return;
747 }
748
749 for (iter = ao2_iterator_init(cfg->parking_lots, 0); (lot_cfg = ao2_iterator_next(&iter)); ao2_ref(lot_cfg, -1)) {
751 }
752
754
756}

References ao2_cleanup, ao2_global_obj_ref, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_context_destroy(), BASE_REGISTRAR, parking_lot::cfg, globals, NULL, parking_lot_cfg_remove_extensions(), and RAII_VAR.

Referenced by configure_parking_extensions(), and unload_module().

◆ remove_pending_parking_lot_extensions()

static void remove_pending_parking_lot_extensions ( struct parking_config cfg_pending)
static

Definition at line 1156 of file res_parking.c.

1157{
1158 struct parking_lot_cfg *lot_cfg;
1159 struct ao2_iterator iter;
1160
1161 for (iter = ao2_iterator_init(cfg_pending->parking_lots, 0); (lot_cfg = ao2_iterator_next(&iter)); ao2_ref(lot_cfg, -1)) {
1163 }
1164
1165 ao2_iterator_destroy(&iter);
1166
1168
1169}

References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_context_destroy(), BASE_REGISTRAR, NULL, parking_lot_cfg_remove_extensions(), and parking_config::parking_lots.

Referenced by configure_parking_extensions().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 1251 of file res_parking.c.

1252{
1262 aco_info_destroy(&cfg_info);
1264
1265 return 0;
1266}
#define ao2_global_obj_release(holder)
Release the ao2 object held in the global holder.
Definition: astobj2.h:859
void aco_info_destroy(struct aco_info *info)
Destroy an initialized aco_info struct.
void unload_parking_applications(void)
Unregister parking applications.
void unload_parking_bridge_features(void)
Unregister features registered by load_parking_bridge_features.
void unload_parking_devstate(void)
Unregister Parking devstate handler.
void unload_parking_manager(void)
Unregister manager actions and remove subscriptions for stasis events.
void unload_parking_tests(void)
Unregister parking unit tests.
void unload_parking_ui(void)
Unregister CLI commands.
Definition: parking_ui.c:203

References aco_info_destroy(), ao2_cleanup, ao2_global_obj_release, globals, NULL, parking_lot_container, remove_all_configured_parking_lot_extensions(), unload_parking_applications(), unload_parking_bridge_features(), unload_parking_devstate(), unload_parking_manager(), unload_parking_tests(), and unload_parking_ui().

Referenced by load_module().

◆ verify_default_parking_lot()

static int verify_default_parking_lot ( void  )
static

Definition at line 1132 of file res_parking.c.

1133{
1134 struct parking_config *cfg = aco_pending_config(&cfg_info);
1135 RAII_VAR(struct parking_lot_cfg *, lot_cfg, NULL, ao2_cleanup);
1136
1137 if (!cfg) {
1138 return 0;
1139 }
1140
1142 if (!lot_cfg) {
1144 if (!lot_cfg) {
1145 return -1;
1146 }
1147 ast_log(AST_LOG_NOTICE, "Adding %s profile to res_parking\n", DEFAULT_PARKING_LOT);
1150 ao2_link(cfg->parking_lots, lot_cfg);
1151 }
1152
1153 return 0;
1154}
int aco_set_defaults(struct aco_type *type, const char *category, void *obj)
Set all default options of obj.
#define AST_LOG_NOTICE
static struct aco_type parking_lot_type
Definition: res_parking.c:355
#define DEFAULT_PARKING_EXTEN
Definition: res_parking.h:35

References aco_pending_config(), aco_set_defaults(), ao2_cleanup, ao2_find, ao2_link, ast_log, AST_LOG_NOTICE, ast_string_field_set, DEFAULT_PARKING_EXTEN, DEFAULT_PARKING_LOT, NULL, OBJ_KEY, parking_lot_cfg_alloc(), parking_lot_type, parking_config::parking_lots, and RAII_VAR.

Referenced by config_parking_preapply().

Variable Documentation

◆ __mod_info

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

Definition at line 1356 of file res_parking.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 1356 of file res_parking.c.

◆ global_option

struct aco_type global_option
static

Definition at line 345 of file res_parking.c.

◆ global_options

struct aco_type* global_options[] = ACO_TYPES(&global_option)

Definition at line 353 of file res_parking.c.

Referenced by load_module().

◆ parking_lot_conf

struct aco_file parking_lot_conf
Initial value:
= {
.filename = "res_parking.conf",
}
#define ACO_TYPES(...)
A helper macro to ensure that aco_info types always have a sentinel.
static struct aco_type global_option
Definition: res_parking.c:345

Definition at line 367 of file res_parking.c.

◆ parking_lot_container

struct ao2_container* parking_lot_container
static

All parking lots that are currently alive in some fashion can be obtained from here

Definition at line 326 of file res_parking.c.

Referenced by create_dynamic_lot_full(), disable_marked_lots(), get_parking_lot_container(), load_module(), mark_lots_as_disabled(), parking_lot_build_or_update(), parking_lot_find_by_name(), parking_lot_remove_if_unused(), and unload_module().

◆ parking_lot_type

struct aco_type parking_lot_type
static

Definition at line 355 of file res_parking.c.

Referenced by verify_default_parking_lot().

◆ parking_lot_types

struct aco_type* parking_lot_types[] = ACO_TYPES(&parking_lot_type)

Definition at line 365 of file res_parking.c.

Referenced by load_module().