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 | Macros | Typedefs | Enumerations | Functions
include/asterisk/config.h File Reference

Configuration File Parser. More...

#include "asterisk/utils.h"
#include "asterisk/inline_api.h"
Include dependency graph for include/asterisk/config.h:

Go to the source code of this file.

Data Structures

struct  ast_config_engine
 Configuration engine structure, used to define realtime drivers. More...
 
struct  ast_variable
 Structure for variables, used for configurations and for channel variables. More...
 

Macros

#define ast_category_new_anonymous()   ast_category_new_dynamic("")
 Create a nameless category that is not backed by a file. More...
 
#define ast_category_new_dynamic(name)   ast_category_new(name, "", -1)
 Create a category that is not backed by a file. More...
 
#define ast_config_load(filename, flags)   ast_config_load2(filename, AST_MODULE, flags)
 Load a config file. More...
 
#define ast_variable_list_append(head, new_var)   ast_variable_list_append_hint(head, NULL, new_var)
 
#define ast_variable_new(name, value, filename)   _ast_variable_new(name, value, filename, __FILE__, __PRETTY_FUNCTION__, __LINE__)
 
#define CONFIG_STATUS_FILEINVALID   (void *)-2
 
#define CONFIG_STATUS_FILEMISSING   (void *)0
 
#define CONFIG_STATUS_FILEUNCHANGED   (void *)-1
 
#define CV_BOOL(__x, __dst)   CV_F(__x, (__dst) = ast_true(__val) )
 helper macros to assign the value to a BOOL, UINT, static string and dynamic string More...
 
#define CV_DSTR(__x, __dst)   CV_F(__x, ast_free(__dst); __dst = ast_strdup(__val))
 
#define CV_END   } while (0)
 close a variable parsing block More...
 
#define CV_F(__pattern, __body)   if (!strcasecmp((__var), __pattern)) { __body; break; }
 call a generic function if the name matches. More...
 
#define CV_START(__in_var, __in_val)
 the macro to open a block for variable parsing More...
 
#define CV_STR(__x, __dst)   CV_F(__x, ast_copy_string(__dst, __val, sizeof(__dst)))
 
#define CV_STRFIELD(__x, __obj, __field)   CV_F(__x, ast_string_field_set(__obj, __field, __val))
 
#define CV_UINT(__x, __dst)   CV_F(__x, (__dst) = strtoul(__val, NULL, 0) )
 

Typedefs

typedef int(* config_hook_cb) (struct ast_config *cfg)
 Callback when configuration is updated. More...
 
typedef struct ast_configconfig_load_func(const char *database, const char *table, const char *configfile, struct ast_config *config, struct ast_flags flags, const char *suggested_include_file, const char *who_asked)
 
typedef int realtime_destroy(const char *database, const char *table, const char *keyfield, const char *entity, const struct ast_variable *fields)
 
typedef struct ast_configrealtime_multi_get(const char *database, const char *table, const struct ast_variable *fields)
 
typedef int realtime_require(const char *database, const char *table, va_list ap)
 Function pointer called to ensure database schema is properly configured for realtime use. More...
 
typedef int realtime_store(const char *database, const char *table, const struct ast_variable *fields)
 
typedef int realtime_unload(const char *database, const char *table)
 Function pointer called to clear the database cache and free resources used for such. More...
 
typedef int realtime_update(const char *database, const char *table, const char *keyfield, const char *entity, const struct ast_variable *fields)
 
typedef int realtime_update2(const char *database, const char *table, const struct ast_variable *lookup_fields, const struct ast_variable *update_fields)
 
typedef struct ast_variablerealtime_var_get(const char *database, const char *table, const struct ast_variable *fields)
 

Enumerations

enum  { CONFIG_FLAG_WITHCOMMENTS = (1 << 0) , CONFIG_FLAG_FILEUNCHANGED = (1 << 1) , CONFIG_FLAG_NOCACHE = (1 << 2) , CONFIG_FLAG_NOREALTIME = (1 << 3) }
 
enum  ast_parse_flags {
  PARSE_TYPE = 0x000f , PARSE_INT32 = 0x0001 , PARSE_UINT32 = 0x0002 , PARSE_DOUBLE = 0x0003 ,
  PARSE_TIMELEN = 0x0006 , PARSE_ADDR = 0x000e , PARSE_INADDR = 0x000f , PARSE_DEFAULT = 0x0010 ,
  PARSE_IN_RANGE = 0x0020 , PARSE_OUT_RANGE = 0x0040 , PARSE_RANGE_DEFAULTS = 0x0080 , PARSE_PORT_MASK = 0x0300 ,
  PARSE_PORT_IGNORE = 0x0100 , PARSE_PORT_REQUIRE = 0x0200 , PARSE_PORT_FORBID = 0x0300
}
 Support code to parse config file arguments. More...
 
enum  config_hook_flags { butt }
 Flags that affect the behaviour of config hooks. More...
 
enum  config_save_flags { CONFIG_SAVE_FLAG_NONE = (0) , CONFIG_SAVE_FLAG_PRESERVE_EFFECTIVE_CONTEXT = (1 << 0) }
 
enum  require_type {
  RQ_INTEGER1 , RQ_UINTEGER1 , RQ_INTEGER2 , RQ_UINTEGER2 ,
  RQ_INTEGER3 , RQ_UINTEGER3 , RQ_INTEGER4 , RQ_UINTEGER4 ,
  RQ_INTEGER8 , RQ_UINTEGER8 , RQ_CHAR , RQ_FLOAT ,
  RQ_DATE , RQ_DATETIME
}
 Types used in ast_realtime_require_field. More...
 

Functions

struct ast_variable_ast_variable_new (const char *name, const char *value, const char *filename, const char *file, const char *function, int lineno)
 
void ast_category_append (struct ast_config *config, struct ast_category *category)
 Appends a category to a config. More...
 
char * ast_category_browse (struct ast_config *config, const char *prev_name)
 Browse categories. More...
 
struct ast_categoryast_category_browse_filtered (struct ast_config *config, const char *category_name, struct ast_category *prev, const char *filter)
 Browse categories with filters. More...
 
struct ast_categoryast_category_delete (struct ast_config *cfg, struct ast_category *cat)
 Delete a category. More...
 
void ast_category_destroy (struct ast_category *cat)
 
struct ast_variableast_category_detach_variables (struct ast_category *cat)
 
int ast_category_empty (struct ast_category *category)
 Removes and destroys all variables in a category. More...
 
int ast_category_exist (const struct ast_config *config, const char *category_name, const char *filter)
 Check for category duplicates. More...
 
struct ast_variableast_category_first (struct ast_category *cat)
 given a pointer to a category, return the root variable. More...
 
struct ast_categoryast_category_get (const struct ast_config *config, const char *category_name, const char *filter)
 Retrieve a category if it exists. More...
 
const char * ast_category_get_name (const struct ast_category *category)
 Return the name of the category. More...
 
struct ast_strast_category_get_templates (const struct ast_category *category)
 Return the template names this category inherits from. More...
 
int ast_category_inherit (struct ast_category *existing, const struct ast_category *base)
 Applies base (template) to category. More...
 
int ast_category_insert (struct ast_config *config, struct ast_category *cat, const char *match)
 Inserts new category. More...
 
int ast_category_is_template (const struct ast_category *category)
 Check if category is a template. More...
 
struct ast_categoryast_category_new (const char *name, const char *in_file, int lineno)
 Create a category. More...
 
struct ast_categoryast_category_new_template (const char *name, const char *in_file, int lineno)
 Create a category making it a template. More...
 
void ast_category_rename (struct ast_category *cat, const char *name)
 
struct ast_variableast_category_root (struct ast_config *config, char *cat)
 returns the root ast_variable of a config More...
 
int ast_check_realtime (const char *family)
 Check if realtime engine is configured for family. More...
 
struct ast_configast_config_copy (const struct ast_config *orig)
 Copies the contents of one ast_config into another. More...
 
void ast_config_destroy (struct ast_config *cfg)
 Destroys a config. More...
 
int ast_config_engine_deregister (struct ast_config_engine *del)
 Deregister config engine. More...
 
int ast_config_engine_register (struct ast_config_engine *newconfig)
 Register config engine. More...
 
struct ast_categoryast_config_get_current_category (const struct ast_config *cfg)
 Retrieve the current category name being built. More...
 
int ast_config_hook_register (const char *name, const char *filename, const char *module, enum config_hook_flags flags, config_hook_cb hook)
 Register a config hook for a particular file and module. More...
 
void ast_config_hook_unregister (const char *name)
 Unregister a config hook. More...
 
struct ast_configast_config_internal_load (const char *configfile, struct ast_config *cfg, struct ast_flags flags, const char *suggested_incl_file, const char *who_asked)
 
struct ast_configast_config_load2 (const char *filename, const char *who_asked, struct ast_flags flags)
 Load a config file. More...
 
struct ast_configast_config_new (void)
 Create a new base configuration structure. More...
 
const char * ast_config_option (struct ast_config *cfg, const char *cat, const char *var)
 Retrieve a configuration variable within the configuration set. More...
 
void ast_config_set_current_category (struct ast_config *cfg, const struct ast_category *cat)
 Set the category within the configuration as being current. More...
 
void ast_config_sort_categories (struct ast_config *config, int descending, int(*comparator)(struct ast_category *p, struct ast_category *q))
 Sorts categories in a config in the order of a numerical value contained within them. More...
 
int ast_config_text_file_save (const char *filename, const struct ast_config *cfg, const char *generator)
 Save a config text file preserving the pre 13.2 behavior. More...
 
int ast_config_text_file_save2 (const char *filename, const struct ast_config *cfg, const char *generator, uint32_t flags)
 Save a config text file. More...
 
int ast_destroy_realtime (const char *family, const char *keyfield, const char *lookup,...) attribute_sentinel
 Destroy realtime configuration. More...
 
int ast_destroy_realtime_fields (const char *family, const char *keyfield, const char *lookup, const struct ast_variable *fields)
 Destroy realtime configuration. More...
 
struct ast_config_includeast_include_find (struct ast_config *conf, const char *included_file)
 
struct ast_config_includeast_include_new (struct ast_config *conf, const char *from_file, const char *included_file, int include_type, const char *exec_file, int from_lineno, char *real_included_file_name, int real_included_file_name_size)
 
void ast_include_rename (struct ast_config *conf, const char *from_file, const char *to_file)
 
struct ast_variableast_load_realtime (const char *family,...) attribute_sentinel
 
struct ast_variableast_load_realtime_all (const char *family,...) attribute_sentinel
 
struct ast_variableast_load_realtime_all_fields (const char *family, const struct ast_variable *fields)
 
struct ast_variableast_load_realtime_fields (const char *family, const struct ast_variable *fields)
 Retrieve realtime configuration. More...
 
struct ast_configast_load_realtime_multientry (const char *family,...) attribute_sentinel
 Retrieve realtime configuration. More...
 
struct ast_configast_load_realtime_multientry_fields (const char *family, const struct ast_variable *fields)
 Retrieve realtime configuration. More...
 
int ast_parse_arg (const char *arg, enum ast_parse_flags flags, void *p_result,...)
 The argument parsing routine. More...
 
char * ast_realtime_decode_chunk (char *chunk)
 Remove standard encoding from realtime values, which ensures that a semicolon embedded within a single value is not treated upon retrieval as multiple values. More...
 
int ast_realtime_enabled (void)
 Check if there's any realtime engines loaded. More...
 
char * ast_realtime_encode_chunk (struct ast_str **dest, ssize_t maxlen, const char *chunk)
 Encodes a chunk of data for realtime. More...
 
int ast_realtime_is_mapping_defined (const char *family)
 Determine if a mapping exists for a given family. More...
 
int ast_realtime_require_field (const char *family,...) attribute_sentinel
 Inform realtime what fields that may be stored. More...
 
int ast_rq_is_int (require_type type)
 Check if require type is an integer type. More...
 
int ast_store_realtime (const char *family,...) attribute_sentinel
 Create realtime configuration. More...
 
int ast_store_realtime_fields (const char *family, const struct ast_variable *fields)
 Create realtime configuration. More...
 
int ast_unload_realtime (const char *family)
 Release any resources cached for a realtime family. More...
 
int ast_update2_realtime (const char *family,...) attribute_sentinel
 Update realtime configuration. More...
 
int ast_update2_realtime_fields (const char *family, const struct ast_variable *lookup_fields, const struct ast_variable *update_fields)
 Update realtime configuration. More...
 
int ast_update_realtime (const char *family, const char *keyfield, const char *lookup,...) attribute_sentinel
 Update realtime configuration. More...
 
int ast_update_realtime_fields (const char *family, const char *keyfield, const char *lookup, const struct ast_variable *fields)
 Update realtime configuration. More...
 
void ast_variable_append (struct ast_category *category, struct ast_variable *variable)
 
struct ast_variableast_variable_browse (const struct ast_config *config, const char *category_name)
 
struct ast_variableast_variable_browse_filtered (const struct ast_config *config, const char *category_name, const char *filter)
 Browse variables. More...
 
int ast_variable_delete (struct ast_category *category, const char *variable, const char *match, const char *line)
 
const char * ast_variable_find (const struct ast_category *category, const char *variable)
 Gets a variable value from a specific category structure by name. More...
 
const char * ast_variable_find_in_list (const struct ast_variable *list, const char *variable)
 Gets the value of a variable from a variable list by name. More...
 
const char * ast_variable_find_last_in_list (const struct ast_variable *list, const char *variable)
 Gets the value of the LAST occurrence of a variable from a variable list. More...
 
const struct ast_variableast_variable_find_variable_in_list (const struct ast_variable *list, const char *variable_name)
 Gets a variable from a variable list by name. More...
 
void ast_variable_insert (struct ast_category *category, struct ast_variable *variable, const char *line)
 
struct ast_variableast_variable_list_append_hint (struct ast_variable **head, struct ast_variable *search_hint, struct ast_variable *new_var)
 Appends a variable list to the end of another list. More...
 
struct ast_variableast_variable_list_from_quoted_string (const char *input, const char *item_separator, const char *name_value_separator, const char *quote_str)
 Parse a string into an ast_variable list. The reverse of ast_variable_list_join. More...
 
struct ast_variableast_variable_list_from_string (const char *input, const char *item_separator, const char *name_value_separator)
 Parse a string into an ast_variable list. The reverse of ast_variable_list_join. More...
 
struct ast_strast_variable_list_join (const struct ast_variable *head, const char *item_separator, const char *name_value_separator, const char *quote_char, struct ast_str **str)
 Join an ast_variable list with specified separators and quoted values. More...
 
int ast_variable_list_replace (struct ast_variable **head, struct ast_variable *replacement)
 Replace a variable in the given list with a new value. More...
 
int ast_variable_list_replace_variable (struct ast_variable **head, struct ast_variable *oldvar, struct ast_variable *newvar)
 Replace a variable in the given list with a new variable. More...
 
struct ast_variableast_variable_list_sort (struct ast_variable *head)
 Performs an in-place sort on the variable list by ascending name. More...
 
int ast_variable_lists_match (const struct ast_variable *left, const struct ast_variable *right, int exact_match)
 Tests 2 variable lists to see if they match. More...
 
const char * ast_variable_retrieve (struct ast_config *config, const char *category, const char *variable)
 
const char * ast_variable_retrieve_filtered (struct ast_config *config, const char *category, const char *variable, const char *filter)
 Gets a variable by context and variable names. More...
 
int ast_variable_update (struct ast_category *category, const char *variable, const char *value, const char *match, unsigned int object)
 Update variable value within a config. More...
 
void ast_variables_destroy (struct ast_variable *var)
 Free variable list. More...
 
struct ast_variableast_variables_dup (struct ast_variable *var)
 Duplicate variable list. More...
 
int ast_variables_match (const struct ast_variable *left, const struct ast_variable *right)
 Tests 2 variable values to see if they match. More...
 
struct ast_variableast_variables_reverse (struct ast_variable *var)
 Reverse a variable list. More...
 
int register_config_cli (void)
 Exposed initialization method for core process. More...
 

Detailed Description

Configuration File Parser.

Definition in file include/asterisk/config.h.

Macro Definition Documentation

◆ ast_category_new_anonymous

#define ast_category_new_anonymous ( )    ast_category_new_dynamic("")

Create a nameless category that is not backed by a file.

Definition at line 838 of file include/asterisk/config.h.

◆ ast_category_new_dynamic

#define ast_category_new_dynamic (   name)    ast_category_new(name, "", -1)

Create a category that is not backed by a file.

Parameters
namename of new category

Definition at line 833 of file include/asterisk/config.h.

◆ ast_config_load

#define ast_config_load (   filename,
  flags 
)    ast_config_load2(filename, AST_MODULE, flags)

Load a config file.

Parameters
filenamepath of file to open. If no preceding '/' character, path is considered relative to AST_CONFIG_DIR
flagsOptional flags: CONFIG_FLAG_WITHCOMMENTS - load the file with comments intact; CONFIG_FLAG_FILEUNCHANGED - check the file mtime and return CONFIG_STATUS_FILEUNCHANGED if the mtime is the same; or CONFIG_FLAG_NOCACHE - don't cache file mtime (main purpose of this option is to save memory on temporary files).

Create a config structure from a given configuration file.

Returns
an ast_config data structure on success
Return values
NULLon error

Definition at line 179 of file include/asterisk/config.h.

◆ ast_variable_list_append

#define ast_variable_list_append (   head,
  new_var 
)    ast_variable_list_append_hint(head, NULL, new_var)

Definition at line 950 of file include/asterisk/config.h.

◆ ast_variable_new

#define ast_variable_new (   name,
  value,
  filename 
)    _ast_variable_new(name, value, filename, __FILE__, __PRETTY_FUNCTION__, __LINE__)

Definition at line 915 of file include/asterisk/config.h.

◆ CONFIG_STATUS_FILEINVALID

#define CONFIG_STATUS_FILEINVALID   (void *)-2

Definition at line 60 of file include/asterisk/config.h.

◆ CONFIG_STATUS_FILEMISSING

#define CONFIG_STATUS_FILEMISSING   (void *)0

Definition at line 58 of file include/asterisk/config.h.

◆ CONFIG_STATUS_FILEUNCHANGED

#define CONFIG_STATUS_FILEUNCHANGED   (void *)-1

Definition at line 59 of file include/asterisk/config.h.

◆ CV_BOOL

#define CV_BOOL (   __x,
  __dst 
)    CV_F(__x, (__dst) = ast_true(__val) )

helper macros to assign the value to a BOOL, UINT, static string and dynamic string

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

◆ CV_DSTR

#define CV_DSTR (   __x,
  __dst 
)    CV_F(__x, ast_free(__dst); __dst = ast_strdup(__val))

Definition at line 1296 of file include/asterisk/config.h.

◆ CV_END

#define CV_END   } while (0)

close a variable parsing block

Definition at line 1284 of file include/asterisk/config.h.

◆ CV_F

#define CV_F (   __pattern,
  __body 
)    if (!strcasecmp((__var), __pattern)) { __body; break; }

call a generic function if the name matches.

Definition at line 1287 of file include/asterisk/config.h.

◆ CV_START

#define CV_START (   __in_var,
  __in_val 
)
Value:
do { \
const char *__var = __in_var; \
const char *__val = __in_val;

the macro to open a block for variable parsing

Definition at line 1278 of file include/asterisk/config.h.

◆ CV_STR

#define CV_STR (   __x,
  __dst 
)    CV_F(__x, ast_copy_string(__dst, __val, sizeof(__dst)))

Definition at line 1295 of file include/asterisk/config.h.

◆ CV_STRFIELD

#define CV_STRFIELD (   __x,
  __obj,
  __field 
)    CV_F(__x, ast_string_field_set(__obj, __field, __val))

Definition at line 1297 of file include/asterisk/config.h.

◆ CV_UINT

#define CV_UINT (   __x,
  __dst 
)    CV_F(__x, (__dst) = strtoul(__val, NULL, 0) )

Definition at line 1294 of file include/asterisk/config.h.

Typedef Documentation

◆ config_hook_cb

typedef int(* config_hook_cb) (struct ast_config *cfg)

Callback when configuration is updated.

Parameters
cfgA copy of the configuration that is being changed. This MUST be freed by the callback before returning.

Definition at line 1114 of file include/asterisk/config.h.

◆ config_load_func

typedef struct ast_config * config_load_func(const char *database, const char *table, const char *configfile, struct ast_config *config, struct ast_flags flags, const char *suggested_include_file, const char *who_asked)

Definition at line 109 of file include/asterisk/config.h.

◆ realtime_destroy

typedef int realtime_destroy(const char *database, const char *table, const char *keyfield, const char *entity, const struct ast_variable *fields)

Definition at line 115 of file include/asterisk/config.h.

◆ realtime_multi_get

typedef struct ast_config * realtime_multi_get(const char *database, const char *table, const struct ast_variable *fields)

Definition at line 111 of file include/asterisk/config.h.

◆ realtime_require

typedef int realtime_require(const char *database, const char *table, va_list ap)

Function pointer called to ensure database schema is properly configured for realtime use.

Since
1.6.1

Definition at line 121 of file include/asterisk/config.h.

◆ realtime_store

typedef int realtime_store(const char *database, const char *table, const struct ast_variable *fields)

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

◆ realtime_unload

typedef int realtime_unload(const char *database, const char *table)

Function pointer called to clear the database cache and free resources used for such.

Since
1.6.1

Definition at line 127 of file include/asterisk/config.h.

◆ realtime_update

typedef int realtime_update(const char *database, const char *table, const char *keyfield, const char *entity, const struct ast_variable *fields)

Definition at line 112 of file include/asterisk/config.h.

◆ realtime_update2

