Asterisk - The Open Source Telephony Project GIT-master-a358458
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 1296 of file res_parking.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 1296 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 638 of file res_parking.c.

639{
640 struct parking_lot *lot;
641 if (!(lot = ao2_alloc(sizeof(*lot), parking_lot_destructor))) {
642 return NULL;
643 }
644
645 if (ast_string_field_init(lot, 32)) {
646 return NULL;
647 }
648
649 /* Create parked user ordered list */
654
655 if (!lot->parked_users) {
656 ao2_cleanup(lot);
657 return NULL;
658 }
659
660 ast_string_field_set(lot, name, lot_cfg->name);
661 return lot;
662}
@ 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:435
static int parked_user_sort_fn(const void *obj_left, const void *obj_right, int flags)
Definition: res_parking.c:447
static void parking_lot_destructor(void *obj)
Definition: res_parking.c:626
#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 1296 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 940 of file res_parking.c.

941{
943
944 if (!cfg) {
945 return NULL;
946 }
947
948 ast_string_fields_copy(cfg, source);
949
950 /* Needs to be reset after being copied */
952
953 /* Stuff that should be cloned that isn't hit by string field copy */
954 cfg->parking_start = source->parking_start;
955 cfg->parking_stop = source->parking_stop;
956 cfg->parkingtime = source->parkingtime;
957 cfg->comebackdialtime = source->comebackdialtime;
958 cfg->parkfindnext = source->parkfindnext;
960 cfg->parkaddhints = source->parkaddhints;
961 cfg->comebacktoorigin = source->comebacktoorigin;
962 cfg->parkedplay = source->parkedplay;
965 cfg->parkedcallhangup = source->parkedcallhangup;
967
968 return cfg;
969}
static void * parking_lot_cfg_alloc(const char *cat)
create a parking lot structure
Definition: res_parking.c:461
#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 1156 of file res_parking.c.

1157{
1159
1161 return -1;
1162 }
1163
1165 return -1;
1166 }
1167
1168 return 0;
1169}
static int verify_default_parking_lot(void)
Definition: res_parking.c:1072
static void mark_lots_as_disabled(void)
Definition: res_parking.c:1144
static int configure_parking_extensions(void)
Definition: res_parking.c:1111

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 1111 of file res_parking.c.

1112{
1113 struct parking_config *cfg = aco_pending_config(&cfg_info);
1114 struct ao2_iterator iter;
1115 RAII_VAR(struct parking_lot_cfg *, lot_cfg, NULL, ao2_cleanup);
1116 int res = 0;
1117
1118 if (!cfg) {
1119 return 0;
1120 }
1121
1122 /* Clear existing extensions */
1124
1125 /* Attempt to build new extensions for each lot */
1126 for (iter = ao2_iterator_init(cfg->parking_lots, 0); (lot_cfg = ao2_iterator_next(&iter)); ao2_ref(lot_cfg, -1)) {
1127 if (parking_lot_cfg_create_extensions(lot_cfg)) {
1128 ao2_cleanup(lot_cfg);
1129 lot_cfg = NULL;
1130 res = -1;
1131 break;
1132 }
1133 }
1134 ao2_iterator_destroy(&iter);
1135
1136 if (res) {
1138 ast_log(LOG_ERROR, "Extension registration failed. Previously configured lot extensions were removed and can not be safely restored.\n");
1139 }
1140
1141 return res;
1142}
#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:679
static void remove_pending_parking_lot_extensions(struct parking_config *cfg_pending)
Definition: res_parking.c:1096
int parking_lot_cfg_create_extensions(struct parking_lot_cfg *lot_cfg)
Add extensions for a parking lot configuration.
Definition: res_parking.c:759
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:282
#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 971 of file res_parking.c.

