33 #include "asterisk/_private.h"
66 #define NUM_DATA_NODE_BUCKETS 59
67 #define NUM_DATA_RESULT_BUCKETS 59
68 #define NUM_DATA_SEARCH_BUCKETS 59
69 #define NUM_DATA_FILTER_BUCKETS 59
172 unsigned int is_pattern:1;
222 struct ast_data *node1 = obj, *node2 = arg;
231 #define data_write_lock() ast_rwlock_wrlock(&root_data.lock)
238 #define data_read_lock() ast_rwlock_rdlock(&root_data.lock)
244 #define data_unlock() ast_rwlock_unlock(&root_data.lock)
258 if (structure_version >= latest_compatible && structure_version <= current) {
263 "current data api version\n");
313 namelen = strlen(name) + 1;
322 strcpy(node->
name, name);
385 if (found && found->
registrar && registrar) {
386 if (strcmp(found->
registrar, registrar)) {
388 ast_debug(1,
"Registrar doesn't match, node was registered"
389 " by '%s' and we are searching for '%s'\n",
412 char *node_name, *rpath;
429 if (!child->
handler && rpath) {
466 if (!strcmp(node->
registrar, registrar)) {
490 char *rpath, *node_name;
515 return ret ? ret : child;
529 latest_handler_compatible_version,
530 current_handler_version)) {
540 "for '%s'.\n", path, registrar);
547 "We were unable to register '%s' for registrar '%s'.\n",
548 node->
name, path, registrar);
570 for (i = 0; i < entries; i++) {
632 if (!strcmp(comparison,
"=")) {
634 }
else if (!strcmp(comparison,
"!=")) {
636 }
else if (!strcmp(comparison,
"<")) {
638 }
else if (!strcmp(comparison,
">")) {
640 }
else if (!strcmp(comparison,
"<=")) {
642 }
else if (!strcmp(comparison,
">=")) {
693 size_t name_len = strlen(name) + 1;
708 strcpy(res->
name, name);
774 char *rpath, *node_name;
804 char *elements, *search_string_dup, *saveptr;
808 size_t search_string_len;
810 if (!search_string) {
815 search_string_len = strlen(search_string);
844 for (elements = strtok_r(search_string_dup,
",", &saveptr); elements;
845 elements = strtok_r(NULL,
",", &saveptr)) {
869 for (; elements[i]; i++) {
917 switch (comparison_type) {
965 char *savepath, *node_name;
977 if (current != node) {
1014 ret = strcmp(value, child->
value);
1048 if (sscanf(child->
value,
"%p", &node_ptr) <= 0) {
1071 struct in_addr addr)
1075 struct in_addr node_addr;
1081 cmp_type = child->cmp_type;
1106 unsigned int node_value;
1146 node_value = strtod(child->
value, NULL);
1170 unsigned int node_value;
1178 node_value = atoi(child->
value);
1210 node_value = atoi(child->
value);
1242 node_value = *(child->
value);
1259 const char *member_name)
1263 for (i = 0; i < mapping_len; i++) {
1264 if (!strcmp(map[i].
name, member_name)) {
1274 void *structure,
const char *structure_name)
1278 int member, notmatch = 0;
1285 if (!struct_children) {
1301 switch (mapping[member].
type) {
1383 switch (root->
type) {
1417 strcpy(res->
name, namelen ? name :
"");
1443 struct ast_data *found, *find_node;
1487 switch (d_child->
type) {
1531 if (strcmp(d_child->
name, s->
name)) {
1568 char *savepath, *node_name;
1569 struct ast_data *child, *current = node;
1576 if (current != node) {
1587 if (current != node) {
1622 return strcasecmp(node1->
name, node2->name) ? 0 :
CMP_MATCH;
1649 char *globname, *token;
1651 size_t name_len = strlen(name) + 1;
1666 strcpy(res->
name, name);
1668 if (strchr(res->
name,
'*')) {
1671 while ((token =
strsep(&globname,
"*"))) {
1702 int i, olend, orend, globfound;
1703 size_t name_len = strlen(name), glob_len;
1731 if (!*globres->
name) {
1735 glob_len = strlen(globres->
name);
1738 if (strncasecmp(name, globres->
name, glob_len)) {
1747 for (globfound = 0; name_len - i >= glob_len; ++i) {
1748 if (!strncasecmp(name + i, globres->
name, glob_len)) {
1760 if (globfound && (i == name_len || orend)) {
1811 char *savepath, *saveptr, *token, *node_name;
1826 for (token = strtok_r(node_name,
"|", &saveptr);
1827 token; token = strtok_r(NULL,
"|", &saveptr)) {
1848 char *strfilter, *token, *saveptr;
1862 for (token = strtok_r(strfilter,
",", &saveptr); token;
1863 token = strtok_r(NULL,
",", &saveptr)) {
1886 const char *parent_node_name,
1902 if (root_provider->
module) {
1910 if (root_provider->
module) {
1916 if (root_provider->
module) {
1923 filter_child = NULL;
1935 if (!filter || filter_child) {
1940 search_child, filter_child);
1974 const char *search_path)
1976 char *node_name, *tmp_path;
1978 struct ast_data *result, *result_filtered;
1997 while (provider_child) {
2009 provider_child = tmp_provider_child;
2012 if (!provider_child) {
2014 tmp_path, node_name);
2023 provider_child->
name);
2032 provider_child->
name);
2037 search_child, filter_child);
2055 result_filtered = result;
2062 return result_filtered;
2071 current_query_version)) {
2095 struct ast_xml_node *parent_xml)
2099 struct ast_xml_node *child_xml;
2100 char node_content[256];
2110 switch (node->
type) {
2118 snprintf(node_content,
sizeof(node_content),
"%u",
2123 snprintf(node_content,
sizeof(node_content),
"%u",
2128 snprintf(node_content,
sizeof(node_content),
"%u",
2136 snprintf(node_content,
sizeof(node_content),
"%c",
2141 snprintf(node_content,
sizeof(node_content),
"%d",
2146 snprintf(node_content,
sizeof(node_content),
"%u",
2151 snprintf(node_content,
sizeof(node_content),
"%f",
2163 snprintf(node_content,
sizeof(node_content),
"%p",
2168 snprintf(node_content,
sizeof(node_content),
"%s",
2183 struct ast_xml_doc *doc;
2184 struct ast_xml_node *root;
2222 return internal->type;
2304 node->
filter = filter_child;
2345 unsigned int boolean)
2351 struct in_addr addr)
2363 unsigned int timestamp)
2369 unsigned int seconds)
2375 unsigned int milliseconds)
2428 for (i = 0; i < mapping_len; i++) {
2429 switch (mapping[i].
type) {
2498 const char *elements)
2503 char *path, *
ptr = NULL;
2513 ptr = strrchr(path,
'/');
2529 iterator->
pattern = (ptr ? strrchr(elements,
'/') + 1 : elements);
2533 REG_EXTENDED | REG_NOSUB | REG_ICASE)) {
2545 if (iterator->
last) {
2564 if (iterator->
last) {
2579 res->
name, 0, NULL, 0)) {
2593 iterator->
last = res;
2614 switch (node->
type) {
2662 static const struct {
2709 struct ast_str *tabs, *output;
2716 for (i = 0; i < depth; i++) {
2729 switch (node->
type) {
2879 "Usage: data get <path> [<search> [<filter>]]\n"
2880 " Get the tree based on a path.\n";
2928 if (!current_path) {
2968 e->
command =
"data show providers";
2970 "Usage: data show providers\n"
2971 " Show the list of registered providers\n";
3007 int current_id =
id;
3010 if (!current_path) {
3028 switch (node->
type) {
3084 .path = (
char *) path,
3085 .search = (
char *)
search,
3086 .filter = (
char *) filter,
3124 for (x = 0; x < fmlist_size; x++) {
3125 if (fmlist[x].
bits & capability) {
3140 #ifdef TEST_FRAMEWORK
3147 struct test_structure {
3149 unsigned int b_bool:1;
3151 unsigned int a_uint;
3158 #define DATA_EXPORT_TEST_STRUCTURE(MEMBER) \
3159 MEMBER(test_structure, a_int, AST_DATA_INTEGER) \
3160 MEMBER(test_structure, b_bool, AST_DATA_BOOLEAN) \
3161 MEMBER(test_structure, c_str, AST_DATA_STRING) \
3162 MEMBER(test_structure, a_uint, AST_DATA_UNSIGNED_INTEGER)
3170 static int test_data_full_provider(
const struct ast_data_search *search,
3174 struct test_structure local_test_structure = {
3177 .c_str =
"test string",
3182 if (!test_structure) {
3183 ast_debug(1,
"Internal data api error\n");
3203 .get = test_data_full_provider
3220 .path =
"test/node1/node11/node111",
3221 .search =
"node111/test_structure/a_int=10",
3222 .filter =
"node111/test_structure/a*int"
3227 info->name =
"data_test";
3228 info->category =
"/main/data/";
3229 info->summary =
"Data API unit test";
3231 "Tests whether data API get implementation works as expected.";
#define ao2_t_ref(o, delta, tag)
Reference/unreference an object and return the old refcount.
unsigned int AST_DATA_BOOLEAN
static int data_search_cmp_ptr(const struct ast_data_search *root, const char *name, void *ptr)
#define data_write_lock()
static struct ast_data_search * data_search_find(struct ao2_container *parent, const char *name)
unsigned int AST_DATA_UNSIGNED_INTEGER
static void data_search_release(struct ast_data_search *search)
#define NUM_DATA_SEARCH_BUCKETS
#define AST_CLI_DEFINE(fn, txt,...)
char * value
The value of the comparison.
static int data_result_cmp(void *obj, void *arg, int flags)
A data container node pointing to the registered handler.
unsigned int AST_DATA_MILLISECONDS
Asterisk locking-related definitions:
void astman_append(struct mansession *s, const char *fmt,...)
static void data_shutdown(void)
Asterisk main include file. File version handling, generic pbx functions.
#define ao2_link(arg1, arg2)
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
struct ao2_container * children
The list of nodes inside this node.
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
int(* AST_DATA_INTEGER)(void *ptr)
The data tree to be returned by the callbacks and managed by functions local to this file...
void ast_module_unref(struct ast_module *)
void ast_data_free(struct ast_data *root)
Release the allocated memory of a tree.
char * strsep(char **str, const char *delims)
static int data_filter_cmp(void *obj, void *arg, int flags)
struct ast_data * ast_data_add_milliseconds(struct ast_data *root, const char *childname, unsigned int milliseconds)
Add a milliseconds node type.
static struct data_provider * data_provider_create(struct ao2_container *parent, const char *path, const char *registrar)
static int data_search_cmp_bool(const struct ast_data_search *root, const char *name, unsigned int value)
static struct ast_data * data_result_generate(const struct ast_data_query *query, const char *search_path)
union ast_data_retrieve::@161 value
unsigned int is_pattern
is a regular expression.
static char * handle_cli_data_show_providers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
enum ast_data_type ast_data_retrieve_type(struct ast_data *res, const char *path)
Get a node type.
regex_t regex_pattern
The compiled patter.
char *(* AST_DATA_STRING)(void *ptr)
static int data_provider_hash(const void *obj, const int flags)
static struct ast_data * data_result_get_node(struct ast_data *node, const char *path)
#define ast_rwlock_destroy(rwlock)
void ast_data_iterator_end(struct ast_data_iterator *iterator)
Release (stop using) an iterator.
static struct data_provider * data_provider_add_child(struct ao2_container *parent, const char *name, const struct ast_data_handler *handler, const char *registrar)
static int data_search_cmp(void *obj, void *arg, int flags)
char(* AST_DATA_CHARACTER)(void *ptr)
#define ao2_iterator_next(arg1)
descriptor for a cli entry.
struct ast_data * ast_data_add_dbl(struct ast_data *root, const char *childname, double dbl)
Add a floating point node type.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
struct ast_xml_doc * ast_xml_new(void)
Create a XML document.
static int data_search_comparison_char(char a)
static int data_search_hash(const void *obj, const int flags)
This entries are for multiple registers.
static enum data_search_comparison data_search_comparison_type(const char *comparison)
static void data_result_add_child(struct ast_data *root, struct ast_data *child)
int ast_term_color_code(struct ast_str **str, int fgcolor, int bgcolor)
Append a color sequence to an ast_str.
#define AST_TEST_REGISTER(cb)
static int data_result_hash(const void *obj, const int flags)
static struct data_filter * data_filter_add_child(struct ao2_container *root, char *name)
static int data_provider_cmp(void *obj1, void *obj2, int flags)
struct ast_data * ast_data_add_uint(struct ast_data *root, const char *childname, unsigned int value)
Add an unsigned integer node type.
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
struct ast_data * ast_data_get(const struct ast_data_query *query)
Retrieve a subtree from the asterisk data API.
struct ast_xml_node * ast_xml_add_child(struct ast_xml_node *parent, struct ast_xml_node *child)
Add a child node, to a specified parent node.
struct ast_data * ast_data_add_ipaddr(struct ast_data *root, const char *childname, struct in_addr addr)
Add a ipv4 address type.
static int manager_data_get(struct mansession *s, const struct message *m)
struct ast_str * ast_str_create(size_t init_len)
Create a malloc'ed dynamic length string.
struct ast_data * ast_data_add_bool(struct ast_data *root, const char *childname, unsigned int boolean)
Add a boolean node type.
double(* AST_DATA_DOUBLE)(void *ptr)
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
static const uint32_t latest_handler_compatible_version
The last compatible version.
static void data_provider_print_cli(int fd, const char *name, struct ao2_container *container, struct ast_str *path)
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags)
Create an iterator for a container.
int(* AST_DATA_MILLISECONDS)(void *ptr)
static struct @245 data_result_color[]
struct ast_format_list * ast_get_format_list(size_t *size)
struct ast_xml_doc * ast_data_get_xml(const struct ast_data_query *query)
Retrieve a subtree from the asterisk data API in XML format..
static struct ast_data_search * data_search_create(struct ao2_container *parent, const char *path)
enum data_search_comparison cmp_type
The type of comparison.
int __ast_data_register_multiple(const struct ast_data_entry *data_entries, size_t entries, const char *registrar, struct ast_module *mod)
Register multiple data providers at once.
void ast_cli(int fd, const char *fmt,...)
static unsigned int ast_data_retrieve_uint(struct ast_data *tree, const char *path)
Retrieve the unsigned integer value of a node.
#define AST_DATA_ENTRY(__path, __handler)
static const uint32_t current_query_version
Current query structure version.
struct ast_data * last
The last returned node.
struct ast_data * ast_data_add_timestamp(struct ast_data *root, const char *childname, unsigned int timestamp)
Add a timestamp node type.
struct ao2_container * container
The asterisk data main content structure.
static int data_filter_hash(const void *obj, const int flags)
static void __data_result_print_cli(int fd, const struct ast_data *root, uint32_t depth)
static struct ast_cli_entry cli_data[]
uint32_t version
Data query version.
struct ao2_iterator internal_iterator
The internal iterator.
static void data_filter_release(struct data_filter *filter)
data_search_comparison
Type of comparisons allow in the search string.
#define AST_DATA_QUERY_VERSION
struct ast_data * ast_data_add_ptr(struct ast_data *root, const char *childname, void *ptr)
Add a ptr node type.
#define NUM_DATA_FILTER_BUCKETS
int args
This gets set in ast_cli_register()
const char * astman_get_header(const struct message *m, char *var)
Get header from mananger transaction.
char *(* AST_DATA_PASSWORD)(void *ptr)
int(* AST_DATA_SECONDS)(void *ptr)
static int data_structure_compatible(int structure_version, uint32_t latest_compatible, uint32_t current)
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
unsigned int(* AST_DATA_UNSIGNED_INTEGER)(void *ptr)
#define ast_debug(level,...)
Log a DEBUG message.
static struct ast_data_search * data_search_get_node(const struct ast_data_search *node, const char *path)
#define AST_DATA_HANDLER_VERSION
The Data API structures version.
enum ast_data_type type
The type of the node retrieved.
static struct ast_data * data_result_generate_node(const struct ast_data_query *query, const struct data_provider *root_provider, const char *parent_node_name, const struct ast_data_search *search, const struct data_filter *filter)
static int data_result_get_color(enum ast_data_type type)
#define ast_data_register_multiple_core(data_entries, entries)
static int data_search_mapping_find(const struct ast_data_mapping_structure *map, size_t mapping_len, const char *member_name)
structure retrieved from a node, with the nodes content.
#define ast_test_status_update(a, b, c...)
static void data_search_destructor(void *obj)
const char * pattern
The iterator pattern.
#define ast_manager_register_xml(a, b, c)
Register a manager callback using XML documentation to describe the manager.
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Asterisk internal frame definitions.
struct ast_data * ast_data_add_node(struct ast_data *root, const char *childname)
Add a container child.
struct ast_module * module
Module providing this handler.
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
#define ast_data_unregister(path)
#define ao2_ref(o, delta)
static char * handle_cli_data_get(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
int ast_register_atexit(void(*func)(void))
Register a function to be executed before Asterisk exits.
static int data_filter_add_nodes(struct ao2_container *root, char *path)
static int data_provider_release(struct ao2_container *parent, const char *path, const char *registrar)
static struct ast_data * data_result_create(const char *name)
struct ast_xml_node * ast_xml_new_node(const char *name)
Create a XML node.
int ast_data_add_codecs(struct ast_data *root, const char *node_name, format_t capability)
Add the list of codecs in the root node based on the capability parameter.
char * ast_data_retrieve_name(struct ast_data *node)
Get the node name.
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
struct ast_data * ast_data_add_seconds(struct ast_data *root, const char *childname, unsigned int seconds)
Add a seconds node type.
char * filter
Filter string, return the internal nodes specified here. Setting it to NULL will return every interna...
Asterisk XML abstraction layer.
#define ast_data_add_structure(structure_name, root, structure)
static void data_provider_destructor(void *obj)
The list of nodes with their search requirement.
union ast_data_mapping_structure::@162 get
member getter.
struct ast_data_iterator * ast_data_iterator_init(struct ast_data *tree, const char *elements)
Initialize an iterator.
Map the members of a structure.
The AMI - Asterisk Manager Interface - is a TCP protocol created to manage Asterisk with third-party ...
#define AST_LIST_HEAD_NOLOCK(name, type)
Defines a structure to be used to hold a list of specified type (with no lock).
struct ao2_container * children
node childrens.
#define ast_strdupa(s)
duplicate a string in memory from the stack
char * path
Path to the node to retrieve.
static void data_get_xml_add_child(struct ast_data *parent_data, struct ast_xml_node *parent_xml)
static const uint32_t current_handler_version
Current handler structure version.
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true". This function checks to see whether a string passed to it is an indication of an "true" value. It checks to see if the string is "yes", "true", "y", "t", "on" or "1".
union ast_data::@246 payload
The node content.
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
struct ao2_container * children
children nodes.
static struct ast_data_search * data_search_alloc(const char *name)
void ast_data_remove_node(struct ast_data *root, struct ast_data *child)
Remove a node that was added using ast_data_add_.
static char * next_node_name(char **path)
#define AST_TEST_UNREGISTER(cb)
static void data_provider_release_all(struct ao2_container *parent, const char *registrar)
#define ast_rwlock_init(rwlock)
wrapper for rwlock with tracking enabled
struct ast_data * ast_data_add_char(struct ast_data *root, const char *childname, char value)
Add a char node type.
struct ao2_container * children
reference another node.
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
ast_data_get_cb get
Data get callback implementation.
#define ao2_alloc(data_size, destructor_fn)
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
void ast_xml_set_root(struct ast_xml_doc *doc, struct ast_xml_node *node)
Specify the root node of a XML document.
int ast_data_retrieve(struct ast_data *tree, const char *path, struct ast_data_retrieve *content)
Retrieve a value from a node in the tree.
static struct data_filter * data_filter_generate(const char *constfilter)
void ast_xml_set_text(struct ast_xml_node *node, const char *content)
Set an element content string.
static int ast_data_retrieve_int(struct ast_data *tree, const char *path)
Retrieve the integer value of a node.
unsigned int(* AST_DATA_BOOLEAN)(void *ptr)
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
#define AST_LIST_ENTRY(type)
Declare a forward link structure inside a list entry.
#define ao2_find(arg1, arg2, arg3)
static int data_search_cmp_dbl(const struct ast_data_search *root, const char *name, double value)
const char * ast_inet_ntoa(struct in_addr ia)
thread-safe replacement for inet_ntoa().
static void data_result_print_cli_node(int fd, const struct ast_data *node, uint32_t depth)
int __ast_data_add_structure(struct ast_data *root, const struct ast_data_mapping_structure *mapping, size_t mapping_len, void *structure)
Add a complete structure to a node.
static struct data_provider * data_provider_find(struct ao2_container *parent, const char *name, const char *registrar)
static void data_result_destructor(void *obj)
static void data_filter_destructor(void *obj)
static format_t capability
#define NUM_DATA_NODE_BUCKETS
ast_data_type
The data type of the data node.
void ast_xml_close(struct ast_xml_doc *doc)
Close an already open document and free the used structure.
#define NUM_DATA_RESULT_BUCKETS
if(yyss+yystacksize-1<=yyssp)
int __ast_data_register(const char *path, const struct ast_data_handler *handler, const char *registrar, struct ast_module *mod)
Register a data provider.
static struct data_provider * data_provider_new(const char *name, const struct ast_data_handler *handler, const char *registrar)
void ao2_iterator_destroy(struct ao2_iterator *i)
Destroy a container iterator.
static const uint32_t latest_query_compatible_version
The last compatible version.
void ast_str_reset(struct ast_str *buf)
Reset the content of a dynamic string. Useful before a series of ast_str_append.
static struct data_filter * data_filter_alloc(const char *name)
int __ast_data_unregister(const char *path, const char *registrar)
Unregister a data provider.
static int data_search_cmp_uint(const struct ast_data_search *root, const char *name, unsigned int value)
static void data_result_manager_output(struct mansession *s, const char *name, struct ao2_container *container, struct ast_str *path, int id)
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Structure for rwlock and tracking information.
Standard Command Line Interface.
static int data_search_comparison_result(int cmpval, enum data_search_comparison comparison_type)
#define ao2_container_alloc(arg1, arg2, arg3)
int ast_cli_register_multiple(struct ast_cli_entry *e, int len)
Register multiple commands.
static void data_result_print_cli(int fd, const struct ast_data *root)
static int data_search_cmp_ipaddr(const struct ast_data_search *root, const char *name, struct in_addr addr)
void *(* AST_DATA_POINTER)(void *ptr)
static struct ast_data * data_result_find_child(struct ast_data *root, const char *name)
char name[0]
The name of the node.
#define AST_DATA_STRUCTURE(__struct, __name)
#define AST_TEST_DEFINE(hdr)
struct data_filter * filter
The filter node that depends on the current node, this is used only when creating the result tree...
const char * registrar
Who registered this node.
struct data_filter::glob_list_t glob_list
Handy terminal functions for vt* terms.
static int data_search_cmp_int(const struct ast_data_search *root, const char *name, int value)
struct ast_data * ast_data_iterator_next(struct ast_data_iterator *iterator)
Get the next node of the tree.
int(* AST_DATA_TIMESTAMP)(void *ptr)
A query to the data API is specified in this structure.
static int filter(struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t len)
struct ast_data * ast_data_add_str(struct ast_data *root, const char *childname, const char *string)
Add a string node type.
void astman_send_error(struct mansession *s, const struct message *m, char *error)
Send error in manager transaction.
Asterisk module definitions.
struct ast_data_handler * handler
node content handler.
static struct data_filter * data_filter_find(struct ao2_container *parent, const char *name)
struct ast_data * ast_data_add_int(struct ast_data *root, const char *childname, int value)
Add an integer node type.
char name[0]
The name of the node we are trying to compare.
struct data_filter::@247 list
glob list entry
struct in_addr AST_DATA_IPADDR
#define ao2_unlink(arg1, arg2)
char * search
Search condition.
This structure is used by the iterator.
int inet_aton(const char *cp, struct in_addr *pin)
int ast_data_search_match(const struct ast_data_search *search, struct ast_data *data)
Check the current generated node to know if it matches the search condition.
uint32_t version
Structure version.
static force_inline int attribute_pure ast_str_case_hash(const char *str)
Compute a hash value on a case-insensitive string.
The structure of the node handler.
int ast_manager_unregister(char *action)
Unregister a registered manager command.
#define ASTERISK_FILE_VERSION(file, version)
Register/unregister a source code file with the core.
int __ast_data_search_cmp_structure(const struct ast_data_search *search, const struct ast_data_mapping_structure *mapping, size_t mapping_len, void *structure, const char *structure_name)
Based on a search tree, evaluate every member of a structure against it.
static int data_search_cmp_string(const struct ast_data_search *root, const char *name, char *value)
static int data_search_cmp_char(const struct ast_data_search *root, const char *name, char value)
struct in_addr(* AST_DATA_IPADDR)(void *ptr)
static force_inline int attribute_pure ast_str_hash(const char *str)
Compute a hash value on a string.
unsigned int AST_DATA_TIMESTAMP
unsigned int AST_DATA_SECONDS
struct ast_module * ast_module_ref(struct ast_module *)
static struct ast_data_search * data_search_generate(const char *search_string)
struct ast_data * ast_data_add_password(struct ast_data *root, const char *childname, const char *string)
Add a password node type.
static struct ast_data_search * data_search_add_child(struct ao2_container *parent, const char *name)