typedef int realtime_update2(const char *database, const char *table, const struct ast_variable *lookup_fields, const struct ast_variable *update_fields)

Definition at line 113 of file include/asterisk/config.h.

◆ realtime_var_get

typedef struct ast_variable * realtime_var_get(const char *database, const char *table, const struct ast_variable *fields)

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

Enumeration Type Documentation

◆ anonymous enum

anonymous enum

Options for ast_config_load()

Enumerator
CONFIG_FLAG_WITHCOMMENTS 

Load the configuration, including comments

CONFIG_FLAG_FILEUNCHANGED 

On a reload, give us a -1 if the file hasn't changed.

CONFIG_FLAG_NOCACHE 

Don't attempt to cache mtime on this config file.

CONFIG_FLAG_NOREALTIME 

Don't attempt to load from realtime (typically called from a realtime driver dependency)

Definition at line 39 of file include/asterisk/config.h.

39 {
40 /*! Load the configuration, including comments */
41 CONFIG_FLAG_WITHCOMMENTS = (1 << 0),
42 /*! On a reload, give us a -1 if the file hasn't changed. */
44 /*! Don't attempt to cache mtime on this config file. */
45 CONFIG_FLAG_NOCACHE = (1 << 2),
46 /*! Don't attempt to load from realtime (typically called from a realtime driver dependency) */
47 CONFIG_FLAG_NOREALTIME = (1 << 3),
48};
@ CONFIG_FLAG_NOCACHE
@ CONFIG_FLAG_NOREALTIME
@ CONFIG_FLAG_WITHCOMMENTS
@ CONFIG_FLAG_FILEUNCHANGED

◆ ast_parse_flags

Support code to parse config file arguments.

The function ast_parse_arg() provides a generic interface to parse strings (e.g. numbers, network addresses and so on) in a flexible way, e.g. by doing proper error and bound checks, provide default values, and so on. The function (described later) takes a string as an argument, a set of flags to specify the result format and checks to perform, a pointer to the result, and optionally some additional arguments.

Returns
0 on success, != 0 otherwise.
Enumerator
PARSE_TYPE 
PARSE_INT32 
PARSE_UINT32 
PARSE_DOUBLE 
PARSE_TIMELEN 
PARSE_ADDR 
PARSE_INADDR 
PARSE_DEFAULT 
PARSE_IN_RANGE 
PARSE_OUT_RANGE 
PARSE_RANGE_DEFAULTS 
PARSE_PORT_MASK 
PARSE_PORT_IGNORE 
PARSE_PORT_REQUIRE 
PARSE_PORT_FORBID 

Definition at line 1159 of file include/asterisk/config.h.

1159 {
1160 /* low 4 bits of flags are used for the operand type */
1161 PARSE_TYPE = 0x000f,
1162 /* numeric types, with optional default value and bound checks.
1163 * Additional arguments are passed by value.
1164 */
1165 PARSE_INT32 = 0x0001,
1166 PARSE_UINT32 = 0x0002,
1167 PARSE_DOUBLE = 0x0003,
1168#if 0 /* not supported yet */
1169 PARSE_INT16 = 0x0004,
1170 PARSE_UINT16 = 0x0005,
1171#endif
1172
1173 /* Returns an int processed by ast_app_parse_timelen.
1174 * The first argument is an enum ast_timelen value (required).
1175 */
1176 PARSE_TIMELEN = 0x0006,
1177
1178 /* Returns a struct ast_sockaddr, with optional default value
1179 * (passed by reference) and port handling (accept, ignore,
1180 * require, forbid). The format is 'ipaddress[:port]'. IPv6 address
1181 * literals need square brackets around them if a port is specified.
1182 */
1183 PARSE_ADDR = 0x000e,
1184
1185 /* Returns a struct sockaddr_in, with optional default value
1186 * (passed by reference) and port handling (accept, ignore,
1187 * require, forbid). The format is 'host.name[:port]'
1188 */
1189 PARSE_INADDR = 0x000f,
1190
1191 /* Other data types can be added as needed */
1192
1193 /* If PARSE_DEFAULT is set, next argument is a default value
1194 * which is returned in case of error. The argument is passed
1195 * by value in case of numeric types, by reference in other cases.
1196 */
1197 PARSE_DEFAULT = 0x0010, /* assign default on error */
1198
1199 /* Request a range check, applicable to numbers. Two additional
1200 * arguments are passed by value, specifying the low-high end of
1201 * the range (inclusive). An error is returned if the value
1202 * is outside or inside the range, respectively.
1203 */
1204 PARSE_IN_RANGE = 0x0020, /* accept values inside a range */
1205 PARSE_OUT_RANGE = 0x0040, /* accept values outside a range */
1206 PARSE_RANGE_DEFAULTS = 0x0080, /* default to range min/max on range error */
1207
1208 /* Port handling, for ast_sockaddr. accept/ignore/require/forbid
1209 * port number after the hostname or address.
1210 */
1211 PARSE_PORT_MASK = 0x0300, /* 0x000: accept port if present */
1212 PARSE_PORT_IGNORE = 0x0100, /* 0x100: ignore port if present */
1213 PARSE_PORT_REQUIRE = 0x0200, /* 0x200: require port number */
1214 PARSE_PORT_FORBID = 0x0300, /* 0x100: forbid port number */
1215};
@ PARSE_RANGE_DEFAULTS
@ PARSE_PORT_REQUIRE

◆ config_hook_flags

Flags that affect the behaviour of config hooks.

Enumerator
butt 

Definition at line 1104 of file include/asterisk/config.h.

1104 {
1105 butt,
1106};

◆ config_save_flags

Flags for ast_config_text_file_save2()

Enumerator
CONFIG_SAVE_FLAG_NONE 
CONFIG_SAVE_FLAG_PRESERVE_EFFECTIVE_CONTEXT 

Insure a context doesn't effectively change if a template changes (pre 13.2 behavior)

Definition at line 52 of file include/asterisk/config.h.

52 {
54 /*! Insure a context doesn't effectively change if a template changes (pre 13.2 behavior) */
56};
@ CONFIG_SAVE_FLAG_NONE
@ CONFIG_SAVE_FLAG_PRESERVE_EFFECTIVE_CONTEXT

◆ require_type

Types used in ast_realtime_require_field.

Enumerator
RQ_INTEGER1 
RQ_UINTEGER1 
RQ_INTEGER2 
RQ_UINTEGER2 
RQ_INTEGER3 
RQ_UINTEGER3 
RQ_INTEGER4 
RQ_UINTEGER4 
RQ_INTEGER8 
RQ_UINTEGER8 
RQ_CHAR 
RQ_FLOAT 
RQ_DATE 
RQ_DATETIME 

Definition at line 65 of file include/asterisk/config.h.