972{
973 RAII_VAR(struct parking_lot_cfg *, cfg, NULL, ao2_cleanup);
974 RAII_VAR(struct parking_lot *, template_lot, NULL, ao2_cleanup);
975
976 struct parking_lot *lot;
977 const char *dyn_context;
978 const char *dyn_exten;
979 const char *dyn_range;
980 const char *template_name;
981 const char *chan_template_name;
982 int dyn_start;
983 int dyn_end;
984
985 if (!forced && !parking_dynamic_lots_enabled()) {
986 return NULL;
987 }
988
989 ast_channel_lock(chan);
990 chan_template_name = ast_strdupa(S_OR(pbx_builtin_getvar_helper(chan, "PARKINGDYNAMIC"), ""));
991 dyn_context = ast_strdupa(S_OR(pbx_builtin_getvar_helper(chan, "PARKINGDYNCONTEXT"), ""));
992 dyn_exten = ast_strdupa(S_OR(pbx_builtin_getvar_helper(chan, "PARKINGDYNEXTEN"), ""));
993 dyn_range = ast_strdupa(S_OR(pbx_builtin_getvar_helper(chan, "PARKINGDYNPOS"), ""));
994 ast_channel_unlock(chan);
995
996 template_name = S_OR(chan_template_name, DEFAULT_PARKING_LOT);
997
998 template_lot = parking_lot_find_by_name(template_name);
999 if (!template_lot) {
1000 ast_log(LOG_ERROR, "Lot %s does not exist. Can not use it as a dynamic parking lot template.\n",
1001 template_name);
1002 return NULL;
1003 }
1004
1005 cfg = clone_parkinglot_cfg(template_lot->cfg, name);
1006
1007 if (!cfg) {
1008 ast_log(LOG_ERROR, "Failed to allocate dynamic parking lot configuration.\n");
1009 return NULL;
1010 }
1011
1012 if (!ast_strlen_zero(dyn_exten)) {
1013 ast_string_field_set(cfg, parkext, dyn_exten);
1014 }
1015
1016 if (!ast_strlen_zero(dyn_context)) {
1017 ast_string_field_set(cfg, parking_con, dyn_context);
1018 }
1019
1020 if (!ast_strlen_zero(dyn_range)) {
1021 if (sscanf(dyn_range, "%30d-%30d", &dyn_start, &dyn_end) != 2) {
1023 "Invalid parking range %s specified in PARKINGDYNPOS: could not parse minimum/maximum parking space range\n", dyn_range);
1024 return NULL;
1025 }
1026 if (dyn_end < dyn_start || dyn_start < 0) {
1028 "Invalid parking range %s specified for PARKINGDYNPOS: end parking space must be greater than starting parking space.\n", dyn_range);
1029 return NULL;
1030 }
1031
1032 cfg->parking_start = dyn_start;
1033 cfg->parking_stop = dyn_end;
1034 }
1035
1037 ast_log(LOG_ERROR, "Extensions for dynamic parking lot '%s' could not be registered. Dynamic lot creation failed.\n", name);
1038 return NULL;
1039 }
1040
1042
1043 if ((lot = parking_lot_find_by_name(name))) {
1045 ast_log(LOG_ERROR, "Started creating dynamic parking lot '%s', but a parking lot with that name already exists.\n", name);
1046 ao2_ref(lot, -1);
1047 return NULL;
1048 }
1049
1052
1053 if (!lot) {
1054 ast_log(LOG_NOTICE, "Failed to build dynamic parking lot '%s'\n", name);
1055 }
1056
1057 return lot;
1058}
#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:2922
#define ast_channel_unlock(chan)
Definition: channel.h:2923
#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:940
static struct ao2_container * parking_lot_container
Definition: res_parking.c:266
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:869
struct parking_lot * parking_lot_find_by_name(const char *lot_name)
Find a parking lot based on its name.
Definition: res_parking.c:602
int parking_dynamic_lots_enabled(void)
Check global configuration to see if dynamic parking is enabled.
Definition: res_parking.c:929
#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 1171 of file res_parking.c.

1172{
1173 struct ao2_iterator iter;
1174 struct parking_lot *lot;
1175
1176 for (iter = ao2_iterator_init(parking_lot_container, 0); (lot = ao2_iterator_next(&iter)); ao2_ref(lot, -1)) {
1177 if (lot->disable_mark) {
1179 }
1180 }
1181
1182 ao2_iterator_destroy(&iter);
1183}
static void parking_lot_disable(struct parking_lot *lot)
Definition: res_parking.c:414
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 731 of file res_parking.c.