65 {
76 RQ_CHAR,
78 RQ_DATE,
require_type
Types used in ast_realtime_require_field.

Function Documentation

◆ _ast_variable_new()

struct ast_variable * _ast_variable_new ( const char *  name,
const char *  value,
const char *  filename,
const char *  file,
const char *  function,
int  lineno 
)

Definition at line 314 of file main/config.c.

315{
316 struct ast_variable *variable;
317 int name_len = strlen(name) + 1;
318 int val_len = strlen(value) + 1;
319 int fn_len = strlen(filename) + 1;
320
321 /* Ensure a minimum length in case the filename is changed later. */
322 if (fn_len < MIN_VARIABLE_FNAME_SPACE) {
324 }
325
326 variable = __ast_calloc(1, fn_len + name_len + val_len + sizeof(*variable),
327 file, lineno, func);
328 if (variable) {
329 char *dst = variable->stuff; /* writable space starts here */
330
331 /* Put file first so ast_include_rename() can calculate space available. */
332 variable->file = strcpy(dst, filename);
333 dst += fn_len;
334 variable->name = strcpy(dst, name);
335 dst += name_len;
336 variable->value = strcpy(dst, value);
337 }
338 return variable;
339}
void * __ast_calloc(size_t nmemb, size_t size, const char *file, int lineno, const char *func) attribute_malloc
Definition: astmm.c:1603
static const char name[]
Definition: format_mp3.c:68
#define MIN_VARIABLE_FNAME_SPACE
Definition: main/config.c:74
Structure for variables, used for configurations and for channel variables.
char stuff[0]
Contents of file, name, and value in that order stuffed here.
int value
Definition: syslog.c:37

References __ast_calloc(), ast_variable::file, make_ari_stubs::file, ast_variable::lineno, MIN_VARIABLE_FNAME_SPACE, name, ast_variable::name, ast_variable::stuff, ast_variable::value, and value.

◆ ast_category_append()

static void ast_category_append ( struct ast_config config,
struct ast_category category 
)

Appends a category to a config.

Parameters
configwhich config to use
categorycategory to insert

Definition at line 2833 of file extconf.c.

2834{
2835 if (config->last)
2836 config->last->next = category;
2837 else
2838 config->root = category;
2839 config->last = category;
2840 config->current = category;
2841}
static const char config[]
Definition: chan_ooh323.c:111

References config, ast_category::include_level, ast_category::next, NULL, and ast_category::prev.

Referenced by append_row_to_cfg(), ast_config_copy(), AST_TEST_DEFINE(), build_cfg(), config_curl(), config_ldap(), config_mysql(), config_odbc(), config_pgsql(), handle_updates(), process_text_line(), realtime_directory(), realtime_multi_curl(), realtime_multi_ldap(), realtime_multi_mysql(), realtime_multi_odbc(), realtime_multi_pgsql(), realtime_sorcery_multi(), realtime_sorcery_store(), realtime_sorcery_update(), static_realtime_cb(), and write_password_to_file().

◆ ast_category_browse()

static char * ast_category_browse ( struct ast_config config,
const char *  prev_name 
)

Browse categories.

Parameters
configWhich config structure you wish to "browse"
prev_nameA pointer to a previous category name.

This function is kind of non-intuitive in it's use. To begin, one passes NULL as the second argument. It will return a pointer to the string of the first category in the file. From here on after, one must then pass the previous usage's return value as the second pointer, and it will return a pointer to the category name afterwards.

Return values
acategory name on success
NULLon failure/no-more-categories
Note
ast_category_browse maintains internal state. Therefore is not thread safe, cannot be called recursively, and it is not safe to add or remove categories while browsing. ast_category_browse_filtered does not have these restrictions.

Definition at line 3326 of file extconf.c.

3327{
3328 struct ast_category *cat = NULL;
3329
3330 if (prev && config->last_browse && (config->last_browse->name == prev))
3331 cat = config->last_browse->next;
3332 else if (!prev && config->root)
3333 cat = config->root;
3334 else if (prev) {
3335 for (cat = config->root; cat; cat = cat->next) {
3336 if (cat->name == prev) {
3337 cat = cat->next;
3338 break;
3339 }
3340 }
3341 if (!cat) {
3342 for (cat = config->root; cat; cat = cat->next) {
3343 if (!strcasecmp(cat->name, prev)) {
3344 cat = cat->next;
3345 break;
3346 }
3347 }
3348 }
3349 }
3350
3351 if (cat)
3352 cat = next_available_category(cat);
3353
3354 config->last_browse = cat;
3355 return (cat) ? cat->name : NULL;
3356}
static struct ast_category * next_available_category(struct ast_category *cat)
Definition: extconf.c:3319
#define NULL
Definition: resample.c:96
char name[80]
Definition: main/config.c:227
struct ast_category * next
Definition: main/config.c:247
struct ast_category * prev
Definition: main/config.c:245

References config, ast_category::name, ast_category::next, next_available_category(), NULL, and ast_category::prev.

Referenced by __init_manager(), __queues_show(), actual_load_config(), ast_cli_perms_init(), AST_TEST_DEFINE(), check_for_old_config(), conf_exec(), find_queue_by_name_rt(), find_realtime(), iax_provision_reload(), internal_process_ast_config(), load_common(), load_config(), load_indications(), load_module(), load_moh_classes(), load_odbc_config(), load_realtime_musiconhold(), load_realtime_queues(), load_realtime_rules(), load_tech_calendars(), load_users(), mbl_load_config(), named_acl_find_realtime(), parse_config(), pbx_load_config(), pbx_load_users(), realtime_directory(), realtime_sorcery(), realtime_sorcery_multi(), realtime_switch_common(), reload(), reload_config(), reload_followme(), reload_queue_rules(), reload_queues(), search_directory(), search_directory_sub(), set_config(), set_member_value(), setup_dahdi_int(), show_users_realtime(), sla_load_config(), test_config_validity(), update_realtime_members(), and vm_change_password().

◆ ast_category_browse_filtered()

struct ast_category * ast_category_browse_filtered ( struct ast_config config,
const char *  category_name,
struct ast_category prev,
const char *  filter 
)

Browse categories with filters.

Parameters
configWhich config structure you wish to "browse"
category_nameAn optional category name. Pass NULL to not restrict by category name.
prevA pointer to the starting category structure. Pass NULL to start at the beginning.
filterAn optional comma-separated list of <name_regex>=<value_regex> pairs. Only categories with matching variables will be returned. The special name 'TEMPLATES' can be used with the special values 'include' or 'restrict' to include templates in the result or restrict the result to only templates.
Return values
acategory on success
NULLon failure/no-more-categories

Definition at line 1536 of file main/config.c.

1538{
1539 struct ast_category *cat;
1540
1541 if (!prev) {
1542 prev = config->root;
1543 } else {
1544 prev = prev->next;
1545 }
1546
1547 cat = next_available_category(prev, category_name, filter);
1548
1549 return cat;
1550}
static int filter(struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t len)
Definition: func_strings.c:899
static struct ast_category * next_available_category(struct ast_category *cat, const char *name, const char *filter)
Definition: main/config.c:1349

References config, filter(), ast_category::next, next_available_category(), and ast_category::prev.

Referenced by action_getconfig(), action_getconfigjson(), action_listcategories(), AST_TEST_DEFINE(), ast_variable_retrieve_filtered(), handle_updates(), object_type_loaded_observer(), sorcery_config_internal_load(), and sorcery_realtime_retrieve_multiple().

◆ ast_category_delete()

struct ast_category * ast_category_delete ( struct ast_config cfg,
struct ast_category cat 
)

Delete a category.

Parameters
cfgwhich config to use
catcategory to delete
Returns
the category after the deleted one which could be NULL.
Note
It is not safe to call ast_category_delete while browsing with ast_category_browse. It is safe with ast_category_browse_filtered.

Definition at line 1695 of file main/config.c.

1697{
1698 struct ast_category *prev;
1699
1700 if (!config || !category) {
1701 return NULL;
1702 }
1703
1704 if (category->prev) {
1705 category->prev->next = category->next;
1706 } else {
1707 config->root = category->next;
1708 }
1709
1710 if (category->next) {
1711 category->next->prev = category->prev;
1712 } else {
1713 config->last = category->prev;
1714 }
1715
1716 prev = category->prev;
1717
1718 if (config->last_browse == category) {
1719 config->last_browse = prev;
1720 }
1721
1722 ast_category_destroy(category);
1723
1724 return prev;
1725}
void ast_category_destroy(struct ast_category *cat)
Definition: main/config.c:1305

References ast_category_destroy(), config, ast_category::next, NULL, and ast_category::prev.

Referenced by AST_TEST_DEFINE(), handle_updates(), object_type_loaded_observer(), realtime_sorcery_destroy(), and realtime_sorcery_update().

◆ ast_category_destroy()

static void ast_category_destroy ( struct ast_category cat)

Definition at line 2845 of file extconf.c.

2846{
2848 if (cat->file)
2849 free(cat->file);
2850
2851 free(cat);
2852}
static void ast_variables_destroy(struct ast_variable *v)
Definition: extconf.c:1262
void free()
struct ast_variable * root
Definition: main/config.c:241
char * file
The file name from whence this declaration was read.
Definition: main/config.c:234

References ast_comment_destroy(), ast_destroy_template_list(), ast_free, ast_variables_destroy(), ast_category::file, free(), ast_category::last, NULL, ast_category::precomments, ast_category::root, ast_category::sameline, and ast_category::trailing.

Referenced by ast_category_delete(), ast_config_destroy(), handle_updates(), new_category(), process_text_line(), realtime_multi_odbc(), static_realtime_cb(), and write_password_to_file().

◆ ast_category_detach_variables()

struct ast_variable * ast_category_detach_variables ( struct ast_category cat)

Definition at line 1552 of file main/config.c.

1553{
1554 struct ast_variable *v;
1555
1556 v = cat->root;
1557 cat->root = NULL;
1558 cat->last = NULL;
1559
1560 return v;
1561}
struct ast_variable * last
Definition: main/config.c:243

References ast_category::last, NULL, and ast_category::root.

Referenced by realtime_switch_common(), and sorcery_realtime_retrieve_multiple().

◆ ast_category_empty()

int ast_category_empty ( struct ast_category category)

Removes and destroys all variables in a category.

Parameters
categorycategory to empty
Return values
0if succeeded
-1if category is NULL

Definition at line 1727 of file main/config.c.

1728{
1729 if (!category) {
1730 return -1;
1731 }
1732
1733 ast_variables_destroy(category->root);
1734 category->root = NULL;
1735 category->last = NULL;
1736
1737 return 0;
1738}
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
Definition: main/config.c:675

References ast_variables_destroy(), ast_category::last, NULL, and ast_category::root.

Referenced by AST_TEST_DEFINE(), and handle_updates().

◆ ast_category_exist()

int ast_category_exist ( const struct ast_config config,
const char *  category_name,
const char *  filter 
)

Check for category duplicates.

Parameters
configwhich config to use
category_namename of the category you're looking for
filteran optional comma-separated list of <name_regex>=<value_regex> pairs. Only categories with matching variables will be returned. The special name 'TEMPLATES' can be used with the special values 'include' or 'restrict' to include templates in the result or restrict the result to only templates.

This will search through the categories within a given config file for a match.

Returns
non-zero if found

Definition at line 1244 of file main/config.c.

1246{
1247 return !!ast_category_get(config, category_name, filter);
1248}
struct ast_category * ast_category_get(const struct ast_config *config, const char *category_name, const char *filter)
Retrieve a category if it exists.
Definition: main/config.c:1205

References ast_category_get(), config, and filter().

Referenced by realtime_sorcery_store().

◆ ast_category_first()

struct ast_variable * ast_category_first ( struct ast_category cat)

given a pointer to a category, return the root variable.

This is equivalent to ast_variable_browse(), but more efficient if we already have the struct ast_category * (e.g. from ast_category_get())

return the first var of a category

Definition at line 1358 of file main/config.c.

1359{
1360 return (cat) ? cat->root : NULL;
1361}

References NULL, and ast_category::root.

Referenced by acl_order_comparator(), action_getconfig(), action_getconfigjson(), handle_aor(), handle_auth(), handle_endpoint(), handle_identify(), handle_phoneprov(), handle_registrations(), object_type_loaded_observer(), process_text_line(), sorcery_config_internal_load(), sorcery_is_criteria_met(), sorcery_is_explicit_name_met(), and wizard_apply_handler().

◆ ast_category_get()

struct ast_category * ast_category_get ( const struct ast_config config,
const char *  category_name,
const char *  filter 
)

Retrieve a category if it exists.

Parameters
configwhich config to use
category_namename of the category you're looking for
filterIf a config contains more than 1 category with the same name, you can specify a filter to narrow the search. The filter is a comma-separated list of <name_regex>=<value_regex> pairs. Only a category with matching variables will be returned. The special name 'TEMPLATES' can be used with the special values 'include' or 'restrict' to include templates in the result or restrict the result to only templates.

This will search through the categories within a given config file for a match.

Return values
pointerto category if found
NULLif not.

Definition at line 1205 of file main/config.c.

1207{
1208 return category_get_sep(config, category_name, filter, ',', 1);
1209}
static struct ast_category * category_get_sep(const struct ast_config *config, const char *category_name, const char *filter, char sep, char pointer_match_possible)
Definition: main/config.c:1183

References category_get_sep(), config, and filter().

Referenced by add_message_id(), ast_category_exist(), ast_category_root(), AST_TEST_DEFINE(), ast_variable_browse(), handle_updates(), object_type_loaded_observer(), realtime_directory(), realtime_sorcery_destroy(), realtime_sorcery_update(), realtime_switch_common(), vm_change_password(), and vm_forwardoptions().

◆ ast_category_get_name()

const char * ast_category_get_name ( const struct ast_category category)

Return the name of the category.

Parameters
categorycategory structure
Return values
pointerto category name if found
NULLif not.

Definition at line 1211 of file main/config.c.

1212{
1213 return category->name;
1214}

References ast_category::name.

Referenced by action_getconfig(), action_getconfigjson(), action_listcategories(), AST_TEST_DEFINE(), handle_aor(), handle_auth(), handle_endpoint(), handle_identify(), handle_phoneprov(), handle_registrations(), object_type_loaded_observer(), sorcery_config_internal_load(), and sorcery_is_explicit_name_met().

◆ ast_category_get_templates()

struct ast_str * ast_category_get_templates ( const struct ast_category category)

Return the template names this category inherits from.

Parameters
categorycategory structure
Returns
an ast_str (which must be freed after use) with a comma separated list of templates names or NULL if there were no templates.

Definition at line 1221 of file main/config.c.

1222{
1223 struct ast_category_template_instance *template;
1224 struct ast_str *str;
1225 int first = 1;
1226
1227 if (AST_LIST_EMPTY(&category->template_instances)) {
1228 return NULL;
1229 }
1230
1231 str = ast_str_create(128);
1232 if (!str) {
1233 return NULL;
1234 }
1235
1236 AST_LIST_TRAVERSE(&category->template_instances, template, next) {
1237 ast_str_append(&str, 0, "%s%s", first ? "" : ",", template->name);
1238 first = 0;
1239 }
1240
1241 return str;
1242}
const char * str
Definition: app_jack.c:150
struct sla_ringing_trunk * first
Definition: app_sla.c:338
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
Definition: linkedlists.h:491
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
Definition: linkedlists.h:450
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1139
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:659
struct ast_category_template_instance * next
Definition: main/config.c:223
struct ast_category::template_instance_list template_instances
Support for dynamic strings.
Definition: strings.h:623

References AST_LIST_EMPTY, AST_LIST_TRAVERSE, ast_str_append(), ast_str_create, first, ast_category::next, NULL, str, and ast_category::template_instances.

Referenced by action_getconfig(), and action_getconfigjson().

◆ ast_category_inherit()

int ast_category_inherit ( struct ast_category existing,
const struct ast_category base 
)

Applies base (template) to category.

Parameters
existingexisting category
basebase category

This function is used to apply a base (template) to an existing category

Return values
0if succeeded
-1if the memory allocation failed

Definition at line 1568 of file main/config.c.

1569{
1570 struct ast_variable *var;
1572
1573 x = ast_calloc(1, sizeof(*x));
1574 if (!x) {
1575 return -1;
1576 }
1577 strcpy(x->name, base->name);
1578 x->inst = base;
1579 AST_LIST_INSERT_TAIL(&new->template_instances, x, next);
1580 for (var = base->root; var; var = var->next) {
1581 struct ast_variable *cloned = variable_clone(var);
1582 if (!cloned) {
1583 return -1;
1584 }
1585 cloned->inherited = 1;
1586 ast_variable_append(new, cloned);
1587 }
1588 return 0;
1589}
#define var
Definition: ast_expr2f.c:605
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:731
void ast_variable_append(struct ast_category *category, struct ast_variable *variable)
Definition: main/config.c:572
static struct ast_variable * variable_clone(const struct ast_variable *old)
Definition: main/config.c:1038
const struct ast_category * inst
Definition: main/config.c:222

References ast_calloc, AST_LIST_INSERT_TAIL, ast_variable_append(), ast_variable::inherited, ast_category_template_instance::inst, ast_category_template_instance::name, ast_category::name, ast_category::next, ast_category::root, var, and variable_clone().

Referenced by handle_updates(), and process_text_line().

◆ ast_category_insert()

int ast_category_insert ( struct ast_config config,
struct ast_category cat,
const char *  match 
)

Inserts new category.

Parameters
configwhich config to use
catnewly created category to insert
matchwhich category to insert above

This function is used to insert a new category above another category matching the match parameter.

Return values
0if succeeded
-1if the specified match category wasn't found

Definition at line 1266 of file main/config.c.

1267{
1268 struct ast_category *cur_category;
1269
1270 if (!config || !config->root || !cat || !match) {
1271 return -1;
1272 }
1273
1274 if (!strcasecmp(config->root->name, match)) {
1275 cat->next = config->root;
1276 cat->prev = NULL;
1277 config->root->prev = cat;
1278 config->root = cat;
1279 return 0;
1280 }
1281
1282 for (cur_category = config->root->next; cur_category; cur_category = cur_category->next) {
1283 if (!strcasecmp(cur_category->name, match)) {
1284 cat->prev = cur_category->prev;
1285 cat->prev->next = cat;
1286
1287 cat->next = cur_category;
1288 cur_category->prev = cat;
1289
1290 return 0;
1291 }
1292 }
1293
1294 return -1;
1295}
static int match(struct ast_sockaddr *addr, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
Definition: chan_iax2.c:2388

References config, match(), ast_category::name, ast_category::next, NULL, and ast_category::prev.

Referenced by AST_TEST_DEFINE(), and handle_updates().

◆ ast_category_is_template()

int ast_category_is_template ( const struct ast_category category)

Check if category is a template.

Parameters
categorycategory structure
Return values
1if a template.
0if not.

Definition at line 1216 of file main/config.c.

1217{
1218 return category->ignored;
1219}

References ast_category::ignored.

Referenced by action_getconfig(), and action_getconfigjson().

◆ ast_category_new()

static struct ast_category * ast_category_new ( const char *  name,
const char *  in_file,
int  lineno 
)

Create a category.

Parameters
namename of new category
in_filefilename which contained the new config
linenoline number

Definition at line 2788 of file extconf.c.

2789{
2790 struct ast_category *category;
2791
2792 if ((category = ast_calloc(1, sizeof(*category))))
2793 ast_copy_string(category->name, name, sizeof(category->name));
2794 category->file = strdup(in_file);
2795 category->lineno = lineno; /* if you don't know the lineno, set it to 999999 or something real big */
2796 return category;
2797}
#define strdup(a)
Definition: astmm.h:163
void ast_copy_string(char *dst, const char *src, size_t size)
Definition: extconf.c:970

References ast_calloc, ast_copy_string(), ast_category::file, ast_category::lineno, ast_category::name, name, new_category(), and strdup.

Referenced by ast_config_copy(), AST_TEST_DEFINE(), build_cfg(), handle_updates(), process_text_line(), realtime_sorcery_multi(), realtime_sorcery_store(), realtime_sorcery_update(), and write_password_to_file().

◆ ast_category_new_template()

struct ast_category * ast_category_new_template ( const char *  name,
const char *  in_file,
int  lineno 
)

Create a category making it a template.

Parameters
namename of new template
in_filefilename which contained the new config
linenoline number

Definition at line 1178 of file main/config.c.

1179{
1180 return new_category(name, in_file, lineno, 1);
1181}
static struct ast_category * new_category(const char *name, const char *in_file, int lineno, int template)
Definition: main/config.c:1154

References ast_category::lineno, name, and new_category().

Referenced by AST_TEST_DEFINE(), and handle_updates().

◆ ast_category_rename()

void ast_category_rename ( struct ast_category cat,
const char *  name 
)

Definition at line 1563 of file main/config.c.

1564{
1565 ast_copy_string(cat->name, name, sizeof(cat->name));
1566}
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425

References ast_copy_string(), ast_category::name, and name.

Referenced by handle_updates(), realtime_multi_curl(), realtime_multi_ldap(), realtime_multi_mysql(), realtime_multi_odbc(), and realtime_multi_pgsql().

◆ ast_category_root()

struct ast_variable * ast_category_root ( struct ast_config config,
char *  cat 
)

returns the root ast_variable of a config

Parameters
configpointer to an ast_config data structure
catname of the category for which you want the root
Returns
the category specified

Definition at line 1363 of file main/config.c.

1364{
1365 struct ast_category *category = ast_category_get(config, cat, NULL);
1366
1367 if (category)
1368 return category->root;
1369 return NULL;
1370}

References ast_category_get(), config, NULL, and ast_category::root.

Referenced by config_function_read(), realtime_sorcery(), and realtime_sorcery_multi().

◆ ast_check_realtime()

int ast_check_realtime ( const char *  family)

Check if realtime engine is configured for family.

Parameters
familywhich family/config to be checked
Returns
1 if family is configured in realtime and engine exists

Definition at line 3750 of file main/config.c.

3751{
3752 struct ast_config_engine *eng;
3753 if (!ast_realtime_enabled()) {
3754 return 0; /* There are no engines at all so fail early */
3755 }
3756
3757 eng = find_engine(family, 1, NULL, 0, NULL, 0);
3758 if (eng)
3759 return 1;
3760 return 0;
3761}
int ast_realtime_enabled(void)
Check if there's any realtime engines loaded.
Definition: main/config.c:3764
static struct ast_config_engine * find_engine(const char *family, int priority, char *database, int dbsiz, char *table, int tabsiz)
Find realtime engine for realtime family.
Definition: main/config.c:3429
Configuration engine structure, used to define realtime drivers.

References ast_realtime_enabled(), find_engine(), and NULL.

Referenced by __queues_show(), ast_named_acl_find(), ast_queue_log(), close_mailbox(), copy_plain_file(), handle_voicemail_show_users(), leave_voicemail(), load_module(), load_moh_classes(), load_realtime_queues(), load_realtime_rules(), local_ast_moh_start(), logger_queue_rt_start(), manager_queues_status(), manager_queues_summary(), msg_create_from_file(), rename_file(), set_member_paused(), set_member_value(), and vm_delete().

◆ ast_config_copy()

struct ast_config * ast_config_copy ( const struct ast_config orig)

Copies the contents of one ast_config into another.

Note
This creates a config on the heap. The caller of this must be prepared to free the memory returned.
Parameters
origthe config to copy
Returns
The new config on success, NULL on failure.

Definition at line 3466 of file main/config.c.

3467{
3468 struct ast_config *new_config = ast_config_new();
3469 struct ast_category *cat_iter;
3470
3471 if (!new_config) {
3472 return NULL;
3473 }
3474
3475 for (cat_iter = old->root; cat_iter; cat_iter = cat_iter->next) {
3476 struct ast_category *new_cat =
3477 ast_category_new(cat_iter->name, cat_iter->file, cat_iter->lineno);
3478 if (!new_cat) {
3479 goto fail;
3480 }
3481 ast_category_append(new_config, new_cat);
3482 if (cat_iter->root) {
3483 new_cat->root = ast_variables_dup(cat_iter->root);
3484 if (!new_cat->root) {
3485 goto fail;
3486 }
3487 new_cat->last = cat_iter->last;
3488 }
3489 }
3490
3491 return new_config;
3492
3493fail:
3494 ast_config_destroy(new_config);
3495 return NULL;
3496}
void ast_config_destroy(struct ast_config *cfg)
Destroys a config.
Definition: main/config.c:1740
struct ast_config * ast_config_new(void)
Create a new base configuration structure.
Definition: main/config.c:1591
struct ast_category * ast_category_new(const char *name, const char *in_file, int lineno)
Create a category.
Definition: main/config.c:1173
void ast_category_append(struct ast_config *config, struct ast_category *category)
Appends a category to a config.
Definition: main/config.c:1250
struct ast_variable * ast_variables_dup(struct ast_variable *var)
Duplicate variable list.
Definition: main/config.c:629

References ast_category_append(), ast_category_new(), ast_config_destroy(), ast_config_new(), ast_variables_dup(), ast_category::file, ast_category::last, ast_category::lineno, ast_category::name, ast_category::next, NULL, ast_category::root, and ast_config::root.

Referenced by AST_TEST_DEFINE(), and config_hook_exec().

◆ ast_config_destroy()

static void ast_config_destroy ( struct ast_config cfg)

Destroys a config.

Parameters
cfgpointer to config data structure

Free memory associated with a given config

Definition at line 1289 of file extconf.c.

1290{
1291 struct ast_category *cat, *catn;
1292
1293 if (!cfg)
1294 return;
1295
1297
1298 cat = cfg->root;
1299 while (cat) {
1301 catn = cat;
1302 cat = cat->next;
1303 free(catn);
1304 }
1305 free(cfg);
1306}
static void ast_includes_destroy(struct ast_config_include *incls)
Definition: extconf.c:1273
struct ast_config_include * includes
Definition: extconf.c:918
struct ast_category * root
Definition: main/config.c:252

References ast_category_destroy(), ast_free, ast_includes_destroy(), ast_variables_destroy(), free(), ast_config::includes, ast_config::includes_root, ast_category::next, ast_category::root, and ast_config::root.

Referenced by __ast_http_load(), __ast_http_post_load(), __ast_sorcery_apply_config(), __init_manager(), __queues_show(), _dsp_init(), aco_process_config(), action_getconfig(), action_getconfigjson(), action_listcategories(), action_updateconfig(), adsi_load(), advanced_options(), ast_cli_perms_init(), ast_config_copy(), ast_config_load2(), ast_init_logger_for_socket_console(), ast_load_realtime_multientry_fields(), AST_TEST_DEFINE(), build_cfg(), check_for_old_config(), conf_exec(), config_function_read(), config_module(), deinitialize_sorcery(), directory_exec(), do_reload(), festival_exec(), find_conf(), find_load_queue_rt_friendly(), find_realtime(), forward_message(), get_defaults(), handle_cli_dialplan_save(), hook_cb(), iax_provision_reload(), init_logger_chain(), initialize_cc_devstate_map(), initialize_cc_max_requests(), load_asterisk_conf(), load_common(), load_config(), load_config_force(), load_config_meetme(), load_indications(), load_module(), load_moh_classes(), load_odbc_config(), load_realtime_musiconhold(), load_realtime_queues(), load_realtime_rules(), load_users(), loader_config_init(), make_email_file(), mbl_load_config(), message_range_and_existence_check(), my_load_module(), named_acl_find_realtime(), notify_new_message(), object_type_loaded_observer(), odbc_load_module(), parse_config(), pbx_load_config(), pbx_load_users(), play_message(), prep_email_sub_vars(), private_enum_init(), process_config(), read_password_from_file(), read_pjproject_startup_options(), realtime_directory(), realtime_multi_mysql(), realtime_multi_pgsql(), realtime_sorcery_multi(), realtime_sqlite3_multi(), realtime_switch_common(), reload(), reload_config(), reload_followme(), reload_module(), reload_queue_rules(), reload_queues(), rtp_reload(), run_startup_commands(), set_config(), set_member_value(), setup_dahdi_int(), show_users_realtime(), sla_load_config(), smdi_load(), sorcery_config_internal_load(), sorcery_realtime_retrieve_multiple(), tds_load_module(), unload_module(), update_realtime_members(), vm_change_password(), vm_forwardoptions(), vm_msg_forward(), vm_msg_play(), vm_msg_snapshot_create(), write_password_to_file(), and xmldoc_load_documentation().

◆ ast_config_engine_deregister()

int ast_config_engine_deregister ( struct ast_config_engine del)

Deregister config engine.

Return values
0Always

Definition at line 3393 of file main/config.c.

3394{
3395 struct ast_config_engine *ptr, *last=NULL;
3396
3398
3399 for (ptr = config_engine_list; ptr; ptr=ptr->next) {
3400 if (ptr == del) {
3401 if (last)
3402 last->next = ptr->next;
3403 else
3404 config_engine_list = ptr->next;
3405 break;
3406 }
3407 last = ptr;
3408 }
3409
3410 return 0;
3411}
ast_mutex_t lock
Definition: app_sla.c:337
struct sla_ringing_trunk * last
Definition: app_sla.c:338
#define SCOPED_MUTEX(varname, lock)
scoped lock specialization for mutexes
Definition: lock.h:596
static ast_mutex_t config_lock
Definition: main/config.c:215
static struct ast_config_engine * config_engine_list
Definition: main/config.c:216
struct ast_config_engine * next
struct sla_ringing_trunk * next
Definition: app_sla.c:314

References config_engine_list, config_lock, last, lock, sla_ringing_trunk::next, ast_config_engine::next, NULL, and SCOPED_MUTEX.

Referenced by unload_module().

◆ ast_config_engine_register()

int ast_config_engine_register ( struct ast_config_engine newconfig)

Register config engine.

Return values
1Always

Definition at line 3377 of file main/config.c.

3378{
3379 struct ast_config_engine *ptr;
3380
3382
3383 if (!config_engine_list) {
3384 config_engine_list = new;
3385 } else {
3386 for (ptr = config_engine_list; ptr->next; ptr=ptr->next);
3387 ptr->next = new;
3388 }
3389
3390 return 1;
3391}

References config_engine_list, config_lock, lock, ast_config_engine::next, and SCOPED_MUTEX.

Referenced by load_module().

◆ ast_config_get_current_category()

struct ast_category * ast_config_get_current_category ( const struct ast_config cfg)

Retrieve the current category name being built.

API for backend configuration engines while building a configuration set.

Definition at line 2781 of file extconf.c.

2782{
2783 return cfg->current;
2784}
struct ast_category * current
Definition: main/config.c:255

References ast_config::current.

Referenced by config_curl(), config_odbc(), and config_text_file_load().

◆ ast_config_hook_register()

int ast_config_hook_register ( const char *  name,
const char *  filename,
const char *  module,
enum config_hook_flags  flags,
config_hook_cb  hook 
)

Register a config hook for a particular file and module.

Parameters
nameThe name of the hook you are registering.
filenameThe file whose config you wish to hook into.
moduleThe module that is reloading the config. This can be useful if multiple modules may possibly reload the same file, but you are only interested when a specific module reloads the file
flagsFlags that affect the way hooks work.
hookThe callback to be called when config is loaded. return 0 Success return -1 Unsuccess, also known as UTTER AND COMPLETE FAILURE

Definition at line 4522 of file main/config.c.

4527{
4528 struct cfg_hook *hook;
4529 if (!cfg_hooks) {
4532 if (!cfg_hooks) {
4533 return -1;
4534 }
4535 }
4536
4537 if (!(hook = ao2_alloc(sizeof(*hook), hook_destroy))) {
4538 return -1;
4539 }
4540
4541 hook->hook_cb = hook_cb;
4542 hook->filename = ast_strdup(filename);
4543 hook->name = ast_strdup(name);
4544 hook->module = ast_strdup(module);
4545
4546 ao2_link(cfg_hooks, hook);
4547 ao2_ref(hook, -1);
4548 return 0;
4549}
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
#define ao2_link(container, obj)
Add an object to a container.
Definition: astobj2.h:1532
@ AO2_ALLOC_OPT_LOCK_MUTEX
Definition: astobj2.h:363
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:409
#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 int hook_hash(const void *obj, const int flags)
Definition: main/config.c:4487
static struct ao2_container * cfg_hooks
Definition: main/config.c:78
static void hook_destroy(void *obj)
Definition: main/config.c:4471
static int hook_cmp(void *obj, void *arg, int flags)
Definition: main/config.c:4479
config_hook_cb hook_cb
Definition: main/config.c:4468
const char * filename
Definition: main/config.c:4466
const char * module
Definition: main/config.c:4467
const char * name
Definition: main/config.c:4465
static int hook_cb(struct ast_config *cfg)
Definition: test_config.c:875

References ao2_alloc, AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_hash, ao2_link, ao2_ref, ast_strdup, cfg_hooks, cfg_hook::filename, cfg_hook::hook_cb, hook_cb(), hook_cmp(), hook_destroy(), hook_hash(), cfg_hook::module, name, cfg_hook::name, and NULL.

Referenced by AST_TEST_DEFINE().

◆ ast_config_hook_unregister()

void ast_config_hook_unregister ( const char *  name)

Unregister a config hook.

Parameters
nameThe name of the hook to unregister

Definition at line 4494 of file main/config.c.

4495{
4496 struct cfg_hook tmp;
4497
4498 tmp.name = ast_strdupa(name);
4499
4501}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define OBJ_POINTER
Definition: astobj2.h:1150
#define ao2_find(container, arg, flags)
Definition: astobj2.h:1736
@ OBJ_NODATA
Definition: astobj2.h:1044
@ OBJ_UNLINK
Definition: astobj2.h:1039

References ao2_find, ast_strdupa, cfg_hooks, name, cfg_hook::name, OBJ_NODATA, OBJ_POINTER, and OBJ_UNLINK.

Referenced by AST_TEST_DEFINE().

◆ ast_config_internal_load()

struct ast_config * ast_config_internal_load ( const char *  configfile,
struct ast_config cfg,
struct ast_flags  flags,
const char *  suggested_incl_file,
const char *  who_asked 
)

Definition at line 3499 of file main/config.c.

3500{
3501 char db[256];
3502 char table[256];
3503 struct ast_config_engine *loader = &text_file_engine;
3504 struct ast_config *result;
3505
3506 /* The config file itself bumps include_level by 1 */
3507 if (cfg->max_include_level > 0 && cfg->include_level == cfg->max_include_level + 1) {
3508 ast_log(LOG_WARNING, "Maximum Include level (%d) exceeded\n", cfg->max_include_level);
3509 return NULL;
3510 }
3511
3512 cfg->include_level++;
3513
3515 struct ast_config_engine *eng;
3516
3517 eng = find_engine(filename, 1, db, sizeof(db), table, sizeof(table));
3518
3519
3520 if (eng && eng->load_func) {
3521 loader = eng;
3522 } else {
3523 eng = find_engine("global", 1, db, sizeof(db), table, sizeof(table));
3524 if (eng && eng->load_func)
3525 loader = eng;
3526 }
3527 }
3528
3529 result = loader->load_func(db, table, filename, cfg, flags, suggested_include_file, who_asked);
3530
3532 result->include_level--;
3533 config_hook_exec(filename, who_asked, result);
3534 } else if (result != CONFIG_STATUS_FILEINVALID) {
3535 cfg->include_level--;
3536 }
3537
3538 return result;
3539}
#define ast_log
Definition: astobj2.c:42
static char * table
Definition: cdr_odbc.c:55
static sqlite3 * db
static PGresult * result
Definition: cel_pgsql.c:84
#define CONFIG_STATUS_FILEUNCHANGED
#define CONFIG_STATUS_FILEINVALID
#define LOG_WARNING
static void config_hook_exec(const char *filename, const char *module, const struct ast_config *cfg)
Definition: main/config.c:4503
static struct ast_config_engine text_file_engine
Definition: main/config.c:3461
config_load_func * load_func
int include_level
Definition: main/config.c:257
int max_include_level
Definition: main/config.c:258
#define ast_test_flag(p, flag)
Definition: utils.h:63

References ast_log, ast_test_flag, config_engine_list, CONFIG_FLAG_NOREALTIME, config_hook_exec(), CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, db, find_engine(), ast_config::include_level, ast_config_engine::load_func, LOG_WARNING, ast_config::max_include_level, NULL, result, table, and text_file_engine.

Referenced by ast_config_load2(), config_curl(), config_ldap(), config_mysql(), config_odbc(), config_pgsql(), process_text_line(), reload_module(), and static_realtime_cb().

◆ ast_config_load2()

struct ast_config * ast_config_load2 ( const char *  filename,
const char *  who_asked,
struct ast_flags  flags 
)

Load a config file.

Parameters
filenamepath of file to open. If no preceding '/' character, path is considered relative to AST_CONFIG_DIR
who_askedThe module which is making this request.
flagsOptional flags: CONFIG_FLAG_WITHCOMMENTS - load the file with comments intact; CONFIG_FLAG_FILEUNCHANGED - check the file mtime and return CONFIG_STATUS_FILEUNCHANGED if the mtime is the same; or CONFIG_FLAG_NOCACHE - don't cache file mtime (main purpose of this option is to save memory on temporary files).

Create a config structure from a given configuration file.

Returns
an ast_config data structure on success
Return values
NULLon error

Definition at line 3541 of file main/config.c.

3542{
3543 struct ast_config *cfg;
3544 struct ast_config *result;
3545
3546 cfg = ast_config_new();
3547 if (!cfg)
3548 return NULL;
3549
3550 result = ast_config_internal_load(filename, cfg, flags, "", who_asked);
3552 ast_config_destroy(cfg);
3553
3554 return result;
3555}
struct ast_config * ast_config_internal_load(const char *filename, struct ast_config *cfg, struct ast_flags flags, const char *suggested_include_file, const char *who_asked)
Definition: main/config.c:3499

References ast_config_destroy(), ast_config_internal_load(), ast_config_new(), CONFIG_STATUS_FILEINVALID, CONFIG_STATUS_FILEUNCHANGED, NULL, and result.

Referenced by __ast_http_load(), __ast_http_post_load(), __ast_sorcery_apply_config(), __init_manager(), _dsp_init(), action_getconfig(), action_getconfigjson(), action_listcategories(), action_updateconfig(), ast_cli_perms_init(), ast_init_logger_for_socket_console(), AST_TEST_DEFINE(), do_reload(), iax_provision_reload(), init_logger_chain(), initialize_cc_devstate_map(), initialize_cc_max_requests(), load_asterisk_conf(), load_config(), load_indications(), loader_config_init(), object_type_loaded_observer(), private_enum_init(), read_pjproject_startup_options(), rtp_reload(), run_startup_commands(), set_config(), sorcery_config_internal_load(), and xmldoc_load_documentation().

◆ ast_config_new()

static struct ast_config * ast_config_new ( void  )

◆ ast_config_option()

const char * ast_config_option ( struct ast_config cfg,
const char *  cat,
const char *  var 
)

Retrieve a configuration variable within the configuration set.

Retrieves the named variable var within category cat of configuration set cfg. If not found, attempts to retrieve the named variable var from within category general.

Returns
Value of var, or NULL if not found.

Definition at line 859 of file main/config.c.

860{
861 const char *tmp;
862 tmp = ast_variable_retrieve(cfg, cat, var);
863 if (!tmp) {
864 tmp = ast_variable_retrieve(cfg, "general", var);
865 }
866 return tmp;
867}
const char * ast_variable_retrieve(struct ast_config *config, const char *category, const char *variable)
Definition: main/config.c:869

References ast_variable_retrieve(), and var.

Referenced by actual_load_config(), pbx_load_users(), process_config(), and search_directory_sub().

◆ ast_config_set_current_category()

void ast_config_set_current_category ( struct ast_config cfg,
const struct ast_category cat 
)

Set the category within the configuration as being current.

API for backend configuration engines while building a configuration set.

Definition at line 3362 of file extconf.c.

3363{
3364 /* cast below is just to silence compiler warning about dropping "const" */
3365 cfg->current = (struct ast_category *) cat;
3366}

References ast_config::current.

Referenced by process_text_line().

◆ ast_config_sort_categories()

void ast_config_sort_categories ( struct ast_config config,
int  descending,
int(*)(struct ast_category *p, struct ast_category *q)  comparator 
)

Sorts categories in a config in the order of a numerical value contained within them.

Parameters
configThe config structure you wish to sort
comparatorvariable Which numerical value you wish to sort by
descendingIf true, we sort highest to lowest instead of lowest to highest

This function will assume a value of 0 for any non-numerical strings and NULL fields.

Definition at line 1372 of file main/config.c.

1374{
1375 /*
1376 * The contents of this function are adapted from
1377 * an example of linked list merge sorting
1378 * copyright 2001 Simon Tatham.
1379 *
1380 * Permission is hereby granted, free of charge, to any person
1381 * obtaining a copy of this software and associated documentation
1382 * files (the "Software"), to deal in the Software without
1383 * restriction, including without limitation the rights to use,
1384 * copy, modify, merge, publish, distribute, sublicense, and/or
1385 * sell copies of the Software, and to permit persons to whom the
1386 * Software is furnished to do so, subject to the following
1387 * conditions:
1388 *
1389 * The above copyright notice and this permission notice shall be
1390 * included in all copies or substantial portions of the Software.
1391 *
1392 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1393 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
1394 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1395 * NONINFRINGEMENT. IN NO EVENT SHALL SIMON TATHAM BE LIABLE FOR
1396 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
1397 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
1398 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1399 * SOFTWARE.
1400 */
1401
1402 int insize = 1;
1403 struct ast_category *p, *q, *e, *tail;
1404 int nmerges, psize, qsize, i;
1405
1406 /* If the descending flag was sent, we'll apply inversion to the comparison function's return. */
1407 if (descending) {
1408 descending = -1;
1409 } else {
1410 descending = 1;
1411 }
1412
1413 if (!config->root) {
1414 return;
1415 }
1416
1417 while (1) {
1418 p = config->root;
1419 config->root = NULL;
1420 tail = NULL;
1421
1422 nmerges = 0; /* count number of merges we do in this pass */
1423
1424 while (p) {
1425 nmerges++; /* there exists a merge to be done */
1426
1427 /* step `insize' places along from p */
1428 q = p;
1429 psize = 0;
1430 for (i = 0; i < insize; i++) {
1431 psize++;
1432 q = q->next;
1433 if (!q) {
1434 break;
1435 }
1436 }
1437
1438 /* if q hasn't fallen off end, we have two lists to merge */
1439 qsize = insize;
1440
1441 /* now we have two lists; merge them */
1442 while (psize > 0 || (qsize > 0 && q)) {
1443 /* decide whether next element of merge comes from p or q */
1444 if (psize == 0) {
1445 /* p is empty; e must come from q. */
1446 e = q;
1447 q = q->next;
1448 qsize--;
1449 } else if (qsize == 0 || !q) {
1450 /* q is empty; e must come from p. */
1451 e = p; p = p->next; psize--;
1452 } else if ((comparator(p, q) * descending) <= 0) {
1453 /* First element of p is lower (or same) e must come from p. */
1454 e = p;
1455 p = p->next;
1456 psize--;
1457 } else {
1458 /* First element of q is lower; e must come from q. */
1459 e = q;
1460 q = q->next;
1461 qsize--;
1462 }
1463
1464 /* add the next element to the merged list */
1465 if (tail) {
1466 tail->next = e;
1467 } else {
1468 config->root = e;
1469 }
1470 tail = e;
1471 }
1472
1473 /* now p has stepped `insize' places along, and q has too */
1474 p = q;
1475 }
1476
1477 tail->next = NULL;
1478
1479 /* If we have done only one merge, we're finished. */
1480 if (nmerges <= 1) { /* allow for nmerges==0, the empty list case */
1481 return;
1482 }
1483
1484 /* Otherwise repeat, merging lists twice the size */
1485 insize *= 2;
1486 }
1487
1488}

References config, ast_category::next, and NULL.

Referenced by named_acl_find_realtime(), and realtime_switch_common().

◆ ast_config_text_file_save()

int ast_config_text_file_save ( const char *  filename,
const struct ast_config cfg,
const char *  generator 
)

Save a config text file preserving the pre 13.2 behavior.

Parameters
filenameFilename
cfgast_config
generatorgenerator
Return values
0on success.
-1on failure.

Definition at line 2868 of file main/config.c.

2869{
2871}
int ast_config_text_file_save2(const char *configfile, const struct ast_config *cfg, const char *generator, uint32_t flags)
Save a config text file.
Definition: main/config.c:2927

References ast_config_text_file_save2(), and CONFIG_SAVE_FLAG_PRESERVE_EFFECTIVE_CONTEXT.

Referenced by add_message_id(), AST_TEST_DEFINE(), vm_change_password(), vm_forwardoptions(), and write_password_to_file().

◆ ast_config_text_file_save2()

int ast_config_text_file_save2 ( const char *  filename,
const struct ast_config cfg,
const char *  generator,
uint32_t  flags 
)

Save a config text file.

Since
13.2.0
Parameters
filenameFilename
cfgast_config
generatorgenerator
flagsList of config_save_flags
Return values
0on success.
-1on failure.

Definition at line 2927 of file main/config.c.

2928{
2929 FILE *f;
2930 char fn[PATH_MAX];
2931 struct ast_variable *var;
2932 struct ast_category *cat;
2933 struct ast_comment *cmt;
2934 struct ast_config_include *incl;
2935 int blanklines = 0;
2936 struct ao2_container *fileset;
2937 struct inclfile *fi;
2938
2939 /* Check all the files for write access before attempting to modify any of them */
2940 for (incl = cfg->includes_root; incl; incl = incl->next) {
2941 /* reset all the output flags in case this isn't our first time saving this data */
2942 incl->output = 0;
2943
2944 if (incl->include_type != CONFIG_STATEMENT_EXEC) {
2945 struct config_included_file *included_file;
2946 int ok = 1;
2947
2948 /* Not a #exec. */
2949 /* For #include, make sure we have write access to the include file
2950 file or its parent directory. If the file itself doesn't exist,
2951 make sure we have write access to the directory. */
2952 /* For #tryinclude, we check the file(s) that match the pattern. */
2953
2954 AST_LIST_TRAVERSE(&incl->included_files, included_file, next) {
2955 if (!is_writable(included_file->path)) {
2956 /* the #tryinclude path exists but is not writable */
2957 ok = 0;
2958 break;
2959 }
2960 }
2961
2962 if (!ok) {
2963 /* at least one include file is not writable */
2964 return -1;
2965 }
2966 }
2967 }
2968
2969 /* now make sure we have write access to the main config file or its parent directory */
2970 make_fn(fn, sizeof(fn), 0, configfile);
2971 if (!is_writable(fn)) {
2972 return -1;
2973 }
2974
2977 if (!fileset) {
2978 /* Container creation failed. */
2979 return -1;
2980 }
2981
2982 /* Now that we know we have write access to all files, it's safe to start truncating them */
2983
2984 /* go thru all the inclusions and make sure all the files involved (configfile plus all its inclusions)
2985 are all truncated to zero bytes and have that nice header*/
2986 /* Note: for #exec, we write out the directives but don't zero out the exec files */
2987 for (incl = cfg->includes_root; incl; incl = incl->next) {
2988 if (incl->include_type != CONFIG_STATEMENT_EXEC) {
2989 struct config_included_file *included_file;
2990
2991 AST_LIST_TRAVERSE(&incl->included_files, included_file, next) {
2992 fi = set_fn(fn, sizeof(fn), included_file->path, configfile, fileset);
2993 f = fopen(fn, "w");
2994 if (f) {
2995 ast_verb(2, "Saving tryinclude '%s'\n", fn);
2996 gen_header(f, configfile, fn, generator);
2997 fclose(f);
2998 } else {
2999 ast_log(LOG_ERROR, "Unable to write %s (%s)\n", fn, strerror(errno));
3000 }
3001 if (fi) {
3002 ao2_ref(fi, -1);
3003 }
3004 }
3005 }
3006 }
3007
3008 /* just set fn to absolute ver of configfile */
3009 fi = set_fn(fn, sizeof(fn), 0, configfile, fileset);
3010 if (
3011#ifdef __CYGWIN__
3012 (f = fopen(fn, "w+"))
3013#else
3014 (f = fopen(fn, "w"))
3015#endif
3016 ) {
3017 ast_verb(2, "Saving '%s'\n", fn);
3018 gen_header(f, configfile, fn, generator);
3019 cat = cfg->root;
3020 fclose(f);
3021 if (fi) {
3022 ao2_ref(fi, -1);
3023 }
3024
3025 /* from here out, we open each involved file and concat the stuff we need to add to the end and immediately close... */
3026 /* since each var, cat, and associated comments can come from any file, we have to be
3027 mobile, and open each file, print, and close it on an entry-by-entry basis */
3028
3029 while (cat) {
3030 fi = set_fn(fn, sizeof(fn), cat->file, configfile, fileset);
3031 f = fopen(fn, "a");
3032 if (!f) {
3033 ast_log(LOG_ERROR, "Unable to write %s (%s)\n", fn, strerror(errno));
3034 if (fi) {
3035 ao2_ref(fi, -1);
3036 }
3037 ao2_ref(fileset, -1);
3038 return -1;
3039 }
3040
3041 /* dump any includes that happen before this category header */
3042 for (incl = cfg->includes_root; incl; incl = incl->next) {
3043 if (strcmp(incl->include_location_file, cat->file) == 0) {
3044 if (cat->lineno > incl->include_location_lineno && !incl->output) {
3045 /* add the precomments */
3047 print_comment(f, incl->precomments);
3048 /* and the include */
3049 print_include(f, incl);
3050 incl->output = 1;
3051 }
3052 }
3053 }
3054
3055 /* dump any comments that happen before this category header */
3057 print_comment(f, cat->precomments);
3058
3059 /* dump the category header */
3060 fprintf(f, "[%s]", cat->name);
3061 if (cat->ignored || !AST_LIST_EMPTY(&cat->template_instances)) {
3062 fprintf(f, "(");
3063 if (cat->ignored) {
3064 fprintf(f, "!");
3065 }
3066 if (cat->ignored && !AST_LIST_EMPTY(&cat->template_instances)) {
3067 fprintf(f, ",");
3068 }
3069 if (!AST_LIST_EMPTY(&cat->template_instances)) {
3072 fprintf(f, "%s",x->name);
3073 if (x != AST_LIST_LAST(&cat->template_instances))
3074 fprintf(f, ",");
3075 }
3076 }
3077 fprintf(f, ")");
3078 }
3079 for(cmt = cat->sameline; cmt; cmt = cmt->next)
3080 {
3081 fprintf(f, "%s", cmt->cmt);
3082 }
3083 if (!cat->sameline)
3084 fprintf(f, "\n");
3085
3086 /* dump any trailing comments */
3087 print_comment(f, cat->trailing);
3088
3089 /* and we're all done */
3090 fclose(f);
3091 if (fi) {
3092 ao2_ref(fi, -1);
3093 }
3094
3095 var = cat->root;
3096 while (var) {
3098 int found = 0;
3099
3101 struct ast_variable *v;
3102 for (v = x->inst->root; v; v = v->next) {
3103
3105 if (!strcasecmp(var->name, v->name) && !strcmp(var->value, v->value)) {
3106 found = 1;
3107 break;
3108 }
3109 } else {
3110 if (var->inherited) {
3111 found = 1;
3112 break;
3113 } else {
3114 if (!strcasecmp(var->name, v->name) && !strcmp(var->value, v->value)) {
3115 found = 1;
3116 break;
3117 }
3118 }
3119 }
3120 }
3121 if (found) {
3122 break;
3123 }
3124 }
3125 if (found) {
3126 var = var->next;
3127 continue;
3128 }
3129 fi = set_fn(fn, sizeof(fn), var->file, configfile, fileset);
3130 f = fopen(fn, "a");
3131 if (!f) {
3132 ast_debug(1, "Unable to open for writing: %s\n", fn);
3133 ast_verb(2, "Unable to write %s (%s)\n", fn, strerror(errno));
3134 if (fi) {
3135 ao2_ref(fi, -1);
3136 }
3137 ao2_ref(fileset, -1);
3138 return -1;
3139 }
3140
3141 /* dump any includes that happen before this variable */
3142 for (incl = cfg->includes_root; incl; incl = incl->next) {
3143 if (strcmp(incl->include_location_file, var->file) == 0) {
3144 if (var->lineno > incl->include_location_lineno && !incl->output) {
3145 /* add the precomments */
3147 print_comment(f, incl->precomments);
3148 /* and the include */
3149 print_include(f, incl);
3150 incl->output = 1;
3151 }
3152 }
3153 }
3154
3155 /* dump any comments that happen before this variable */
3156 insert_leading_blank_lines(f, fi, var->precomments, var->lineno);
3157 print_comment(f, var->precomments);
3158
3159 { /* Block for 'escaped' scope */
3160 int escaped_len = 2 * strlen(var->value) + 1;
3161 char escaped[escaped_len];
3162
3163 ast_escape_semicolons(var->value, escaped, escaped_len);
3164
3165 if (var->sameline) {
3166 fprintf(f, "%s %s %s %s", var->name, (var->object ? "=>" : "="),
3167 escaped, var->sameline->cmt);
3168 } else {
3169 fprintf(f, "%s %s %s\n", var->name, (var->object ? "=>" : "="),
3170 escaped);
3171 }
3172 }
3173
3174 /* dump any trailing comments */
3175 print_comment(f, var->trailing);
3176 if (var->blanklines) {
3177 blanklines = var->blanklines;
3178 while (blanklines--)
3179 fprintf(f, "\n");
3180 }
3181
3182 fclose(f);
3183 if (fi) {
3184 ao2_ref(fi, -1);
3185 }
3186
3187 var = var->next;
3188 }
3189 cat = cat->next;
3190 }
3191
3192
3193 /* Now, for files with trailing #include/#exec statements,
3194 we have to make sure every entry is output */
3195 for (incl = cfg->includes_root; incl; incl = incl->next) {
3196 if (!incl->output) {
3197 /* open the respective file */
3198 fi = set_fn(fn, sizeof(fn), incl->include_location_file, configfile, fileset);
3199 f = fopen(fn, "a");
3200 if (!f) {
3201 ast_debug(1, "Unable to open for writing: %s\n", fn);
3202 ast_verb(2, "Unable to write %s (%s)\n", fn, strerror(errno));
3203 if (fi) {
3204 ao2_ref(fi, -1);
3205 }
3206 ao2_ref(fileset, -1);
3207 return -1;
3208 }
3209
3210 /* add the precomments */
3212 print_comment(f, incl->precomments);
3213 /* and the include */
3214 print_include(f, incl);
3215 /* and any trailing comments */
3216 print_comment(f, incl->trailing);
3217
3218 incl->output = 1;
3219 fclose(f);
3220 if (fi) {
3221 ao2_ref(fi, -1);
3222 }
3223 }
3224 }
3225
3226
3227 ast_verb(2, "Saving '%s': saved\n", fn);
3228 } else {
3229 ast_debug(1, "Unable to open for writing: %s\n", fn);
3230 ast_verb(2, "Unable to write '%s' (%s)\n", fn, strerror(errno));
3231 if (fi) {
3232 ao2_ref(fi, -1);
3233 }
3234 ao2_ref(fileset, -1);
3235 return -1;
3236 }
3237
3238 ao2_ref(fileset, -1); /* this should destroy the hash container */
3239
3240 /* pass new configuration to any config hooks */
3241 config_hook_exec(configfile, generator, cfg);
3242
3243 return 0;
3244}
#define PATH_MAX
Definition: asterisk.h:40
#define ast_debug(level,...)
Log a DEBUG message.
#define LOG_ERROR
#define ast_verb(level,...)
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
Definition: linkedlists.h:429
@ CONFIG_STATEMENT_EXEC
Definition: main/config.c:278
static void insert_leading_blank_lines(FILE *fp, struct inclfile *fi, struct ast_comment *precomments, int lineno)
Definition: main/config.c:2832
static int hashtab_compare_strings(void *a, void *b, int flags)
Definition: main/config.c:194
static void gen_header(FILE *f1, const char *configfile, const char *fn, const char *generator)
Definition: main/config.c:2736
static void print_include(FILE *f, struct ast_config_include *incl)
Definition: main/config.c:2912
static int hash_string(const void *obj, const int flags)
Definition: main/config.c:174
static struct inclfile * set_fn(char *fn, size_t fn_size, const char *file, const char *configfile, struct ao2_container *fileset)
Definition: main/config.c:2777
static void print_comment(FILE *f, struct ast_comment *comment)
Definition: main/config.c:2892
static int is_writable(const char *fn)
Definition: main/config.c:2873
static void make_fn(char *fn, size_t fn_size, const char *file, const char *configfile)
Definition: main/config.c:2762
int errno
Generic container type.
struct ast_comment * precomments
Definition: main/config.c:237
struct ast_comment * trailing
Definition: main/config.c:239
struct ast_comment * sameline
Definition: main/config.c:238
Structure to keep comments for rewriting configuration files.
Definition: main/config.c:85
char cmt[0]
Definition: main/config.c:88
struct ast_comment * next
Definition: main/config.c:86
char * include_location_file
file name in which the include occurs
Definition: main/config.c:288
struct ast_config_include::included_files_list included_files
struct ast_config_include * next
Definition: main/config.c:308
struct ast_comment * precomments
Definition: main/config.c:305
enum include_statement_type include_type
Definition: main/config.c:290
struct ast_comment * trailing
Definition: main/config.c:307
struct ast_config_include * includes_root
Definition: main/config.c:260
struct ast_variable * next
struct config_included_file * next
Definition: main/config.c:266
char * ast_escape_semicolons(const char *string, char *outbuf, int buflen)
Escape semicolons found in a string.
Definition: utils.c:811