732{
733 const char *extension_registrar = ast_get_extension_registrar(extension);
734 const char *extension_context = ast_get_context_name(ast_get_extension_context(extension));
735 const char *extension_name = ast_get_extension_name(extension);
736 const char *extension_application = ast_get_extension_app(extension);
737
738 ast_assert(extension_registrar && extension_context && extension_name && extension_application);
739
740 if (strcmp(extension_registrar, BASE_REGISTRAR)) {
741 ast_log(LOG_ERROR, "Parking lot '%s' -- Needs an extension '%s@%s', but that extension is already owned by %s.\n",
742 lot_cfg->name, extension_name, extension_context, extension_registrar);
743 return 0;
744 }
745
746 if (strcmp(extension_application, app_type)) {
747 ast_log(LOG_ERROR, "Parking lot '%s' -- Needs an extension '%s@%s' with a non-exclusive %s application, "
748 "but a/an %s application is already registered to that extension by %s.\n",
749 lot_cfg->name, extension_name, extension_context, app_type,
750 extension_application, BASE_REGISTRAR);
751 return 0;
752 }
753
754 ast_debug(3, "Parking lot '%s' -- extension '%s@%s' with application %s is compatible.\n",
755 lot_cfg->name, extension_name, extension_context, app_type);
756 return 1;
757}
#define ast_debug(level,...)
Log a DEBUG message.
const char * ast_get_extension_app(struct ast_exten *e)
Definition: pbx.c:8557
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:8504
const char * ast_get_extension_name(struct ast_exten *exten)
Definition: pbx.c:8509
const char * ast_get_extension_registrar(struct ast_exten *e)
Definition: pbx.c:8532
#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 608 of file res_parking.c.

609{
610 const char *name;
611
612 /* The channel variable overrides everything */
613 name = pbx_builtin_getvar_helper(chan, "PARKINGLOT");
614 if (ast_strlen_zero(name)) {
615 /* Try the channel's parking lot. */
617 if (ast_strlen_zero(name)) {
618 /* Fall back to the default parking lot. */
620 }
621 }
622
623 return name;
624}
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 916 of file res_parking.c.

917{
919 struct parking_lot_cfg *lot_cfg;
920 struct ao2_iterator iter;
921
922 iter = ao2_iterator_init(cfg->parking_lots, 0);
923 for (; (lot_cfg = ao2_iterator_next(&iter)); ao2_ref(lot_cfg, -1)) {
925 }
927}
#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 597 of file res_parking.c.

598{
600}

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 1185 of file res_parking.c.

1186{
1189}
static void disable_marked_lots(void)
Definition: res_parking.c:1171
static void generate_or_link_lots_to_configs(void)
Definition: res_parking.c:916

References disable_marked_lots(), and generate_or_link_lots_to_configs().

◆ load_module()

static int load_module ( void  )
static

Definition at line 1208 of file res_parking.c.

1209{
1213 NULL);
1214 if (!parking_lot_container) {
1215 goto error;
1216 }
1217
1218 if (aco_info_init(&cfg_info)) {
1219 goto error;
1220 }
1221
1222 /* Global options */
1223 aco_option_register(&cfg_info, "parkeddynamic", ACO_EXACT, global_options, "no", OPT_BOOL_T, 1, FLDSET(struct parking_global_config, parkeddynamic));
1224
1225 /* Register the per parking lot options. */
1226 aco_option_register(&cfg_info, "parkext", ACO_EXACT, parking_lot_types, "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct parking_lot_cfg, parkext));
1227 aco_option_register(&cfg_info, "context", ACO_EXACT, parking_lot_types, "parkedcalls", OPT_STRINGFIELD_T, 0, STRFLDSET(struct parking_lot_cfg, parking_con));
1228 aco_option_register(&cfg_info, "parkingtime", ACO_EXACT, parking_lot_types, "45", OPT_UINT_T, 0, FLDSET(struct parking_lot_cfg, parkingtime));
1229 aco_option_register(&cfg_info, "comebacktoorigin", ACO_EXACT, parking_lot_types, "yes", OPT_BOOL_T, 1, FLDSET(struct parking_lot_cfg, comebacktoorigin));
1230 aco_option_register(&cfg_info, "comebackcontext", ACO_EXACT, parking_lot_types, "parkedcallstimeout", OPT_STRINGFIELD_T, 0, STRFLDSET(struct parking_lot_cfg, comebackcontext));
1231 aco_option_register(&cfg_info, "comebackdialtime", ACO_EXACT, parking_lot_types, "30", OPT_UINT_T, 0, FLDSET(struct parking_lot_cfg, comebackdialtime));
1232 aco_option_register(&cfg_info, "parkedmusicclass", ACO_EXACT, parking_lot_types, "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct parking_lot_cfg, mohclass));
1233 aco_option_register(&cfg_info, "parkext_exclusive", ACO_EXACT, parking_lot_types, "no", OPT_BOOL_T, 1, FLDSET(struct parking_lot_cfg, parkext_exclusive));
1234 aco_option_register(&cfg_info, "parkinghints", ACO_EXACT, parking_lot_types, "no", OPT_BOOL_T, 1, FLDSET(struct parking_lot_cfg, parkaddhints));
1235 aco_option_register(&cfg_info, "courtesytone", ACO_EXACT, parking_lot_types, "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct parking_lot_cfg, courtesytone));
1236
1237 /* More complicated parking lot options that require special handling */
1245
1246 if (aco_process_config(&cfg_info, 0) == ACO_PROCESS_ERROR) {
1247 goto error;
1248 }
1249
1251 goto error;
1252 }
1253
1254 if (load_parking_ui()) {
1255 goto error;
1256 }
1257
1258 if (load_parking_manager()) {
1259 goto error;
1260 }
1261
1263 goto error;
1264 }
1265
1266 if (load_parking_devstate()) {
1267 goto error;
1268 }
1269
1270 if (load_parking_tests()) {
1271 goto error;
1272 }
1273
1275
1276error:
1277 unload_module();
1279}
@ 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:565
struct aco_type * global_options[]
Definition: res_parking.c:293
struct aco_type * parking_lot_types[]
Definition: res_parking.c:305
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:526
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:505
static int parking_lot_sort_fn(const void *obj_left, const void *obj_right, int flags)
Definition: res_parking.c:244
static int unload_module(void)
Definition: res_parking.c:1191
@ 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 1144 of file res_parking.c.

1145{
1146 struct ao2_iterator iter;
1147 struct parking_lot *lot;
1148
1149 for (iter = ao2_iterator_init(parking_lot_container, 0); (lot = ao2_iterator_next(&iter)); ao2_ref(lot, -1)) {
1150 lot->disable_mark = 1;
1151 }
1152
1153 ao2_iterator_destroy(&iter);
1154}

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 497 of file res_parking.c.

498{
499 return ao2_find(container, name, OBJ_KEY);
500}
#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:501

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 526 of file res_parking.c.

527{
528 struct parking_lot_cfg *lot_cfg = obj;
529
530 if (!strcmp(var->value, "first")) {
531 lot_cfg->parkfindnext = 0;
532 } else if (!strcmp(var->value, "next")) {
533 lot_cfg->parkfindnext = 1;
534 } else {
535 ast_log(LOG_WARNING, "value '%s' is not valid for findslot option.\n", var->value);
536 return -1;
537 }
538
539 return 0;
540}
#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 565 of file res_parking.c.

566{
567 struct parking_lot_cfg *cfg = obj;
569 int *parameter = NULL;
570
571 switch (option) {
572 case OPT_PARKEDPLAY:
573 parameter = &cfg->parkedplay;
574 break;
576 parameter = &cfg->parkedcalltransfers;
577 break;
579 parameter = &cfg->parkedcallreparking;
580 break;
581 case OPT_PARKEDHANGUP:
582 parameter = &cfg->parkedcallhangup;
583 break;
585 parameter = &cfg->parkedcallrecording;
586 break;
587 }
588
589 ast_assert(parameter != NULL);
590 if (!parameter || parking_feature_flag_cfg(parameter, var->value)) {
591 return -1;
592 }
593
594 return 0;
595}
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:545
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 505 of file res_parking.c.

506{
507 struct parking_lot_cfg *lot_cfg = obj;
508 int low;
509 int high;
510
511 if (sscanf(var->value, "%30d-%30d", &low, &high) != 2) {
512 ast_log(LOG_WARNING, "Format for parking positions is a-b, where a and b are numbers\n");
513 } else if (high < low || low <= 0 || high <= 0) {
514 ast_log(LOG_WARNING, "Format for parking positions is a-b, where a <= b\n");
515 } else {
516 lot_cfg->parking_start = low;
517 lot_cfg->parking_stop = high;
518 return 0;
519 }
520 return -1;
521}

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 435 of file res_parking.c.