References AO2_ALLOC_OPT_LOCK_MUTEX, ao2_container_alloc_hash, ao2_ref, ast_debug, ast_escape_semicolons(), AST_LIST_EMPTY, AST_LIST_LAST, AST_LIST_TRAVERSE, ast_log, ast_verb, ast_comment::cmt, config_hook_exec(), CONFIG_SAVE_FLAG_PRESERVE_EFFECTIVE_CONTEXT, CONFIG_STATEMENT_EXEC, errno, ast_category::file, gen_header(), hash_string(), hashtab_compare_strings(), ast_category::ignored, ast_config_include::include_location_file, ast_config_include::include_location_lineno, ast_config_include::include_type, ast_config_include::included_files, ast_config::includes_root, insert_leading_blank_lines(), ast_category_template_instance::inst, is_writable(), ast_category::lineno, LOG_ERROR, make_fn(), ast_variable::name, ast_category_template_instance::name, ast_category::name, ast_variable::next, ast_comment::next, ast_category::next, ast_config_include::next, NULL, ast_config_include::output, config_included_file::path, PATH_MAX, ast_category::precomments, ast_config_include::precomments, print_comment(), print_include(), ast_category::root, ast_config::root, ast_category::sameline, set_fn(), ast_category::template_instances, ast_category::trailing, ast_config_include::trailing, ast_variable::value, and var.

Referenced by action_updateconfig(), and ast_config_text_file_save().

◆ ast_destroy_realtime()

int ast_destroy_realtime ( const char *  family,
const char *  keyfield,
const char *  lookup,
  ... 
)

Destroy realtime configuration.

Parameters
familywhich family/config to be destroyed
keyfieldwhich field to use as the key
lookupwhich value to look for in the key field to match the entry.

This function is used to destroy an entry in realtime configuration space. Additional params are used as keys.

Returns
Number of rows affected, or -1 on error.
Note
You should use the constant SENTINEL to terminate arguments, in order to preserve cross-platform compatibility.

Definition at line 3996 of file main/config.c.

3997{
3998 RAII_VAR(struct ast_variable *, fields, NULL, ast_variables_destroy);
3999 int res = 0;
4000 va_list ap;
4001
4002 va_start(ap, lookup);
4003 if (realtime_arguments_to_fields(ap, &fields)) {
4004 res = -1;
4005 }
4006 va_end(ap);
4007
4008 if (res) {
4009 return -1;
4010 }
4011
4012 return ast_destroy_realtime_fields(family, keyfield, lookup, fields);
4013}
int ast_destroy_realtime_fields(const char *family, const char *keyfield, const char *lookup, const struct ast_variable *fields)
Destroy realtime configuration.
Definition: main/config.c:3976
#define realtime_arguments_to_fields(ap, result)
Definition: main/config.c:3557
#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 ast_destroy_realtime_fields(), ast_variables_destroy(), NULL, RAII_VAR, and realtime_arguments_to_fields.

Referenced by cli_realtime_destroy(), function_realtime_readdestroy(), leave_voicemail(), msg_create_from_file(), and vm_delete().

◆ ast_destroy_realtime_fields()

int ast_destroy_realtime_fields ( const char *  family,
const char *  keyfield,
const char *  lookup,
const struct ast_variable fields 
)

Destroy realtime configuration.

Parameters
familywhich family/config to be destroyed
keyfieldwhich field to use as the key
lookupwhich value to look for in the key field to match the entry.
fieldsfields themselves

This function is used to destroy an entry in realtime configuration space. Additional params are used as keys.

Returns
Number of rows affected, or -1 on error.

Definition at line 3976 of file main/config.c.

3977{
3978 struct ast_config_engine *eng;
3979 int res = -1, i;
3980 char db[256];
3981 char table[256];
3982
3983 for (i = 1; ; i++) {
3984 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) {
3985 if (eng->destroy_func && ((res = eng->destroy_func(db, table, keyfield, lookup, fields)) >= 0)) {
3986 break;
3987 }
3988 } else {
3989 break;
3990 }
3991 }
3992
3993 return res;
3994}
realtime_destroy * destroy_func

References db, ast_config_engine::destroy_func, find_engine(), and table.

Referenced by ast_destroy_realtime(), and sorcery_realtime_delete().

◆ ast_include_find()

static struct ast_config_include * ast_include_find ( struct ast_config conf,
const char *  included_file 
)

Definition at line 1163 of file extconf.c.

1164{
1165 struct ast_config_include *x;
1166 for (x=conf->includes;x;x=x->next)
1167 {
1168 if (strcmp(x->included_file,included_file) == 0)
1169 return x;
1170 }
1171 return 0;
1172}
char * included_file
file name included
Definition: main/config.c:300
All configuration options for http media cache.

References ast_config_include::included_file, and ast_config_include::next.

Referenced by ast_include_new().

◆ ast_include_new()

static struct ast_config_include * ast_include_new ( struct ast_config conf,
const char *  from_file,
const char *  included_file,
int  include_type,
const char *  exec_file,
int  from_lineno,
char *  real_included_file_name,
int  real_included_file_name_size 
)

Definition at line 1074 of file extconf.c.

1075{
1076 /* a file should be included ONCE. Otherwise, if one of the instances is changed,
1077 then all be changed. -- how do we know to include it? -- Handling modified
1078 instances is possible, I'd have
1079 to create a new master for each instance. */
1080 struct ast_config_include *inc;
1081
1083 if (inc)
1084 {
1085 inc->inclusion_count++;
1086 snprintf(real_included_file_name, real_included_file_name_size, "%s~~%d", included_file, inc->inclusion_count);
1087 ast_log(LOG_WARNING,"'%s', line %d: Same File included more than once! This data will be saved in %s if saved back to disk.\n", from_file, from_lineno, real_included_file_name);
1088 } else
1089 *real_included_file_name = 0;
1090
1091 inc = ast_calloc(1,sizeof(struct ast_config_include));
1092 inc->include_location_file = ast_strdup(from_file);
1093 inc->include_location_lineno = from_lineno;
1094 if (!ast_strlen_zero(real_included_file_name))
1095 inc->included_file = ast_strdup(real_included_file_name);
1096 else
1098
1099 inc->exec = is_exec;
1100 if (is_exec)
1102
1103 /* attach this new struct to the conf struct */
1104 inc->next = conf->includes;
1105 conf->includes = inc;
1106
1107 return inc;
1108}
static struct ast_config_include * ast_include_find(struct ast_config *conf, const char *included_file)
Definition: extconf.c:1163
static void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Definition: extconf.c:2194
#define LOG_WARNING
Definition: extconf.c:139
static force_inline int ast_strlen_zero(const char *s)
Definition: extconf.c:952
char * exec_file
if it's an exec, you'll have both the /var/tmp to read, and the original script
Definition: main/config.c:295

References ast_calloc, ast_include_find(), ast_includes_destroy(), AST_LIST_INSERT_TAIL, ast_log, ast_strdup, ast_strlen_zero(), CONFIG_STATEMENT_EXEC, CONFIG_STATEMENT_INCLUDE, CONFIG_STATEMENT_TRYINCLUDE, ast_config_include::exec, ast_config_include::exec_file, ast_config_include::include_location_file, ast_config_include::include_location_lineno, ast_config_include::include_type, ast_config_include::included_file, ast_config_include::included_files, ast_config_include::inclusion_count, LOG_WARNING, make_fn(), MY_GLOB_FLAGS, ast_config_include::next, NULL, config_included_file::path, and PATH_MAX.

Referenced by AST_TEST_DEFINE(), and process_text_line().

◆ ast_include_rename()

void ast_include_rename ( struct ast_config conf,
const char *  from_file,
const char *  to_file 
)

Definition at line 469 of file main/config.c.

470{
471 struct ast_config_include *incl;
472 struct ast_category *cat;
473 char *str;
474
475 int from_len = strlen(from_file);
476 int to_len = strlen(to_file);
477
478 if (strcmp(from_file, to_file) == 0) /* no use wasting time if the name is the same */
479 return;
480
481 /* the manager code allows you to read in one config file, then
482 * write it back out under a different name. But, the new arrangement
483 * ties output lines to the file name. So, before you try to write
484 * the config file to disk, better riffle thru the data and make sure
485 * the file names are changed.
486 */
487 /* file names are on categories, includes (of course), and on variables. So,
488 * traverse all this and swap names */
489
490 for (incl = conf->includes_root; incl; incl = incl->next) {
491 if (strcmp(incl->include_location_file, from_file) == 0) {
492 if (from_len >= to_len)
493 strcpy(incl->include_location_file, to_file);
494 else {
495 /* Keep the old filename if the allocation fails. */
496 str = ast_strdup(to_file);
497 if (str) {
500 }
501 }
502 }
503 }
504 for (cat = conf->root; cat; cat = cat->next) {
505 struct ast_variable **prev;
506 struct ast_variable *v;
507 struct ast_variable *new_var;
508
509 if (strcmp(cat->file, from_file) == 0) {
510 if (from_len >= to_len)
511 strcpy(cat->file, to_file);
512 else {
513 /* Keep the old filename if the allocation fails. */
514 str = ast_strdup(to_file);
515 if (str) {
516 ast_free(cat->file);
517 cat->file = str;
518 }
519 }
520 }
521 for (prev = &cat->root, v = cat->root; v; prev = &v->next, v = v->next) {
522 if (strcmp(v->file, from_file)) {
523 continue;
524 }
525
526 /*
527 * Calculate actual space available. The file string is
528 * intentionally stuffed before the name string just so we can
529 * do this.
530 */
531 if (to_len < v->name - v->file) {
532 /* The new name will fit in the available space. */
533 str = (char *) v->file;/* Stupid compiler complains about discarding qualifiers even though I used a cast. */
534 strcpy(str, to_file);/* SAFE */
535 continue;
536 }
537
538 /* Keep the old filename if the allocation fails. */
539 new_var = ast_variable_new(v->name, v->value, to_file);
540 if (!new_var) {
541 continue;
542 }
543
544 /* Move items from the old list node to the replacement node. */
545 ast_variable_move(new_var, v);
546
547 /* Replace the old node in the list with the new node. */
548 new_var->next = v->next;
549 if (cat->last == v) {
550 cat->last = new_var;
551 }
552 *prev = new_var;
553
555
556 v = new_var;
557 }
558 }
559}
#define ast_free(a)
Definition: astmm.h:180
#define ast_variable_new(name, value, filename)
static void ast_variable_destroy(struct ast_variable *doomed)
Definition: main/config.c:621
static void ast_variable_move(struct ast_variable *dst_var, struct ast_variable *src_var)
Definition: main/config.c:348

References ast_free, ast_strdup, ast_variable_destroy(), ast_variable_move(), ast_variable_new, ast_variable::file, ast_category::file, ast_config_include::include_location_file, ast_category::last, name, ast_variable::name, ast_variable::next, ast_category::next, ast_config_include::next, ast_category::root, str, and ast_variable::value.

Referenced by action_updateconfig().

◆ ast_load_realtime()

struct ast_variable * ast_load_realtime ( const char *  family,
  ... 
)

Definition at line 3726 of file main/config.c.

3727{
3728 RAII_VAR(struct ast_variable *, fields, NULL, ast_variables_destroy);
3729 int field_res = 0;
3730 va_list ap;
3731
3732 va_start(ap, family);
3733 if (realtime_arguments_to_fields(ap, &fields)) {
3734 field_res = -1;
3735 }
3736 va_end(ap);
3737
3738 if (field_res) {
3739 return NULL;
3740 }
3741
3742 if (!fields) {
3743 return NULL;
3744 }
3745
3746 return ast_load_realtime_fields(family, fields);
3747}
struct ast_variable * ast_load_realtime_fields(const char *family, const struct ast_variable *fields)
Retrieve realtime configuration.
Definition: main/config.c:3691

References ast_load_realtime_fields(), ast_variables_destroy(), NULL, RAII_VAR, and realtime_arguments_to_fields.

Referenced by conf_run(), copy_plain_file(), find_conf_realtime(), find_load_queue_rt_friendly(), find_realtime(), find_user_realtime(), leave_queue(), load_realtime_musiconhold(), queue_function_queuegetchannel(), queue_function_queuewaitingcount(), realtime_peer(), realtime_switch_common(), realtime_user(), and rt_extend_conf().

◆ ast_load_realtime_all()

struct ast_variable * ast_load_realtime_all ( const char *  family,
  ... 
)

Definition at line 3674 of file main/config.c.

3675{
3676 RAII_VAR(struct ast_variable *, fields, NULL, ast_variables_destroy);
3677 struct ast_variable *res = NULL;
3678 va_list ap;
3679
3680 va_start(ap, family);
3681 realtime_arguments_to_fields(ap, &fields);
3682 va_end(ap);
3683
3684 if (fields) {
3685 res = ast_load_realtime_all_fields(family, fields);
3686 }
3687
3688 return res;
3689}
struct ast_variable * ast_load_realtime_all_fields(const char *family, const struct ast_variable *fields)
Definition: main/config.c:3653

References ast_load_realtime_all_fields(), ast_variables_destroy(), NULL, RAII_VAR, and realtime_arguments_to_fields.

Referenced by cli_realtime_load(), function_realtime_read(), function_realtime_readdestroy(), and realtimefield_read().

◆ ast_load_realtime_all_fields()

struct ast_variable * ast_load_realtime_all_fields ( const char *  family,
const struct ast_variable fields 
)

Definition at line 3653 of file main/config.c.

3654{
3655 struct ast_config_engine *eng;
3656 char db[256];
3657 char table[256];
3658 struct ast_variable *res=NULL;
3659 int i;
3660
3661 for (i = 1; ; i++) {
3662 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) {
3663 if (eng->realtime_func && (res = eng->realtime_func(db, table, fields))) {
3664 return res;
3665 }
3666 } else {
3667 return NULL;
3668 }
3669 }
3670
3671 return res;
3672}
realtime_var_get * realtime_func

References db, find_engine(), NULL, ast_config_engine::realtime_func, and table.

Referenced by ast_load_realtime_all(), and ast_load_realtime_fields().

◆ ast_load_realtime_fields()

struct ast_variable * ast_load_realtime_fields ( const char *  family,
const struct ast_variable fields 
)

Retrieve realtime configuration.

Parameters
familywhich family/config to lookup
fieldswhich fields to lookup

This will use builtin configuration backends to look up a particular entity in realtime and return a variable list of its parameters.

Note
Unlike the variables in ast_config, the resulting list of variables MUST be freed with ast_variables_destroy() as there is no container.
The difference between these two calls is that ast_load_realtime excludes fields whose values are NULL, while ast_load_realtime_all loads all columns.
You should use the constant SENTINEL to terminate arguments, in order to preserve cross-platform compatibility.

Definition at line 3691 of file main/config.c.

3692{
3693 struct ast_variable *res;
3694 struct ast_variable *cur;
3695 struct ast_variable **prev;
3696
3697 res = ast_load_realtime_all_fields(family, fields);
3698
3699 /* Filter the list. */
3700 prev = &res;
3701 cur = res;
3702 while (cur) {
3703 if (ast_strlen_zero(cur->value)) {
3704 /* Eliminate empty entries */
3705 struct ast_variable *next;
3706
3707 next = cur->next;
3708 *prev = next;
3710 cur = next;
3711 } else {
3712 /* Make blank entries empty and keep them. */
3713 if (cur->value[0] == ' ' && cur->value[1] == '\0') {
3714 char *vptr = (char *) cur->value;
3715
3716 vptr[0] = '\0';
3717 }
3718
3719 prev = &cur->next;
3720 cur = cur->next;
3721 }
3722 }
3723 return res;
3724}
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65

References ast_load_realtime_all_fields(), ast_strlen_zero(), ast_variable_destroy(), ast_variable::next, ast_category::next, ast_category::prev, and ast_variable::value.

Referenced by ast_load_realtime(), and sorcery_realtime_retrieve_fields().

◆ ast_load_realtime_multientry()

struct ast_config * ast_load_realtime_multientry ( const char *  family,
  ... 
)

Retrieve realtime configuration.

Parameters
familywhich family/config to lookup

This will use builtin configuration backends to look up a particular entity in realtime and return a variable list of its parameters. Unlike the ast_load_realtime, this function can return more than one entry and is thus stored inside a traditional ast_config structure rather than just returning a linked list of variables.

Returns
An ast_config with one or more results
Return values
NULLError or no results returned
Note
You should use the constant SENTINEL to terminate arguments, in order to preserve cross-platform compatibility.

Definition at line 3842 of file main/config.c.

3843{
3844 RAII_VAR(struct ast_variable *, fields, NULL, ast_variables_destroy);
3845 va_list ap;
3846
3847 va_start(ap, family);
3848 realtime_arguments_to_fields(ap, &fields);
3849 va_end(ap);
3850
3851 if (!fields) {
3852 return NULL;
3853 }
3854
3855 return ast_load_realtime_multientry_fields(family, fields);
3856}
struct ast_config * ast_load_realtime_multientry_fields(const char *family, const struct ast_variable *fields)
Retrieve realtime configuration.
Definition: main/config.c:3816

References ast_load_realtime_multientry_fields(), ast_variables_destroy(), NULL, RAII_VAR, and realtime_arguments_to_fields.

Referenced by __queues_show(), conf_exec(), find_load_queue_rt_friendly(), find_realtime(), load_module(), load_realtime_musiconhold(), load_realtime_queues(), load_realtime_rules(), named_acl_find_realtime(), realtime_directory(), realtime_switch_common(), set_member_value(), show_users_realtime(), and update_realtime_members().

◆ ast_load_realtime_multientry_fields()

struct ast_config * ast_load_realtime_multientry_fields ( const char *  family,
const struct ast_variable fields 
)

Retrieve realtime configuration.

Parameters
familywhich family/config to lookup
fieldslist of fields

This will use builtin configuration backends to look up a particular entity in realtime and return a variable list of its parameters. Unlike the ast_load_realtime, this function can return more than one entry and is thus stored inside a traditional ast_config structure rather than just returning a linked list of variables.

Returns
An ast_config with one or more results
Return values
NULLError or no results returned

Definition at line 3816 of file main/config.c.

3817{
3818 struct ast_config_engine *eng;
3819 char db[256];
3820 char table[256];
3821 struct ast_config *res = NULL;
3822 int i;
3823
3824 for (i = 1; ; i++) {
3825 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) {
3826 if (eng->realtime_multi_func && (res = eng->realtime_multi_func(db, table, fields))) {
3827 /* If we were returned an empty cfg, destroy it and return NULL */
3828 if (!res->root) {
3829 ast_config_destroy(res);
3830 res = NULL;
3831 }
3832 break;
3833 }
3834 } else {
3835 break;
3836 }
3837 }
3838
3839 return res;
3840}
realtime_multi_get * realtime_multi_func

References ast_config_destroy(), db, find_engine(), NULL, ast_config_engine::realtime_multi_func, ast_config::root, and table.

Referenced by ast_load_realtime_multientry(), and sorcery_realtime_retrieve_multiple().

◆ ast_parse_arg()

int ast_parse_arg ( const char *  arg,
enum ast_parse_flags  flags,
void *  p_result,
  ... 
)

The argument parsing routine.

Parameters
argthe string to parse. It is not modified.
flagscombination of ast_parse_flags to specify the return type and additional checks.
p_resultpointer to the result. NULL is valid here, and can be used to perform only the validity checks.
...extra arguments are required according to flags.
Return values
0in case of success, != 0 otherwise.
resultreturns the parsed value in case of success, the default value in case of error, or it is left unchanged in case of error and no default specified. Note that in certain cases (e.g. sockaddr_in, with multi-field return values) some of the fields in result may be changed even if an error occurs.

Examples of use: ast_parse_arg("223", PARSE_INT32|PARSE_IN_RANGE, &a, -1000, 1000); returns 0, a = 223 ast_parse_arg("22345", PARSE_INT32|PARSE_IN_RANGE|PARSE_DEFAULT, &a, 9999, 10, 100); returns 1, a = 9999 ast_parse_arg("22345ssf", PARSE_UINT32|PARSE_IN_RANGE, &b, 10, 100); returns 1, b unchanged ast_parse_arg("12", PARSE_UINT32|PARSE_IN_RANGE|PARSE_RANGE_DEFAULTS, &a, 1, 10); returns 1, a = 10 ast_parse_arg("223", PARSE_TIMELEN|PARSE_IN_RANGE, &a, TIMELEN_SECONDS, -1000, 1000); returns 0, a = 1000 ast_parse_arg("223", PARSE_TIMELEN|PARSE_IN_RANGE, &a, TIMELEN_SECONDS, -1000, 250000); returns 0, a = 223000 ast_parse_arg("223", PARSE_TIMELEN|PARSE_IN_RANGE|PARSE_DEFAULT, &a, TIMELEN_SECONDS, 9999, -1000, 250000); returns 0, a = 9999 ast_parse_arg("www.foo.biz:44", PARSE_INADDR, &sa); returns 0, sa contains address and port ast_parse_arg("www.foo.biz", PARSE_INADDR|PARSE_PORT_REQUIRE, &sa); returns 1 because port is missing, sa contains address

The argument parsing routine.

Examples
app_skel.c.

Definition at line 4047 of file main/config.c.