436{
437 int *search_space = arg;
438 struct parked_user *user = obj;
439 int object_space = user->parking_space;
440
441 if (*search_space == object_space) {
442 return CMP_MATCH;
443 }
444 return 0;
445}
@ 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 447 of file res_parking.c.

448{
449 const struct parked_user *left = obj_left;
450 const struct parked_user *right = obj_right;
451
452 return left->parking_space - right->parking_space;
453}
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 714 of file res_parking.c.

716{
717 char *data_duplicate = ast_strdup(data);
718
719 if (!data_duplicate) {
720 return -1;
721 }
722
724 application, data_duplicate, ast_free_ptr, registrar, NULL, 0)) {
725 return -1;
726 }
727
728 return 0;
729}
#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:888
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:7266
static char * registrar
Definition: pbx_ael.c:78

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 377 of file res_parking.c.

378{
379 RAII_VAR(struct parking_config *, cfg, NULL, ao2_cleanup);
380
381 if (!(cfg = ao2_alloc(sizeof(*cfg), parking_config_destructor))) {
382 return NULL;
383 }
384
385 cfg->parking_lots = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, 37,
387 if (!cfg->parking_lots) {
388 return NULL;
389 }
390
391 if (!(cfg->global = ao2_alloc(sizeof(*cfg->global), parking_global_config_destructor))) {
392 return NULL;
393 }
394
395 /* Bump the ref count since RAII_VAR is going to eat one */
396 ao2_ref(cfg, +1);
397 return cfg;
398}
#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:363
static void parking_global_config_destructor(void *obj)
destructor for parking_global_config
Definition: res_parking.c:371
static int parking_lot_cfg_cmp_fn(void *obj, void *arg, const int flags)
Definition: res_parking.c:338
static int parking_lot_cfg_hash_fn(const void *obj, const int flags)
Definition: res_parking.c:320

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 363 of file res_parking.c.

364{
365 struct parking_config *cfg = obj;
367 ao2_cleanup(cfg->global);
368}
struct parking_global_config * global
Definition: res_parking.c:281

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 1060 of file res_parking.c.

1060 {
1061 return create_dynamic_lot_full(name, chan, 0);
1062}
static struct parking_lot * create_dynamic_lot_full(const char *name, struct ast_channel *chan, int forced)
Definition: res_parking.c:971

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 929 of file res_parking.c.

930{
932
933 if (!cfg) {
934 return 0;
935 }
936
937 return cfg->global->parkeddynamic;
938}

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 545 of file res_parking.c.

546{
547 if (ast_false(var)) {
548 *param = 0;
549 } else if (!strcasecmp(var, "both")) {
551 } else if (!strcasecmp(var, "caller")) {
553 } else if (!strcasecmp(var, "callee")) {
555 } else {
556 return -1;
557 }
558
559 return 0;
560}
@ 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 371 of file res_parking.c.

372{
373 /* For now, do nothing. */
374}

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 869 of file res_parking.c.

870{
871 struct parking_lot *lot;
872 struct parking_lot_cfg *replaced_cfg = NULL;
873 int found = 0;
874
875 /* Start by trying to find it. If that works we can skip the rest. */
877 if (!lot) {
878 lot = alloc_new_parking_lot(lot_cfg);
879
880 /* If we still don't have a lot, we failed to alloc one. */
881 if (!lot) {
882 return NULL;
883 }
884 } else {
885 found = 1;
886
887 if (dynamic) {
888 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);
889 ao2_cleanup(lot);
890 return NULL;
891 }
892 }
893
894 /* Set the configuration reference. Unref the one currently in the lot if it's there. */
895 if (lot->cfg) {
896 replaced_cfg = lot->cfg;
897 }
898
899 ao2_ref(lot_cfg, +1);
900 lot->cfg = lot_cfg;
901
902 ao2_cleanup(replaced_cfg);
903
904 /* Set the operating mode to normal since the parking lot has a configuration. */
905 lot->disable_mark = 0;
906 lot->mode = dynamic ? PARKINGLOT_DYNAMIC : PARKINGLOT_NORMAL;
907
908 if (!found) {
909 /* Link after configuration is set since a lot without configuration will cause all kinds of trouble. */
911 };
912
913 return lot;
914}
#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:638
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:497
@ 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 461 of file res_parking.c.