4049{
4050 va_list ap;
4051 int error = 0;
4052
4053 va_start(ap, p_result);
4054 switch (flags & PARSE_TYPE) {
4055 case PARSE_INT32:
4056 {
4057 long int x = 0;
4058 int32_t *result = p_result;
4059 int32_t def = result ? *result : 0, high = INT32_MAX, low = INT32_MIN;
4060 char *endptr = NULL;
4061
4062 /* optional arguments: default value and/or (low, high) */
4063 if (flags & PARSE_DEFAULT) {
4064 def = va_arg(ap, int32_t);
4065 }
4066 if (flags & (PARSE_IN_RANGE | PARSE_OUT_RANGE)) {
4067 low = va_arg(ap, int32_t);
4068 high = va_arg(ap, int32_t);
4069 }
4070 if (ast_strlen_zero(arg)) {
4071 error = 1;
4072 goto int32_done;
4073 }
4074 errno = 0;
4075 x = strtol(arg, &endptr, 0);
4076 if (*endptr || errno || x < INT32_MIN || x > INT32_MAX) {
4077 /* Parse error, or type out of int32_t bounds */
4078 error = 1;
4079 goto int32_done;
4080 }
4081 error = (x < low) || (x > high);
4082 if (flags & PARSE_RANGE_DEFAULTS) {
4083 if (x < low) {
4084 def = low;
4085 } else if (x > high) {
4086 def = high;
4087 }
4088 }
4089 if (flags & PARSE_OUT_RANGE) {
4090 error = !error;
4091 }
4092int32_done:
4093 if (result) {
4094 *result = error ? def : x;
4095 }
4096
4097 ast_debug(3, "extract int from [%s] in [%d, %d] gives [%ld](%d)\n",
4098 arg, low, high, result ? *result : x, error);
4099 break;
4100 }
4101
4102 case PARSE_UINT32:
4103 {
4104 unsigned long int x = 0;
4105 uint32_t *result = p_result;
4106 uint32_t def = result ? *result : 0, low = 0, high = UINT32_MAX;
4107 char *endptr = NULL;
4108
4109 /* optional argument: first default value, then range */
4110 if (flags & PARSE_DEFAULT) {
4111 def = va_arg(ap, uint32_t);
4112 }
4113 if (flags & (PARSE_IN_RANGE|PARSE_OUT_RANGE)) {
4114 /* range requested, update bounds */
4115 low = va_arg(ap, uint32_t);
4116 high = va_arg(ap, uint32_t);
4117 }
4118
4119 if (ast_strlen_zero(arg)) {
4120 error = 1;
4121 goto uint32_done;
4122 }
4123 /* strtoul will happily and silently negate negative numbers */
4124 arg = ast_skip_blanks(arg);
4125 if (*arg == '-') {
4126 error = 1;
4127 goto uint32_done;
4128 }
4129 errno = 0;
4130 x = strtoul(arg, &endptr, 0);
4131 if (*endptr || errno || x > UINT32_MAX) {
4132 error = 1;
4133 goto uint32_done;
4134 }
4135 error = (x < low) || (x > high);
4136 if (flags & PARSE_RANGE_DEFAULTS) {
4137 if (x < low) {
4138 def = low;
4139 } else if (x > high) {
4140 def = high;
4141 }
4142 }
4143 if (flags & PARSE_OUT_RANGE) {
4144 error = !error;
4145 }
4146uint32_done:
4147 if (result) {
4148 *result = error ? def : x;
4149 }
4150 ast_debug(3, "extract uint from [%s] in [%u, %u] gives [%lu](%d)\n",
4151 arg, low, high, result ? *result : x, error);
4152 break;
4153 }
4154
4155 case PARSE_TIMELEN:
4156 {
4157 int x = 0;
4158 int *result = p_result;
4159 int def = result ? *result : 0;
4160 int high = INT_MAX;
4161 int low = INT_MIN;
4162 enum ast_timelen defunit;
4163
4164 defunit = va_arg(ap, enum ast_timelen);
4165 /* optional arguments: default value and/or (low, high) */
4166 if (flags & PARSE_DEFAULT) {
4167 def = va_arg(ap, int);
4168 }
4169 if (flags & (PARSE_IN_RANGE | PARSE_OUT_RANGE)) {
4170 low = va_arg(ap, int);
4171 high = va_arg(ap, int);
4172 }
4173 if (ast_strlen_zero(arg)) {
4174 error = 1;
4175 goto timelen_done;
4176 }
4177 error = ast_app_parse_timelen(arg, &x, defunit);
4178 if (error || x < INT_MIN || x > INT_MAX) {
4179 /* Parse error, or type out of int bounds */
4180 error = 1;
4181 goto timelen_done;
4182 }
4183 error = (x < low) || (x > high);
4184 if (flags & PARSE_RANGE_DEFAULTS) {
4185 if (x < low) {
4186 def = low;
4187 } else if (x > high) {
4188 def = high;
4189 }
4190 }
4191 if (flags & PARSE_OUT_RANGE) {
4192 error = !error;
4193 }
4194timelen_done:
4195 if (result) {
4196 *result = error ? def : x;
4197 }
4198
4199 ast_debug(3, "extract timelen from [%s] in [%d, %d] gives [%d](%d)\n",
4200 arg, low, high, result ? *result : x, error);
4201 break;
4202 }
4203
4204 case PARSE_DOUBLE:
4205 {
4206 double *result = p_result;
4207 double x = 0, def = result ? *result : 0, low = -HUGE_VAL, high = HUGE_VAL;
4208 char *endptr = NULL;
4209
4210 /* optional argument: first default value, then range */
4211 if (flags & PARSE_DEFAULT) {
4212 def = va_arg(ap, double);
4213 }
4214 if (flags & (PARSE_IN_RANGE | PARSE_OUT_RANGE)) {
4215 /* range requested, update bounds */
4216 low = va_arg(ap, double);
4217 high = va_arg(ap, double);
4218 }
4219 if (ast_strlen_zero(arg)) {
4220 error = 1;
4221 goto double_done;
4222 }
4223 errno = 0;
4224 x = strtod(arg, &endptr);
4225 if (*endptr || errno == ERANGE) {
4226 error = 1;
4227 goto double_done;
4228 }
4229 error = (x < low) || (x > high);
4230 if (flags & PARSE_OUT_RANGE) {
4231 error = !error;
4232 }
4233double_done:
4234 if (result) {
4235 *result = error ? def : x;
4236 }
4237 ast_debug(3, "extract double from [%s] in [%f, %f] gives [%f](%d)\n",
4238 arg, low, high, result ? *result : x, error);
4239 break;
4240 }
4241 case PARSE_ADDR:
4242 {
4243 struct ast_sockaddr *addr = (struct ast_sockaddr *)p_result;
4244
4245 if (!ast_sockaddr_parse(addr, arg, flags & PARSE_PORT_MASK)) {
4246 error = 1;
4247 }
4248
4249 ast_debug(3, "extract addr from %s gives %s(%d)\n",
4250 arg, ast_sockaddr_stringify(addr), error);
4251
4252 break;
4253 }
4254 case PARSE_INADDR: /* TODO Remove this (use PARSE_ADDR instead). */
4255 {
4256 char *port, *buf;
4257 struct sockaddr_in _sa_buf; /* buffer for the result */
4258 struct sockaddr_in *sa = p_result ?
4259 (struct sockaddr_in *)p_result : &_sa_buf;
4260 /* default is either the supplied value or the result itself */
4261 struct sockaddr_in *def = (flags & PARSE_DEFAULT) ?
4262 va_arg(ap, struct sockaddr_in *) : sa;
4263 struct ast_sockaddr addr = { {0,} };
4264
4265 memset(&_sa_buf, '\0', sizeof(_sa_buf)); /* clear buffer */
4266 /* duplicate the string to strip away the :port */
4267 port = ast_strdupa(arg);
4268 buf = strsep(&port, ":");
4269 sa->sin_family = AF_INET; /* assign family */
4270 /*
4271 * honor the ports flag setting, assign default value
4272 * in case of errors or field unset.
4273 */
4274 flags &= PARSE_PORT_MASK; /* the only flags left to process */
4275 if (port) {
4276 if (flags == PARSE_PORT_FORBID) {
4277 error = 1; /* port was forbidden */
4278 sa->sin_port = def->sin_port;
4279 } else if (flags == PARSE_PORT_IGNORE)
4280 sa->sin_port = def->sin_port;
4281 else /* accept or require */
4282 sa->sin_port = htons(strtol(port, NULL, 0));
4283 } else {
4284 sa->sin_port = def->sin_port;
4285 if (flags == PARSE_PORT_REQUIRE)
4286 error = 1;
4287 }
4288 /* Now deal with host part, even if we have errors before. */
4289 if (ast_sockaddr_resolve_first_af(&addr, buf, PARSE_PORT_FORBID, AF_INET)) {
4290 error = 1;
4291 sa->sin_addr = def->sin_addr;
4292 } else {
4293 struct sockaddr_in tmp;
4294 ast_sockaddr_to_sin(&addr, &tmp);
4295 sa->sin_addr = tmp.sin_addr;
4296 }
4297 ast_debug(3,
4298 "extract inaddr from [%s] gives [%s:%d](%d)\n",
4299 arg, ast_inet_ntoa(sa->sin_addr),
4300 ntohs(sa->sin_port), error);
4301 break;
4302 }
4303 }
4304 va_end(ap);
4305 return error;
4306}
#define INT32_MAX
Definition: ast_expr2f.c:79
#define INT32_MIN
Definition: ast_expr2f.c:70
#define UINT32_MAX
Definition: ast_expr2f.c:88
char * strsep(char **str, const char *delims)
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
int ast_app_parse_timelen(const char *timestr, int *result, enum ast_timelen defunit)
Common routine to parse time lengths, with optional time unit specifier.
Definition: main/app.c:3273
int ast_sockaddr_resolve_first_af(struct ast_sockaddr *addr, const char *name, int flag, int family)
Return the first entry from ast_sockaddr_resolve filtered by address family.
Definition: netsock2.c:337
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Definition: netsock2.h:256
#define ast_sockaddr_to_sin(addr, sin)
Converts a struct ast_sockaddr to a struct sockaddr_in.
Definition: netsock2.h:765
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
Definition: netsock2.c:230
const char * ast_inet_ntoa(struct in_addr ia)
thread-safe replacement for inet_ntoa().
Definition: utils.c:928
char * ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition: strings.h:161
Socket address structure.
Definition: netsock2.h:97
int error(const char *format,...)
Definition: utils/frame.c:999

References ast_app_parse_timelen(), ast_debug, ast_inet_ntoa(), ast_skip_blanks(), ast_sockaddr_parse(), ast_sockaddr_resolve_first_af(), ast_sockaddr_stringify(), ast_sockaddr_to_sin, ast_strdupa, ast_strlen_zero(), buf, errno, error(), INT32_MAX, INT32_MIN, NULL, PARSE_ADDR, PARSE_DEFAULT, PARSE_DOUBLE, PARSE_IN_RANGE, PARSE_INADDR, PARSE_INT32, PARSE_OUT_RANGE, PARSE_PORT_FORBID, PARSE_PORT_IGNORE, PARSE_PORT_MASK, PARSE_PORT_REQUIRE, PARSE_RANGE_DEFAULTS, PARSE_TIMELEN, PARSE_TYPE, PARSE_UINT32, result, strsep(), and UINT32_MAX.

Referenced by __ast_http_load(), __init_manager(), app_exec(), AST_TEST_DEFINE(), ast_tls_read_conf(), build_peer(), build_user(), configure_local_rtp(), double_handler_fn(), general_set(), iax2_call(), iax2_request(), int_handler_fn(), load_asterisk_conf(), load_config(), new_realtime_sqlite3_db(), realtime_peer(), reload_config(), rtp_reload(), sample_rate_handler(), set_config(), setup_rtp_connection(), setup_rtp_remote(), setup_udptl_connection(), sockaddr_handler_fn(), timelen_handler_fn(), uint_handler_fn(), and xfer_set().

◆ ast_realtime_decode_chunk()

char * ast_realtime_decode_chunk ( char *  chunk)

Remove standard encoding from realtime values, which ensures that a semicolon embedded within a single value is not treated upon retrieval as multiple values.

Parameters
chunkData to be decoded
Returns
The decoded data, in the original buffer
Since
1.8
Warning
This function modifies the original buffer

Definition at line 4015 of file main/config.c.

4016{
4017 char *orig = chunk;
4018 for (; *chunk; chunk++) {
4019 if (*chunk == '^' && strchr("0123456789ABCDEFabcdef", chunk[1]) && strchr("0123456789ABCDEFabcdef", chunk[2])) {
4020 sscanf(chunk + 1, "%02hhX", (unsigned char *)chunk);
4021 memmove(chunk + 1, chunk + 3, strlen(chunk + 3) + 1);
4022 }
4023 }
4024 return orig;
4025}

Referenced by realtime_multi_pgsql(), and realtime_pgsql().

◆ ast_realtime_enabled()

int ast_realtime_enabled ( void  )

Check if there's any realtime engines loaded.

Definition at line 3764 of file main/config.c.

3765{
3766 return config_maps ? 1 : 0;
3767}
static struct ast_config_map * config_maps

References config_maps.

Referenced by action_coresettings(), ast_check_realtime(), and handle_show_settings().

◆ ast_realtime_encode_chunk()

char * ast_realtime_encode_chunk ( struct ast_str **  dest,
ssize_t  maxlen,
const char *  chunk 
)

Encodes a chunk of data for realtime.

Parameters
destDestination buffer
maxlenLength passed through to ast_str_* functions
chunkSource data to be encoded
Returns
Buffer within dest
Since
1.8

Definition at line 4027 of file main/config.c.

4028{
4029 if (!strchr(chunk, ';') && !strchr(chunk, '^')) {
4030 ast_str_set(dest, maxlen, "%s", chunk);
4031 } else {
4032 ast_str_reset(*dest);
4033 for (; *chunk; chunk++) {
4034 if (strchr(";^", *chunk)) {
4035 ast_str_append(dest, maxlen, "^%02hhX", *chunk);
4036 } else {
4037 ast_str_append(dest, maxlen, "%c", *chunk);
4038 }
4039 }
4040 }
4041 return ast_str_buffer(*dest);
4042}
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
void ast_str_reset(struct ast_str *buf)
Reset the content of a dynamic string. Useful before a series of ast_str_append.
Definition: strings.h:693
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

References ast_str_append(), ast_str_buffer(), ast_str_reset(), and ast_str_set().

◆ ast_realtime_is_mapping_defined()

int ast_realtime_is_mapping_defined ( const char *  family)

Determine if a mapping exists for a given family.

Parameters
familywhich family you are looking to see if a mapping exists for
Return values
1if it is mapped
0if it is not

Definition at line 3413 of file main/config.c.

3414{
3415 struct ast_config_map *map;
3417
3418 for (map = config_maps; map; map = map->next) {
3419 if (!strcasecmp(family, map->name)) {
3420 return 1;
3421 }
3422 }
3423 ast_debug(5, "Failed to find a realtime mapping for %s\n", family);
3424
3425 return 0;
3426}
struct ast_config_map * next
Definition: main/config.c:201
const char * name
Definition: main/config.c:204

References ast_debug, config_lock, config_maps, lock, ast_config_map::name, ast_config_map::next, and SCOPED_MUTEX.

Referenced by ast_named_acl_find(), and sorcery_realtime_open().

◆ ast_realtime_require_field()

int ast_realtime_require_field ( const char *  family,
  ... 
)

Inform realtime what fields that may be stored.

Since
1.6.1
Parameters
familywhich family/config is referenced

This will inform builtin configuration backends that particular fields may be updated during the use of that configuration section. This is mainly to be used during startup routines, to ensure that various fields exist in the backend. The backends may take various actions, such as creating new fields in the data store or warning the administrator that new fields may need to be created, in order to ensure proper function.

The arguments are specified in groups of 3: column name, column type, and column size. The column types are specified as integer constants, defined by the enum require_type. Note that the size is specified as the number of equivalent character fields that a field may take up, even if a field is otherwise specified as an integer type. This is due to the fact that some fields have historically been specified as character types, even if they contained integer values.

A family should always specify its fields to the minimum necessary requirements to fulfill all possible values (within reason; for example, a timeout value may reasonably be specified as an INTEGER2, with size 5. Even though values above 32767 seconds are possible, they are unlikely to be useful, and we should not complain about that size).

Return values
0Required fields met specified standards
-1One or more fields was missing or insufficient
Note
You should use the constant SENTINEL to terminate arguments, in order to preserve cross-platform compatibility.

TODO The return value of this function is routinely ignored. Ignoring the return value means that it's mostly pointless to be calling this. You'll see some warning messages potentially, but that's it.

XXX This function is super useful for detecting configuration problems early, but unfortunately, the latest in configuration management, sorcery, doesn't work well with this. Users of sorcery are familiar with the fields they will need to write but don't know if realtime is being used. Sorcery knows what storage mechanism is being used but has no high-level knowledge of what sort of data is going to be written.

Definition at line 3769 of file main/config.c.

3770{
3771 struct ast_config_engine *eng;
3772 char db[256];
3773 char table[256];
3774 va_list ap, aq;
3775 int res = -1, i;
3776
3777 va_start(ap, family);
3778 for (i = 1; ; i++) {
3779 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) {
3780 va_copy(aq, ap);
3781 /* If the require succeeds, it returns 0. */
3782 if (eng->require_func && !(res = eng->require_func(db, table, aq))) {
3783 va_end(aq);
3784 break;
3785 }
3786 va_end(aq);
3787 } else {
3788 break;
3789 }
3790 }
3791 va_end(ap);
3792
3793 return res;
3794}
realtime_require * require_func

References db, find_engine(), ast_config_engine::require_func, and table.

Referenced by ast_queue_log(), change_password_realtime(), conf_run(), load_module(), and logger_queue_rt_start().

◆ ast_rq_is_int()

int ast_rq_is_int ( require_type  type)
inline

Check if require type is an integer type.

Definition at line 1319 of file include/asterisk/config.h.

Referenced by require_mysql(), require_odbc(), and require_pgsql().

◆ ast_store_realtime()

int ast_store_realtime ( const char *  family,
  ... 
)

Create realtime configuration.

Parameters
familywhich family/config to be created

This function is used to create a parameter in realtime configuration space.

Returns
Number of rows affected, or -1 on error.
Note
On the MySQL engine only, for reasons of backwards compatibility, the return value is the insert ID. This value is nonportable and may be changed in a future version to match the other engines.
You should use the constant SENTINEL to terminate arguments, in order to preserve cross-platform compatibility.

Definition at line 3960 of file main/config.c.

3961{
3962 RAII_VAR(struct ast_variable *, fields, NULL, ast_variables_destroy);
3963 va_list ap;
3964
3965 va_start(ap, family);
3966 realtime_arguments_to_fields(ap, &fields);
3967 va_end(ap);
3968
3969 if (!fields) {
3970 return -1;
3971 }
3972
3973 return ast_store_realtime_fields(family, fields);
3974}
int ast_store_realtime_fields(const char *family, const struct ast_variable *fields)
Create realtime configuration.
Definition: main/config.c:3939

References ast_store_realtime_fields(), ast_variables_destroy(), NULL, RAII_VAR, and realtime_arguments_to_fields.

Referenced by ast_queue_log(), cli_realtime_store(), copy_plain_file(), function_realtime_store(), leave_voicemail(), and msg_create_from_file().

◆ ast_store_realtime_fields()

int ast_store_realtime_fields ( const char *  family,
const struct ast_variable fields 
)

Create realtime configuration.

Parameters
familywhich family/config to be created
fieldsfields themselves

This function is used to create a parameter in realtime configuration space.

Returns
Number of rows affected, or -1 on error.
Note
On the MySQL engine only, for reasons of backwards compatibility, the return value is the insert ID. This value is nonportable and may be changed in a future version to match the other engines.

Definition at line 3939 of file main/config.c.

3940{
3941 struct ast_config_engine *eng;
3942 int res = -1, i;
3943 char db[256];
3944 char table[256];
3945
3946 for (i = 1; ; i++) {
3947 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) {
3948 /* If the store succeeds, it returns >= 0*/
3949 if (eng->store_func && ((res = eng->store_func(db, table, fields)) >= 0)) {
3950 break;
3951 }
3952 } else {
3953 break;
3954 }
3955 }
3956
3957 return res;
3958}
realtime_store * store_func

References db, find_engine(), ast_config_engine::store_func, and table.

Referenced by ast_store_realtime(), and sorcery_realtime_create().

◆ ast_unload_realtime()

int ast_unload_realtime ( const char *  family)

Release any resources cached for a realtime family.

Since
1.6.1
Parameters
familywhich family/config to destroy

Various backends may cache attributes about a realtime data storage facility; on reload, a front end resource may request to purge that cache.

Return values
0If any cache was purged
-1If no cache was found

Definition at line 3796 of file main/config.c.

3797{
3798 struct ast_config_engine *eng;
3799 char db[256];
3800 char table[256];
3801 int res = -1, i;
3802
3803 for (i = 1; ; i++) {
3804 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) {
3805 if (eng->unload_func) {
3806 /* Do this for ALL engines */
3807 res = eng->unload_func(db, table);
3808 }
3809 } else {
3810 break;
3811 }
3812 }
3813 return res;
3814}
realtime_unload * unload_func

References db, find_engine(), table, and ast_config_engine::unload_func.

Referenced by __unload_module(), load_config_force(), logger_queue_init(), reload(), reload_config(), reload_logger(), and unload_module().

◆ ast_update2_realtime()

int ast_update2_realtime ( const char *  family,
  ... 
)

Update realtime configuration.

Parameters
familywhich family/config to be updated

This function is used to update a parameter in realtime configuration space. It includes the ability to lookup a row based upon multiple key criteria. As a result, this function includes two sentinel values, one to terminate lookup values and the other to terminate the listing of fields to update.

Returns
Number of rows affected, or -1 on error.
Note
You should use the constant SENTINEL to terminate arguments, in order to preserve cross-platform compatibility.

Definition at line 3915 of file main/config.c.