462{
463 struct parking_lot_cfg *lot_cfg;
464
465 lot_cfg = ao2_alloc(sizeof(*lot_cfg), parking_lot_cfg_destructor);
466 if (!lot_cfg) {
467 return NULL;
468 }
469
470 if (ast_string_field_init(lot_cfg, 32)) {
471 ao2_cleanup(lot_cfg);
472 return NULL;
473 }
474
475 ast_string_field_set(lot_cfg, name, cat);
476
477 return lot_cfg;
478}
static void parking_lot_cfg_destructor(void *obj)
Destroy a parking lot cfg object.
Definition: res_parking.c:427

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 338 of file res_parking.c.

339{
340 struct parking_lot_cfg *entry1 = obj;
341
342 char *key;
343 size_t key_size;
344 struct parking_lot_cfg *entry2;
345
346 switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
347 case OBJ_KEY:
348 key = arg;
349 return (!strcmp(entry1->name, key)) ? CMP_MATCH : 0;
350 case OBJ_PARTIAL_KEY:
351 key = arg;
352 key_size = strlen(key);
353 return (!strncmp(entry1->name, key, key_size)) ? CMP_MATCH : 0;
354 case OBJ_POINTER:
355 entry2 = arg;
356 return (!strcmp(entry1->name, entry2->name)) ? CMP_MATCH : 0;
357 default:
358 return CMP_STOP;
359 }
360}
@ 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 759 of file res_parking.c.