3916{
3917 RAII_VAR(struct ast_variable *, lookup_fields, NULL, ast_variables_destroy);
3918 RAII_VAR(struct ast_variable *, update_fields, NULL, ast_variables_destroy);
3919 va_list ap;
3920
3921 va_start(ap, family);
3922 /* XXX: If we wanted to pass no lookup fields (select all), we'd be
3923 * out of luck. realtime_arguments_to_fields expects at least one key
3924 * value pair. */
3925 realtime_arguments_to_fields(ap, &lookup_fields);
3926 va_end(ap);
3927
3928 va_start(ap, family);
3929 realtime_arguments_to_fields2(ap, 1, &update_fields);
3930 va_end(ap);
3931
3932 if (!lookup_fields || !update_fields) {
3933 return -1;
3934 }
3935
3936 return ast_update2_realtime_fields(family, lookup_fields, update_fields);
3937}
static int realtime_arguments_to_fields2(va_list ap, int skip, struct ast_variable **result)
Definition: main/config.c:3572
int ast_update2_realtime_fields(const char *family, const struct ast_variable *lookup_fields, const struct ast_variable *update_fields)
Update realtime configuration.
Definition: main/config.c:3895

References ast_update2_realtime_fields(), ast_variables_destroy(), NULL, RAII_VAR, realtime_arguments_to_fields, and realtime_arguments_to_fields2().

Referenced by change_password_realtime(), and cli_realtime_update2().

◆ ast_update2_realtime_fields()

int ast_update2_realtime_fields ( const char *  family,
const struct ast_variable lookup_fields,
const struct ast_variable update_fields 
)

Update realtime configuration.

Parameters
familywhich family/config to be updated
lookup_fieldsfields used to look up entries
update_fieldsfields to update

This function is used to update a parameter in realtime configuration space. It includes the ability to lookup a row based upon multiple key criteria. As a result, this function includes two sentinel values, one to terminate lookup values and the other to terminate the listing of fields to update.

Returns
Number of rows affected, or -1 on error.

Definition at line 3895 of file main/config.c.

3896{
3897 struct ast_config_engine *eng;
3898 int res = -1, i;
3899 char db[256];
3900 char table[256];
3901
3902 for (i = 1; ; i++) {
3903 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) {
3904 if (eng->update2_func && !(res = eng->update2_func(db, table, lookup_fields, update_fields))) {
3905 break;
3906 }
3907 } else {
3908 break;
3909 }
3910 }
3911
3912 return res;
3913}
realtime_update2 * update2_func

References db, find_engine(), table, and ast_config_engine::update2_func.

Referenced by ast_update2_realtime().

◆ ast_update_realtime()

int ast_update_realtime ( const char *  family,
const char *  keyfield,
const char *  lookup,
  ... 
)

Update realtime configuration.

Parameters
familywhich family/config to be updated
keyfieldwhich field to use as the key
lookupwhich value to look for in the key field to match the entry.

This function is used to update a parameter in realtime configuration space.

Returns
Number of rows affected, or -1 on error.
Note
You should use the constant SENTINEL to terminate arguments, in order to preserve cross-platform compatibility.

Definition at line 3879 of file main/config.c.

3880{
3881 RAII_VAR(struct ast_variable *, fields, NULL, ast_variables_destroy);
3882 va_list ap;
3883
3884 va_start(ap, lookup);
3885 realtime_arguments_to_fields(ap, &fields);
3886 va_end(ap);
3887
3888 if (!fields) {
3889 return -1;
3890 }
3891
3892 return ast_update_realtime_fields(family, keyfield, lookup, fields);
3893}
int ast_update_realtime_fields(const char *family, const char *keyfield, const char *lookup, const struct ast_variable *fields)
Update realtime configuration.
Definition: main/config.c:3858

References ast_update_realtime_fields(), ast_variables_destroy(), NULL, RAII_VAR, and realtime_arguments_to_fields.

Referenced by cli_realtime_update(), conf_run(), function_realtime_write(), leave_voicemail(), realtime_update_peer(), rename_file(), rt_extend_conf(), set_queue_member_pause(), and update_realtime_member_field().

◆ ast_update_realtime_fields()

int ast_update_realtime_fields ( const char *  family,
const char *  keyfield,
const char *  lookup,
const struct ast_variable fields 
)

Update realtime configuration.

Parameters
familywhich family/config to be updated
keyfieldwhich field to use as the key
lookupwhich value to look for in the key field to match the entry.
fieldsfields to update

This function is used to update a parameter in realtime configuration space.

Returns
Number of rows affected, or -1 on error.

Definition at line 3858 of file main/config.c.

3859{
3860 struct ast_config_engine *eng;
3861 int res = -1, i;
3862 char db[256];
3863 char table[256];
3864
3865 for (i = 1; ; i++) {
3866 if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) {
3867 /* If the update succeeds, it returns >= 0. */
3868 if (eng->update_func && ((res = eng->update_func(db, table, keyfield, lookup, fields)) >= 0)) {
3869 break;
3870 }
3871 } else {
3872 break;
3873 }
3874 }
3875
3876 return res;
3877}
realtime_update * update_func

References db, find_engine(), table, and ast_config_engine::update_func.

Referenced by ast_update_realtime(), and sorcery_realtime_update().

◆ ast_variable_append()

static void ast_variable_append ( struct ast_category category,
struct ast_variable variable 
)

◆ ast_variable_browse()

static struct ast_variable * ast_variable_browse ( const struct ast_config config,
const char *  category_name 
)

Definition at line 1215 of file extconf.c.

1216{
1217 struct ast_category *cat = NULL;
1218
1219 if (category && config->last_browse && (config->last_browse->name == category))
1220 cat = config->last_browse;
1221 else
1222 cat = ast_category_get(config, category);
1223
1224 return (cat) ? cat->root : NULL;
1225}
static struct ast_category * ast_category_get(const struct ast_config *config, const char *category_name)
Definition: extconf.c:1210

References ast_category_get(), config, NULL, and ast_category::root.

Referenced by __ast_http_load(), __ast_http_post_load(), __ast_sorcery_apply_config(), __init_manager(), _dsp_init(), aco_process_category_options(), actual_load_config(), adsi_load(), ast_cli_perms_init(), AST_TEST_DEFINE(), ast_variable_retrieve(), build_calendar(), build_device(), caldav_load_calendar(), conf_exec(), config_module(), do_reload(), do_say(), ewscal_load_calendar(), exchangecal_load_calendar(), find_conf(), get_defaults(), handle_cli_dialplan_save(), iax_template_parse(), ical_load_calendar(), init_logger_chain(), load_aliases(), load_asterisk_conf(), load_common(), load_config(), load_general_config(), load_module(), load_moh_classes(), load_odbc_config(), load_users(), load_zonemessages(), loader_config_init(), mbl_load_adapter(), mbl_load_config(), mbl_load_device(), new_realtime_sqlite3_db(), odbc_load_module(), parse_config(), parse_tone_zone(), pbx_load_config(), process_my_load_module(), read_pjproject_startup_options(), realtime_directory(), reload(), reload_config(), reload_followme(), reload_module(), reload_queue_rules(), reload_single_queue(), rtp_reload(), run_startup_commands(), search_directory_sub(), set_config(), setup_dahdi_int(), show_users_realtime(), sla_build_station(), sla_build_trunk(), smdi_load(), tds_load_module(), test_config_validity(), and xmldoc_load_documentation().

◆ ast_variable_browse_filtered()

struct ast_variable * ast_variable_browse_filtered ( const struct ast_config config,
const char *  category_name,
const char *  filter 
)

Browse variables.

Parameters
configWhich config structure you wish to "browse"
category_nameWhich category to "browse"
filteran optional comma-separated list of <name_regex>=<value_regex> pairs. Only categories with matching variables will be browsed. The special name 'TEMPLATES' can be used with the special values 'include' or 'restrict' to include templates in the result or restrict the result to only templates.

Somewhat similar in intent as the ast_category_browse. List variables of config file category

Return values
ast_variablelist on success
NULLon failure

◆ ast_variable_delete()

int ast_variable_delete ( struct ast_category category,
const char *  variable,
const char *  match,
const char *  line 
)

Definition at line 1600 of file main/config.c.

1601{
1602 struct ast_variable *cur, *prev=NULL, *curn;
1603 int res = -1;
1604 int num_item = 0;
1605 int req_item;
1606
1607 req_item = -1;
1608 if (!ast_strlen_zero(line)) {
1609 /* Requesting to delete by item number. */
1610 if (sscanf(line, "%30d", &req_item) != 1
1611 || req_item < 0) {
1612 /* Invalid item number to delete. */
1613 return -1;
1614 }
1615 }
1616
1617 prev = NULL;
1618 cur = category->root;
1619 while (cur) {
1620 curn = cur->next;
1621 /* Delete by item number or by variable name with optional value. */
1622 if ((0 <= req_item && num_item == req_item)
1623 || (req_item < 0 && !strcasecmp(cur->name, variable)
1624 && (ast_strlen_zero(match) || !strcasecmp(cur->value, match)))) {
1625 if (prev) {
1626 prev->next = cur->next;
1627 if (cur == category->last)
1628 category->last = prev;
1629 } else {
1630 category->root = cur->next;
1631 if (cur == category->last)
1632 category->last = NULL;
1633 }
1635 res = 0;
1636 } else
1637 prev = cur;
1638
1639 cur = curn;
1640 ++num_item;
1641 }
1642 return res;
1643}

References ast_strlen_zero(), ast_variable_destroy(), ast_category::last, match(), ast_variable::name, ast_variable::next, ast_category::next, NULL, ast_category::prev, ast_category::root, and ast_variable::value.

Referenced by handle_updates().

◆ ast_variable_find()

const char * ast_variable_find ( const struct ast_category category,
const char *  variable 
)

Gets a variable value from a specific category structure by name.

Parameters
categorycategory structure under which the variable lies
variablewhich variable you wish to get the data for

Goes through a given category and searches for the given variable

Return values
Thevariable value on success
NULLif unable to find it.

Definition at line 918 of file main/config.c.

919{
920 return ast_variable_find_in_list(category->root, variable);
921}
const char * ast_variable_find_in_list(const struct ast_variable *list, const char *variable)
Gets the value of a variable from a variable list by name.
Definition: main/config.c:1013

References ast_variable_find_in_list(), and ast_category::root.

Referenced by AST_TEST_DEFINE(), ast_variable_retrieve_filtered(), and extension_length_comparator().

◆ ast_variable_find_in_list()

const char * ast_variable_find_in_list ( const struct ast_variable list,
const char *  variable 
)

Gets the value of a variable from a variable list by name.

Parameters
listvariable list to search
variablewhich variable you wish to get the data for

Goes through a given variable list and searches for the given variable

Return values
Thevariable value on success
NULLif unable to find it.

Definition at line 1013 of file main/config.c.

1014{
1015 const struct ast_variable *v;
1016
1017 for (v = list; v; v = v->next) {
1018 if (!strcasecmp(variable, v->name)) {
1019 return v->value;
1020 }
1021 }
1022 return NULL;
1023}

References ast_variable::name, ast_variable::next, NULL, and ast_variable::value.

Referenced by ast_ari_callback(), ast_geoloc_eprofile_to_uri(), ast_geoloc_gml_validate_varlist(), ast_sorcery_changeset_create(), AST_TEST_DEFINE(), ast_variable_find(), geoloc_civicaddr_list_to_xml(), geoloc_eprofile_to_intermediate(), geoloc_gml_list_to_xml(), handle_export_primitives(), load_realtime_musiconhold(), retrieve_cert_from_url(), and validate_location_info().

◆ ast_variable_find_last_in_list()

const char * ast_variable_find_last_in_list ( const struct ast_variable list,
const char *  variable 
)

Gets the value of the LAST occurrence of a variable from a variable list.

Parameters
listThe ast_variable list to search
variableThe name of the ast_variable you wish to fetch data for

Iterates over a given ast_variable list to search for the last occurrence of an ast_variable entry with a name attribute matching the given name (variable). This is useful if the list has duplicate entries (such as in cases where entries are created by a template)

Return values
Thevariable value on success
NULLif unable to find it.

Definition at line 1025 of file main/config.c.

1026{
1027 const struct ast_variable *v;
1028 const char *found = NULL;
1029
1030 for (v = list; v; v = v->next) {
1031 if (!strcasecmp(variable, v->name)) {
1032 found = v->value;
1033 }
1034 }
1035 return found;
1036}

References ast_variable::name, ast_variable::next, NULL, and ast_variable::value.

Referenced by AST_TEST_DEFINE(), handle_aor(), handle_auth(), handle_endpoint(), handle_identify(), handle_phoneprov(), handle_registrations(), is_variable_true(), and wizard_apply_handler().

◆ ast_variable_find_variable_in_list()

const struct ast_variable * ast_variable_find_variable_in_list ( const struct ast_variable list,
const char *  variable_name 
)

Gets a variable from a variable list by name.

Since
13.9.0
Parameters
listvariable list to search
variable_namename you wish to get the data for

Goes through a given variable list and searches for the given variable

Return values
Thevariable (not the value) on success
NULLif unable to find it.

Definition at line 923 of file main/config.c.

924{
925 const struct ast_variable *v;
926
927 for (v = list; v; v = v->next) {
928 if (!strcasecmp(variable_name, v->name)) {
929 return v;
930 }
931 }
932 return NULL;
933}

References ast_variable::name, ast_variable::next, and NULL.

Referenced by ast_variable_lists_match(), and realtime_sorcery_store().

◆ ast_variable_insert()

void ast_variable_insert ( struct ast_category category,
struct ast_variable variable,
const char *  line 
)

Definition at line 585 of file main/config.c.

586{
587 struct ast_variable *cur = category->root;
588 int lineno;
589 int insertline;
590
591 if (!variable || sscanf(line, "%30d", &insertline) != 1) {
592 return;
593 }
594 if (!insertline) {
595 variable->next = category->root;
596 category->root = variable;
597 } else {
598 for (lineno = 1; lineno < insertline; lineno++) {
599 cur = cur->next;
600 if (!cur->next) {
601 break;
602 }
603 }
604 variable->next = cur->next;
605 cur->next = variable;
606 }
607}

References ast_variable::lineno, ast_variable::next, and ast_category::root.

Referenced by AST_TEST_DEFINE(), and handle_updates().

◆ ast_variable_list_append_hint()

struct ast_variable * ast_variable_list_append_hint ( struct ast_variable **  head,
struct ast_variable search_hint,
struct ast_variable new_var 
)

Appends a variable list to the end of another list.

Parameters
headA pointer to an ast_variable * of the existing variable list head. May NOT be NULL but the content may be to initialize a new list. If so, upon return, this parameter will be updated with a pointer to the new list head.
search_hintThe place in the current list to start searching for the end of the list. Might help performance on longer lists. If NULL, it defaults to head.
new_varThe head of the new variable list to be appended
Returns
The tail of the resulting list.
Note
If the existing *head is NULL, it will be updated to new_var. This allows you to call ast_variable_list_append in a loop or callback without initializing the list first.

Definition at line 732 of file main/config.c.

733{
734 struct ast_variable *curr;
735 struct ast_variable *sh = search_hint;
736 ast_assert(head != NULL);
737
738 if (!*head) {
739 *head = newvar;
740 } else {
741 if (sh == NULL) {
742 sh = *head;
743 }
744 for (curr = sh; curr->next; curr = curr->next);
745 curr->next = newvar;
746 }
747
748 for (curr = newvar; curr->next; curr = curr->next);
749
750 return curr;
751}
#define ast_assert(a)
Definition: utils.h:739

References ast_assert, ast_variable::next, and NULL.

Referenced by ast_json_nvp_array_to_ast_variables(), ast_json_to_ast_variables(), ast_sorcery_objectset_create2(), and AST_TEST_DEFINE().

◆ ast_variable_list_from_quoted_string()

struct ast_variable * ast_variable_list_from_quoted_string ( const char *  input,
const char *  item_separator,
const char *  name_value_separator,
const char *  quote_str 
)

Parse a string into an ast_variable list. The reverse of ast_variable_list_join.

Parameters
inputThe name-value pair string to parse.
item_separatorThe string used to separate the list items. Only the first character in the string will be used. If NULL, "," will be used.
name_value_separatorThe string used to separate each item's name and value. Only the first character in the string will be used. If NULL, "=" will be used.
quote_strThe string used to quote values. Only the first character in the string will be used. If NULL, '"' will be used.
Return values
Apointer to a list of ast_variables.
NULLif there was an error or no variables could be parsed.

Definition at line 812 of file main/config.c.