760{
761 int parkingspace;
762 struct ast_exten *existing_exten;
763 struct ast_context *lot_context;
764 struct pbx_find_info find_info = { .stacklen = 0 }; /* the rest is reset in pbx_find_extension */
765 const char *parkext_registrar_pointer; /* Used for park extension */
766 const char *parkedcall_registrar_pointer; /* Used for parkedcall extensions/hints */
767
768 if (ast_strlen_zero(lot_cfg->parkext)) {
769 return 0;
770 }
771
772 ast_string_field_build(lot_cfg, registrar, "%s/%s", BASE_REGISTRAR, lot_cfg->name);
773 parkedcall_registrar_pointer = lot_cfg->registrar;
774
775 if (lot_cfg->parkext_exclusive) {
776 parkext_registrar_pointer = lot_cfg->registrar;
777 } else {
778 parkext_registrar_pointer = BASE_REGISTRAR;
779 }
780
781 /* We need the contexts list locked to safely be able to both read and lock the specific context within */
783
784 if (!(lot_context = ast_context_find_or_create(NULL, NULL, lot_cfg->parking_con, parkext_registrar_pointer))) {
785 ast_log(LOG_ERROR, "Parking lot '%s' -- Needs a context '%s' which does not exist and Asterisk was unable to create\n",
786 lot_cfg->name, lot_cfg->parking_con);
788 return -1;
789 }
790
791 /* Once we know what context we will be modifying, we need to write lock it because we will be reading extensions
792 * and we don't want something else to destroy them while we are looking at them.
793 */
794 ast_wrlock_context(lot_context);
795
797
798 /* Handle generation/confirmation for the Park extension */
799 if ((existing_exten = pbx_find_extension(NULL, NULL, &find_info, lot_cfg->parking_con, lot_cfg->parkext, 1, NULL, NULL, E_MATCH))) {
800 if (lot_cfg->parkext_exclusive || !extension_is_compatible(lot_cfg, PARK_APPLICATION, existing_exten)) {
801 ast_unlock_context(lot_context);
802 return -1;
803 }
804 } else if (parking_add_extension(lot_context, 0, lot_cfg->parkext, 1, PARK_APPLICATION,
805 lot_cfg->parkext_exclusive ? lot_cfg->name : "", parkext_registrar_pointer)) {
806 ast_log(LOG_ERROR, "Parking lot '%s' -- Failed to add %s extension '%s@%s' to the PBX.\n",
807 lot_cfg->name, PARK_APPLICATION, lot_cfg->parkext, lot_cfg->parking_con);
808 ast_unlock_context(lot_context);
809 return -1;
810 }
811
812 /* Handle generation/confirmation for the ParkedCall extensions and hints */
813 for (parkingspace = lot_cfg->parking_start; parkingspace <= lot_cfg->parking_stop; parkingspace++) {
814 char space[AST_MAX_EXTENSION];
815 RAII_VAR(struct ast_str *, arguments_string, NULL, ast_free);
816 find_info.stacklen = 0; /* reset for pbx_find_exten */
817
818 snprintf(space, sizeof(space), "%d", parkingspace);
819
820 /* Unlike the Park extensions, ParkedCall extensions and their hints may never be shared for any reason. */
821 if ((existing_exten = pbx_find_extension(NULL, NULL, &find_info, lot_cfg->parking_con, space, 1, NULL, NULL, E_MATCH))) {
822 ast_unlock_context(lot_context);
823 return -1;
824 }
825
826 arguments_string = ast_str_create(32);
827 if (!arguments_string) {
828 ast_unlock_context(lot_context);
829 return -1;
830 }
831
832 ast_str_set(&arguments_string, 0, "%s,%s", lot_cfg->name, space);
833 if (parking_add_extension(lot_context, 0, space, 1, PARKED_CALL_APPLICATION,
834 ast_str_buffer(arguments_string), parkedcall_registrar_pointer)) {
835 ast_log(LOG_ERROR, "Parking lot '%s' -- Failed to add %s extension '%s@%s' to the PBX.\n",
836 lot_cfg->name, PARKED_CALL_APPLICATION, space, lot_cfg->parking_con);
837 ast_unlock_context(lot_context);
838 return -1;
839 }
840
841 find_info.stacklen = 0; /* reset for pbx_find_exten */
842
843 if (lot_cfg->parkaddhints) {
844 char hint_device[AST_MAX_EXTENSION];
845
846 snprintf(hint_device, sizeof(hint_device), "park:%s@%s", space, lot_cfg->parking_con);
847
848 if ((existing_exten = pbx_find_extension(NULL, NULL, &find_info, lot_cfg->parking_con, space, PRIORITY_HINT, NULL, NULL, E_MATCH))) {
849 ast_log(LOG_ERROR, "Parking lot '%s' -- Needs to add a hint '%s' at '%s@%s' but one already exists owned by %s\n",
850 lot_cfg->name, hint_device, space, lot_cfg->parking_con, ast_get_extension_registrar(existing_exten));
851 ast_unlock_context(lot_context);
852 return -1;
853 }
854
855 if (parking_add_extension(lot_context, 0, space, PRIORITY_HINT, hint_device, "", parkedcall_registrar_pointer)) {
856 ast_log(LOG_ERROR, "Parking lot '%s' -- Failed to add hint '%s@%s' to the PBX.\n",
857 lot_cfg->name, space, lot_cfg->parking_con);
858 ast_unlock_context(lot_context);
859 return -1;
860 }
861 }
862 }
863
864 ast_unlock_context(lot_context);
865
866 return 0;
867}
#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:8463
int ast_wrlock_context(struct ast_context *con)
Write locks a given context.
Definition: pbx.c:8481
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:6149
int ast_unlock_context(struct ast_context *con)
Definition: pbx.c:8491
#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:8473
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:714
static int extension_is_compatible(struct parking_lot_cfg *lot_cfg, const char *app_type, struct ast_exten *extension)
Definition: res_parking.c:731
#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:284
ast_exten: An extension The dialplan is saved as a linked list with each context having it's own link...
Definition: pbx.c:237
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 427 of file res_parking.c.

428{
429 struct parking_lot_cfg *lot_cfg = obj;
432}
void parking_lot_cfg_remove_extensions(struct parking_lot_cfg *lot_cfg)
Remove extensions belonging to a parking lot configuration.
Definition: res_parking.c:664
#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 320 of file res_parking.c.

321{
322 const struct parking_lot_cfg *entry;
323 const char *key;
324
325 switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
326 case OBJ_KEY:
327 key = obj;
328 return ast_str_hash(key);
329 case OBJ_PARTIAL_KEY:
330 ast_assert(0);
331 return 0;
332 default:
333 entry = obj;
334 return ast_str_hash(entry->name);
335 }
336}
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
Definition: strings.h:1259
Definition: search.h:40

References ast_assert, ast_str_hash(), 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 664 of file res_parking.c.

665{
666 if (!ast_strlen_zero(lot_cfg->registrar)) {
667 /* Although the function is called ast_context_destroy, the use of this funtion is
668 * intended only to remove extensions, hints, etc registered by the parking lot's registrar.
669 * It won't actually destroy the context unless that context is empty afterwards and it is
670 * unreferenced.
671 */
673 }
674
675 /* If we come back for a second pass, someone else has this registrar now. */
676 ast_string_field_set(lot_cfg, registrar, "");
677}
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:8221

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 626 of file res_parking.c.

627{
628 struct parking_lot *lot = obj;
629
630 if (lot->parking_bridge) {
632 }
634 ao2_cleanup(lot->cfg);
636}
int ast_bridge_destroy(struct ast_bridge *bridge, int cause)
Destroy a bridge.
Definition: bridge.c:944
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 414 of file res_parking.c.

415{
416 /* If a dynamic lot wasn't removed, we need to restore it to full functionality afterwards. */
417 int was_dynamic = (lot->mode == PARKINGLOT_DYNAMIC);
418
420 if (parking_lot_remove_if_unused(lot) && was_dynamic) {
422 lot->disable_mark = 0;
423 }
424}
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:400
@ 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 602 of file res_parking.c.

603{
604 struct parking_lot *lot = named_item_find(parking_lot_container, lot_name);
605 return lot;
606}

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 400 of file res_parking.c.

401{
402 if (lot->mode != PARKINGLOT_DISABLED) {
403 return -1;
404 }
405
408 return 0;
409 }
410
411 return -1;
412}
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 244 of file res_parking.c.

245{
246 const struct parking_lot *left = obj_left;
247 const struct parking_lot *right = obj_right;
248 const char *right_key = obj_right;
249 int cmp;
250
251 switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
252 default:
253 case OBJ_POINTER:
254 right_key = right->name;
255 /* Fall through */
256 case OBJ_KEY:
257 cmp = strcmp(left->name, right_key);
258 break;
259 case OBJ_PARTIAL_KEY:
260 cmp = strncmp(left->name, right_key, strlen(right_key));
261 }
262 return cmp;
263}
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 1281 of file res_parking.c.

1282{
1283 if (aco_process_config(&cfg_info, 1) == ACO_PROCESS_ERROR) {
1285 }
1286
1287 return 0;
1288}

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 679 of file res_parking.c.

680{
682 struct parking_lot_cfg *lot_cfg;
683 struct ao2_iterator iter;
684
685 if (!cfg) {
686 return;
687 }
688
689 for (iter = ao2_iterator_init(cfg->parking_lots, 0); (lot_cfg = ao2_iterator_next(&iter)); ao2_ref(lot_cfg, -1)) {
691 }
692
694
696}

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 1096 of file res_parking.c.

1097{
1098 struct parking_lot_cfg *lot_cfg;
1099 struct ao2_iterator iter;
1100
1101 for (iter = ao2_iterator_init(cfg_pending->parking_lots, 0); (lot_cfg = ao2_iterator_next(&iter)); ao2_ref(lot_cfg, -1)) {
1103 }
1104
1105 ao2_iterator_destroy(&iter);
1106
1108
1109}

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 1191 of file res_parking.c.

1192{
1202 aco_info_destroy(&cfg_info);
1204
1205 return 0;
1206}
#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 1072 of file res_parking.c.

1073{
1074 struct parking_config *cfg = aco_pending_config(&cfg_info);
1075 RAII_VAR(struct parking_lot_cfg *, lot_cfg, NULL, ao2_cleanup);
1076
1077 if (!cfg) {
1078 return 0;
1079 }
1080
1082 if (!lot_cfg) {
1084 if (!lot_cfg) {
1085 return -1;
1086 }
1087 ast_log(AST_LOG_NOTICE, "Adding %s profile to res_parking\n", DEFAULT_PARKING_LOT);
1090 ao2_link(cfg->parking_lots, lot_cfg);
1091 }
1092
1093 return 0;
1094}
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:295
#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 1296 of file res_parking.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 1296 of file res_parking.c.

◆ global_option

struct aco_type global_option
static

Definition at line 285 of file res_parking.c.

◆ global_options

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

Definition at line 293 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:285

Definition at line 307 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 266 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 295 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 305 of file res_parking.c.

Referenced by load_module().