814{
815 char item_sep;
816 char nv_sep;
817 char quote;
818 struct ast_variable *new_list = NULL;
819 struct ast_variable *new_var = NULL;
820 char *item_string;
821 char *item;
822 char *item_name;
823 char *item_value;
824
825 if (ast_strlen_zero(input)) {
826 return NULL;
827 }
828
829 item_sep = ast_strlen_zero(item_separator) ? ',' : item_separator[0];
830 nv_sep = ast_strlen_zero(name_value_separator) ? '=' : name_value_separator[0];
831 quote = ast_strlen_zero(quote_str) ? '"' : quote_str[0];
832 item_string = ast_strip(ast_strdupa(input));
833
834 while ((item = ast_strsep_quoted(&item_string, item_sep, quote, AST_STRSEP_ALL))) {
835 item_name = ast_strsep_quoted(&item, nv_sep, quote, AST_STRSEP_ALL);
836 if (!item_name) {
837 ast_variables_destroy(new_list);
838 return NULL;
839 }
840
841 item_value = ast_strsep_quoted(&item, nv_sep, quote, AST_STRSEP_ALL);
842
843 new_var = ast_variable_new(item_name, item_value ?: "", "");
844 if (!new_var) {
845 ast_variables_destroy(new_list);
846 return NULL;
847 }
848 ast_variable_list_append(&new_list, new_var);
849 }
850 return new_list;
851}
static int input(yyscan_t yyscanner)
Definition: ast_expr2f.c:1570
static int quote(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
#define ast_variable_list_append(head, new_var)
char * ast_strsep_quoted(char **s, const char sep, const char quote, uint32_t flags)
Like ast_strsep() except you can specify a specific quote character.
Definition: utils.c:1899
@ AST_STRSEP_ALL
Definition: strings.h:258
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: strings.h:223
static struct aco_type item
Definition: test_config.c:1463

References ast_strdupa, ast_strip(), ast_strlen_zero(), AST_STRSEP_ALL, ast_strsep_quoted(), ast_variable_list_append, ast_variable_new, ast_variables_destroy(), input(), item, NULL, and quote().

Referenced by AST_TEST_DEFINE(), and ast_variable_list_from_string().

◆ ast_variable_list_from_string()

struct ast_variable * ast_variable_list_from_string ( const char *  input,
const char *  item_separator,
const char *  name_value_separator 
)

Parse a string into an ast_variable list. The reverse of ast_variable_list_join.

Parameters
inputThe name-value pair string to parse.
item_separatorThe string used to separate the list items. Only the first character in the string will be used. If NULL, "," will be used.
name_value_separatorThe string used to separate each item's name and value. Only the first character in the string will be used. If NULL, "=" will be used.
Return values
Apointer to a list of ast_variables.
NULLif there was an error or no variables could be parsed.

Definition at line 853 of file main/config.c.

855{
856 return ast_variable_list_from_quoted_string(input, item_separator, name_value_separator, NULL);
857}
struct ast_variable * ast_variable_list_from_quoted_string(const char *input, const char *item_separator, const char *name_value_separator, const char *quote_str)
Parse a string into an ast_variable list. The reverse of ast_variable_list_join.
Definition: main/config.c:812

References ast_variable_list_from_quoted_string(), input(), and NULL.

◆ ast_variable_list_join()

struct ast_str * ast_variable_list_join ( const struct ast_variable head,
const char *  item_separator,
const char *  name_value_separator,
const char *  quote_char,
struct ast_str **  str 
)

Join an ast_variable list with specified separators and quoted values.

Parameters
headA pointer to an ast_variable list head.
item_separatorThe string to use to separate the list items. If NULL, "," will be used.
name_value_separatorThe string to use to separate each item's name and value. If NULL, "=" will be used.
strA pointer to a pre-allocated ast_str in which to put the results. If NULL, one will be allocated and returned.
quote_charThe quote char to use for the values. May be NULL or empty for no quoting.
Return values
Apointer to the result ast_str. This may NOT be the same as the pointer passed in if the original ast_str wasn't large enough to hold the result. Regardless, the pointer MUST be freed after use.
NULLif there was an error.

Definition at line 786 of file main/config.c.

788{
789 struct ast_variable *var = (struct ast_variable *)head;
790 struct ast_str *local_str = NULL;
791
792 if (str == NULL || *str == NULL) {
794 if (!local_str) {
795 return NULL;
796 }
797 } else {
798 local_str = *str;
799 }
800
801 for (; var; var = var->next) {
802 ast_str_append(&local_str, 0, "%s%s%s%s%s%s", var->name, name_value_separator, S_OR(quote_char, ""),
803 var->value, S_OR(quote_char, ""), var->next ? item_separator : "");
804 }
805
806 if (str != NULL) {
807 *str = local_str;
808 }
809 return local_str;
810}
#define AST_MAX_USER_FIELD
Definition: channel.h:176
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80

References AST_MAX_USER_FIELD, ast_str_append(), ast_str_create, NULL, S_OR, str, and var.

Referenced by add_eprofile_to_channel(), AST_TEST_DEFINE(), geoloc_config_list_locations(), geoloc_config_show_profiles(), validate_location_info(), var_list_from_confidence(), var_list_from_loc_info(), and var_list_from_node().

◆ ast_variable_list_replace()

int ast_variable_list_replace ( struct ast_variable **  head,
struct ast_variable replacement 
)

Replace a variable in the given list with a new value.

Since
13.30.0
Parameters
headA pointer to an ast_variable * of the existing variable list head. May NOT be NULL but the content may be to initialize a new list. If so, upon return, this parameter will be updated with a pointer to the new list head.
replacementThe variable that replaces another variable in the list with the same name.
Return values
0if a variable was replaced in the list
-1if no replacement occured
Note
The variable name comparison is performed case-sensitively
If a variable is replaced, its memory is freed.

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

754{
755 struct ast_variable *v, **prev = head;
756
757 for (v = *head; v; prev = &v->next, v = v->next) {
758 if (!strcmp(v->name, replacement->name)) {
759 replacement->next = v->next;
760 *prev = replacement;
761 ast_free(v);
762 return 0;
763 }
764 }
765
766 return -1;
767}

References ast_free, ast_variable::name, and ast_variable::next.

Referenced by ast_geoloc_eprofile_refresh_location(), build_user(), check_access(), mkintf(), process_dahdi(), and set_var_handler().

◆ ast_variable_list_replace_variable()

int ast_variable_list_replace_variable ( struct ast_variable **  head,
struct ast_variable oldvar,
struct ast_variable newvar 
)

Replace a variable in the given list with a new variable.

Parameters
headA pointer to the current variable list head. Since the variable to be replaced, this pointer may be updated with the new head.
oldvarA pointer to the existing variable to be replaced.
newvarA pointer to the new variable that will replace the old one.
Return values
0if a variable was replaced in the list
-1if no replacement occured
Note
The search for the old variable is done simply on the pointer.
If a variable is replaced, its memory is freed.

Definition at line 769 of file main/config.c.

771{
772 struct ast_variable *v, **prev = head;
773
774 for (v = *head; v; prev = &v->next, v = v->next) {
775 if (v == old) {
776 new->next = v->next;
777 *prev = new;
778 ast_free(v);
779 return 0;
780 }
781 }
782
783 return -1;
784}

References ast_free, and ast_variable::next.

Referenced by AST_TEST_DEFINE().

◆ ast_variable_list_sort()

struct ast_variable * ast_variable_list_sort ( struct ast_variable head)

Performs an in-place sort on the variable list by ascending name.

Parameters
headThe variable list head
Returns
The new list head

Definition at line 706 of file main/config.c.

707{
708 struct ast_variable *p, *q;
709 struct ast_variable top;
710 int changed = 1;
711 memset(&top, 0, sizeof(top));
712 top.next = start;
713 if (start != NULL && start->next != NULL) {
714 while (changed) {
715 changed = 0;
716 q = &top;
717 p = top.next;
718 while (p->next != NULL) {
719 if (p->next != NULL && strcmp(p->name, p->next->name) > 0) {
720 q->next = variable_list_switch(p, p->next);
721 changed = 1;
722 }
723 q = p;
724 if (p->next != NULL)
725 p = p->next;
726 }
727 }
728 }
729 return top.next;
730}
static struct ast_variable * variable_list_switch(struct ast_variable *l1, struct ast_variable *l2)
Definition: main/config.c:699

References ast_variable::name, ast_variable::next, NULL, and variable_list_switch().

Referenced by aeap_cli_show(), ast_sip_cli_print_sorcery_objectset(), and config_object_cli_show().

◆ ast_variable_lists_match()

int ast_variable_lists_match ( const struct ast_variable left,
const struct ast_variable right,
int  exact_match 
)

Tests 2 variable lists to see if they match.

Since
13.9.0
Parameters
leftVariable list to test
rightVariable list with an optional realtime-style operator in the names
exact_matchIf true, all variables in left must match all variables in right and vice versa. This does exact value matches only. Operators aren't supported. Except for order, the left and right lists must be equal.

If false, every variable in the right list must match some variable in the left list using the operators supplied. Variables in the left list that aren't in the right list are ignored for matching purposes.

Return values
1matches
0doesn't match

Iterates over the variable lists calling ast_variables_match. If any match fails or a variable in the right list isn't in the left list, 0 is returned.

Definition at line 955 of file main/config.c.

956{
957 const struct ast_variable *field;
958 int right_count = 0;
959 int left_count = 0;
960
961 if (left == right) {
962 return 1;
963 }
964
965 if (!(left && right)) {
966 return 0;
967 }
968
969 for (field = right; field; field = field->next) {
970 char *space = strrchr(field->name, ' ');
971 const struct ast_variable *old;
972 char * name = (char *)field->name;
973
974 if (space) {
975 name = ast_strdup(field->name);
976 if (!name) {
977 return 0;
978 }
979 name[space - field->name] = '\0';
980 }
981
983 if (name != field->name) {
984 ast_free(name);
985 }
986
987 if (exact_match) {
988 if (!old || strcmp(old->value, field->value)) {
989 return 0;
990 }
991 } else {
992 if (!ast_variables_match(old, field)) {
993 return 0;
994 }
995 }
996
997 right_count++;
998 }
999
1000 if (exact_match) {
1001 for (field = left; field; field = field->next) {
1002 left_count++;
1003 }
1004
1005 if (right_count != left_count) {
1006 return 0;
1007 }
1008 }
1009
1010 return 1;
1011}
if(!yyg->yy_init)
Definition: ast_expr2f.c:854
int ast_variables_match(const struct ast_variable *left, const struct ast_variable *right)
Tests 2 variable values to see if they match.
Definition: main/config.c:935
const struct ast_variable * ast_variable_find_variable_in_list(const struct ast_variable *list, const char *variable_name)
Gets a variable from a variable list by name.
Definition: main/config.c:923

References ast_free, ast_strdup, ast_variable_find_variable_in_list(), ast_variables_match(), if(), name, ast_variable::name, ast_variable::next, and ast_variable::value.

Referenced by AST_TEST_DEFINE(), object_type_loaded_observer(), realtime_sorcery(), realtime_sorcery_multi(), sorcery_astdb_retrieve_fields_common(), sorcery_config_fields_cmp(), sorcery_memory_cache_fields_cmp(), and sorcery_memory_fields_cmp().

◆ ast_variable_retrieve()

const char * ast_variable_retrieve ( struct ast_config config,
const char *  category,
const char *  variable 
)

Definition at line 869 of file main/config.c.

870{
871 struct ast_variable *v;
872 const char *match = NULL;
873
874 /* We can't return as soon as we find a match, because if a config section overrides
875 * something specified in a template, then the actual effective value is the last
876 * one encountered, not the first one.
877 * (This is like using the -1 index for the AST_CONFIG function.)
878 * Also see ast_variable_find_last_in_list
879 */
880
881 if (category) {
882 for (v = ast_variable_browse(config, category); v; v = v->next) {
883 if (!strcasecmp(variable, v->name)) {
884 match = v->value;
885 }
886 }
887 } else {
888 struct ast_category *cat;
889
890 for (cat = config->root; cat; cat = cat->next) {
891 for (v = cat->root; v; v = v->next) {
892 if (!strcasecmp(variable, v->name)) {
893 match = v->value;
894 }
895 }
896 }
897 }
898
899 return match;
900}
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category)
Definition: main/config.c:686

References ast_variable_browse(), config, match(), ast_variable::name, ast_variable::next, ast_category::next, NULL, ast_category::root, and ast_variable::value.

Referenced by __init_manager(), __queues_show(), actual_load_config(), advanced_options(), ast_config_option(), ast_init_logger_for_socket_console(), AST_TEST_DEFINE(), check_for_old_config(), conf_exec(), config_module(), directory_exec(), festival_exec(), find_realtime(), forward_message(), get_defaults(), iax_template_parse(), init_acf_query(), init_logger_chain(), initialize_cc_devstate_map_helper(), initialize_cc_max_requests(), internal_aco_type_find(), load_config(), load_config_meetme(), load_indications(), load_module(), load_mysql_config(), load_realtime_musiconhold(), load_realtime_queues(), load_realtime_rules(), load_tech_calendars(), load_users(), loader_config_init(), make_email_file(), mbl_load_adapter(), mbl_load_device(), message_range_and_existence_check(), named_acl_find_realtime(), notify_new_message(), odbc_load_module(), parse_config(), pbx_load_config(), pbx_load_users(), play_message(), prep_email_sub_vars(), private_enum_init(), process_my_load_module(), queue_rules_set_global_params(), queue_set_global_params(), read_password_from_file(), realtime_directory(), realtime_switch_common(), reload(), reload_config(), reload_followme(), reload_single_queue(), rt_handle_member_record(), rtp_reload(), search_directory(), search_directory_sub(), set_config(), set_member_value(), setup_dahdi_int(), sla_build_station(), sla_build_trunk(), sla_load_config(), tds_load_module(), vm_change_password(), vm_forwardoptions(), vm_msg_forward(), vm_msg_play(), and vm_msg_snapshot_create().

◆ ast_variable_retrieve_filtered()

const char * ast_variable_retrieve_filtered ( struct ast_config config,
const char *  category,
const char *  variable,
const char *  filter 
)

Gets a variable by context and variable names.

Parameters
configwhich (opened) config to use
categorycategory under which the variable lies
variablewhich variable you wish to get the data for
filteran optional comma-separated list of <name_regex>=<value_regex> pairs. Only categories with matching variables will be searched. The special name 'TEMPLATES' can be used with the special values 'include' or 'restrict' to include templates in the result or restrict the result to only templates.
Return values
Thevariable value on success
NULLif unable to find it.

Definition at line 902 of file main/config.c.

904{
905 struct ast_category *cat = NULL;
906 const char *value;
907
908 while ((cat = ast_category_browse_filtered(config, category, cat, filter))) {
909 value = ast_variable_find(cat, variable);
910 if (value) {
911 return value;
912 }
913 }
914
915 return NULL;
916}
const char * ast_variable_find(const struct ast_category *category, const char *variable)
Gets a variable value from a specific category structure by name.
Definition: main/config.c:918
struct ast_category * ast_category_browse_filtered(struct ast_config *config, const char *category_name, struct ast_category *prev, const char *filter)
Browse categories with filters.
Definition: main/config.c:1536

References ast_category_browse_filtered(), ast_variable_find(), config, filter(), NULL, and value.

◆ ast_variable_update()

int ast_variable_update ( struct ast_category category,
const char *  variable,
const char *  value,
const char *  match,
unsigned int  object 
)

Update variable value within a config.

Parameters
categoryCategory element within the config
variableName of the variable to change
valueNew value of the variable
matchIf set, previous value of the variable (if NULL or zero-length, no matching will be done)
objectBoolean of whether to make the new variable an object
Returns
0 on success or -1 on failure.

Definition at line 1645 of file main/config.c.

1647{
1648 struct ast_variable *cur, *prev = NULL, *newer = NULL;
1649 struct ast_variable *matchcur = NULL, *matchprev = NULL;
1650
1651 /* Find the last match. See comments in ast_variable_retrieve,
1652 * but this ensures updating config sections that inherit from
1653 * templates works properly. */
1654 for (cur = category->root; cur; prev = cur, cur = cur->next) {
1655 if (strcasecmp(cur->name, variable) || (!ast_strlen_zero(match) && strcasecmp(cur->value, match))) {
1656 /* Not the same variable,
1657 * or its value doesn't match. */
1658 continue;
1659 }
1660 matchprev = prev;
1661 matchcur = cur;
1662 }
1663
1664 if (!matchcur) {
1665 /* Could not find variable to update */
1666 return -1;
1667 }
1668
1669 /* Restore pointers from the matching var */
1670 prev = matchprev;
1671 cur = matchcur;
1672
1673 if (!(newer = ast_variable_new(variable, value, cur->file))) {
1674 return -1;
1675 }
1676
1677 ast_variable_move(newer, cur);
1678 newer->object = newer->object || object;
1679
1680 /* Replace the old node in the list with the new node. */
1681 newer->next = cur->next;
1682 if (prev) {
1683 prev->next = newer;
1684 } else {
1685 category->root = newer;
1686 }
1687 if (category->last == cur) {
1688 category->last = newer;
1689 }
1690
1692 return 0;
1693}

References ast_strlen_zero(), ast_variable_destroy(), ast_variable_move(), ast_variable_new, ast_variable::file, ast_category::last, match(), ast_variable::name, ast_variable::next, ast_category::next, NULL, ast_category::prev, ast_category::root, ast_variable::value, and value.

Referenced by handle_updates(), process_text_line(), vm_change_password(), and vm_forwardoptions().

◆ ast_variables_destroy()

static void ast_variables_destroy ( struct ast_variable var)

Free variable list.

Parameters
varthe linked list of variables to free

This function frees a list of variables.

Definition at line 1262 of file extconf.c.

1263{
1264 struct ast_variable *vn;
1265
1266 while (v) {
1267 vn = v;
1268 v = v->next;
1269 free(vn);
1270 }
1271}

References ast_variable_destroy(), free(), ast_variable::next, and var.

Referenced by __init_manager(), aco_set_defaults(), action_messagesend(), action_originate(), add_message_id(), aeap_cli_show(), announce_to_dial(), app_notify(), ast_aeap_client_configs_get(), ast_ari_asterisk_update_object(), ast_ari_callback(), ast_ari_channels_create(), ast_ari_channels_external_media(), ast_ari_channels_originate(), ast_ari_channels_originate_with_id(), ast_ari_endpoints_refer(), ast_ari_endpoints_refer_to_endpoint(), ast_ari_endpoints_send_message(), ast_ari_endpoints_send_message_to_endpoint(), ast_ari_invoke(), ast_category_destroy(), ast_category_empty(), ast_destroy_realtime(), ast_geoloc_eprofile_refresh_location(), ast_geoloc_eprofile_to_uri(), ast_http_get_cookies(), ast_http_manid_from_vars(), ast_json_to_ast_variables(), ast_load_realtime(), ast_load_realtime_all(), ast_load_realtime_multientry(), ast_sip_cli_print_sorcery_objectset(), ast_sip_sorcery_object_to_ami(), ast_sorcery_changeset_create(), ast_sorcery_copy(), ast_sorcery_diff(), ast_sorcery_object_set_extended(), ast_sorcery_objectset_apply(), ast_sorcery_objectset_json_create(), ast_store_realtime(), ast_stream_free(), ast_stream_get_metadata_list(), AST_TEST_DEFINE(), ast_update2_realtime(), ast_update_realtime(), ast_var_channel_types(), ast_var_channel_types_table(), ast_variable_list_from_quoted_string(), ast_variables_dup(), auth_http_callback(), calendar_destructor(), can_reuse_registration(), check_expiration_thread(), cli_contact_get_container(), cli_realtime_load(), conf_run(), config_object_cli_show(), copy_plain_file(), create_mwi_subscriptions(), curl_header_data_free(), destroy_dahdi_pvt(), destroy_fast_originate_helper(), dup_vars(), endpoint_destructor(), fields_handler(), find_conf_realtime(), find_load_queue_rt_friendly(), find_realtime(), find_user_realtime(), free_entry(), free_outgoing(), free_user(), function_realtime_read(), function_realtime_readdestroy(), generic_http_callback(), geoloc_eprofile_destructor(), geoloc_eprofile_resolve_varlist(), geoloc_eprofile_to_intermediate(), geoloc_location_destructor(), geoloc_profile_destructor(), get_multiple_fields_as_var_list(), get_object_variables(), handle_aor(), handle_auth(), handle_endpoint(), handle_export_primitives(), handle_identify(), handle_phoneprov(), handle_pjproject_show_log_mappings(), handle_registrations(), handle_showchan(), handle_uri(), http_request_headers_get(), httpd_process_request(), httpstatus_callback(), ldap_loadentry(), leave_queue(), load_realtime_musiconhold(), local_ast_moh_start(), manager_free_user(), manager_send_response(), mkintf(), notify_ami_channel_data_destroy(), notify_ami_data_destroy(), notify_ami_uri_data_destroy(), object_type_loaded_observer(), originate_exec(), pjsip_aor_function_read(), pjsip_contact_function_read(), pjsip_endpoint_function_read(), process_dahdi(), publication_resource_destroy(), pvt_destructor(), queue_function_queuegetchannel(), queue_function_queuewaitingcount(), realtime_arguments_to_fields(), realtime_arguments_to_fields2(), realtime_canmatch(), realtime_common(), realtime_exec(), realtime_exists(), realtime_ldap_base(), realtime_ldap_base_ap(), realtime_ldap_result_to_vars(), realtime_matchmore(), realtime_odbc(), realtime_peer(), realtime_user(), realtimefield_read(), request_destroy(), return_sorcery_object(), row_to_varlist(), rt_extend_conf(), session_destructor(), sip_aor_to_ami(), socket_process_helper(), sorcery_astdb_filter_objectset(), sorcery_astdb_retrieve_fields_common(), sorcery_astdb_retrieve_id(), sorcery_astdb_retrieve_prefix(), sorcery_astdb_retrieve_regex(), sorcery_config_destructor(), sorcery_config_fields_cmp(), sorcery_function_read(), sorcery_is_criteria_met(), sorcery_memory_cache_fields_cmp(), sorcery_memory_cached_object_destructor(), sorcery_memory_fields_cmp(), sorcery_object_destructor(), sorcery_realtime_create(), sorcery_realtime_filter_objectset(), sorcery_realtime_retrieve_fields(), sorcery_realtime_retrieve_id(), sorcery_realtime_retrieve_multiple(), sorcery_realtime_retrieve_prefix(), sorcery_realtime_retrieve_regex(), sorcery_realtime_update(), speech_aeap_engine_create(), table_configs_free(), test_sorcery_object_destroy(), test_sorcery_transform(), transport_apply(), update_ldap(), user_destructor(), var_list_from_confidence(), var_list_from_loc_info(), var_list_from_node(), and websocket_client_handshake().

◆ ast_variables_dup()

struct ast_variable * ast_variables_dup ( struct ast_variable var)

Duplicate variable list.

Parameters
varthe linked list of variables to clone
Returns
A duplicated list which you'll need to free with ast_variables_destroy or NULL when out of memory.
Note
Do not depend on this to copy more than just name, value and filename (the arguments to ast_variables_new).

Definition at line 629 of file main/config.c.

630{
631 struct ast_variable *cloned;
632 struct ast_variable *tmp;
633
634 if (!(cloned = ast_variable_new(var->name, var->value, var->file))) {
635 return NULL;
636 }
637
638 tmp = cloned;
639
640 while ((var = var->next)) {
641 if (!(tmp->next = ast_variable_new(var->name, var->value, var->file))) {
642 ast_variables_destroy(cloned);
643 return NULL;
644 }
645 tmp = tmp->next;
646 }
647
648 return cloned;
649}

References ast_variable_new, ast_variables_destroy(), ast_variable::next, NULL, and var.

Referenced by action_originate(), ast_ari_callback(), ast_config_copy(), authenticate(), handle_registrations(), jim_handler(), jim_vl(), realtime_sorcery(), realtime_sorcery_multi(), realtime_sorcery_store(), realtime_sorcery_update(), set_var_to_vl(), and sorcery_extended_fields_handler().

◆ ast_variables_match()

int ast_variables_match ( const struct ast_variable left,
const struct ast_variable right 
)

Tests 2 variable values to see if they match.

Since
13.9.0
Parameters
leftVariable to test
rightVariable to match against with an optional realtime-style operator in the name
Return values
1matches
0doesn't match

The values of the variables are passed to ast_strings_match. If right->name is suffixed with a space and an operator, that operator is also passed to ast_strings_match.

Examples:

left->name = "id" (ignored) left->value = "abc" right->name = "id regex" (id is ignored) right->value = "a[bdef]c"

will result in ast_strings_match("abc", "regex", "a[bdef]c") which will return 1.

left->name = "id" (ignored) left->value = "abc" right->name = "id" (ignored) right->value = "abc"

will result in ast_strings_match("abc", NULL, "abc") which will return 1.

See the documentation for ast_strings_match for the valid operators.

Definition at line 935 of file main/config.c.

936{
937 char *op;
938
939 if (left == right) {
940 return 1;
941 }
942
943 if (!(left && right)) {
944 return 0;
945 }
946
947 op = strrchr(right->name, ' ');
948 if (op) {
949 op++;
950 }
951
952 return ast_strings_match(left->value, op ? ast_strdupa(op) : NULL, right->value);
953}
int ast_strings_match(const char *left, const char *op, const char *right)
Compares 2 strings using realtime-style operators.
Definition: strings.c:260

References ast_strdupa, ast_strings_match(), ast_variable::name, NULL, and ast_variable::value.

Referenced by ast_variable_lists_match().

◆ ast_variables_reverse()

struct ast_variable * ast_variables_reverse ( struct ast_variable var)

Reverse a variable list.

Parameters
varthe linked list of variables to reverse
Returns
The head of the reversed variable list
Note
The variable list var is not preserved in this function and should not be used after reversing it.

Definition at line 651 of file main/config.c.

652{
653 struct ast_variable *var1, *var2;
654
655 var1 = var;
656
657 if (!var1 || !var1->next) {
658 return var1;
659 }
660
661 var2 = var1->next;
662 var1->next = NULL;
663
664 while (var2) {
665 struct ast_variable *next = var2->next;
666
667 var2->next = var1;
668 var1 = var2;
669 var2 = next;
670 }
671
672 return var1;
673}

References ast_variable::next, NULL, and var.

Referenced by astman_get_variables_order().

◆ register_config_cli()

int register_config_cli ( void  )

Exposed initialization method for core process.

This method is intended for use only with the core initialization and is not designed to be called from any user applications.

Definition at line 4456 of file main/config.c.

4457{
4459 /* This is separate from the module load so cleanup can happen very late. */
4461 return 0;
4462}
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
static struct ast_cli_entry cli_config[]
Definition: main/config.c:4432
static void config_shutdown(void)
Definition: main/config.c:4438
#define ARRAY_LEN(a)
Definition: utils.h:666

References ARRAY_LEN, ast_cli_register_multiple, ast_register_cleanup(), cli_config, and config_shutdown().

Referenced by asterisk_daemon().