30#define getdb(driver) (driver->handle->handle)
75 const char *
name = arg;
76 size_t name_len = *(
size_t *)
data;
116 size_t id_len = *(
size_t *)
data;
120 ast_log(
LOG_ERROR,
"BUG! Must supply a uniqueid or partial uniqueid to match!\n");
153 const char *exten,
const char *
context)
156 char *l_exten = (
char *) exten;
157 char *l_context = (
char *)
context;
174 const char *
name,
size_t name_len)
177 char *l_name = (
char *)
name;
225 const char *
name,
size_t name_len)
228 char *l_name = (
char *)
name;
236 (name_len == 0) ?
OBJ_KEY : 0);
249 char *l_exten = (
char *)
exten;
250 char *l_context = (
char *)
context;
289 ast_debug(1,
"Closing ao2_container channel storage driver %s\n", driver ? driver->
name :
"NULL");
330 const char *right_key = obj_right;
342 cmp = strncasecmp(
ast_channel_name(tps_left), right_key, strlen(right_key));
351 const char *_name =
name ?
name :
"default";
353 sizeof(*driver) + strlen(_name) + 1);
355 ast_debug(1,
"Opening channel storage driver %s\n", _name);
358 ast_log(
LOG_ERROR,
"Failed to allocate memory for channel storage driver %s\n",
363 strcpy(driver->
name, _name);
367 ast_log(
LOG_ERROR,
"Failed to allocate memory for channel storage driver %s\n",
381 ast_debug(1,
"Opened channel storage driver %s. driver: %p container: %p\n",
382 _name, driver, driver->
handle);
Asterisk main include file. File version handling, generic pbx functions.
#define ast_calloc(num, len)
A wrapper for calloc()
#define ao2_iterator_next(iter)
@ AO2_ALLOC_OPT_LOCK_MUTEX
void ao2_container_unregister(const char *name)
Unregister a container for CLI stats and integrity check.
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
#define ao2_callback_data(container, flags, cb_fn, arg, data)
#define ao2_unlink(container, obj)
Remove an object from a container.
#define ao2_link_flags(container, obj, flags)
Add an object to a container.
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
int ao2_container_register(const char *name, struct ao2_container *self, ao2_prnt_obj_fn *prnt_obj)
Register a container for CLI stats and integrity check.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
int() ao2_callback_data_fn(void *obj, void *arg, void *data, int flags)
Type of a generic callback function.
@ OBJ_SEARCH_PARTIAL_KEY
The arg parameter is a partial search key similar to OBJ_SEARCH_KEY.
@ OBJ_SEARCH_OBJECT
The arg parameter is an object of the same type.
@ OBJ_SEARCH_MASK
Search option field mask.
@ OBJ_SEARCH_KEY
The arg parameter is a search key, but is not an object.
#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.
void() ao2_prnt_fn(void *where, const char *fmt,...)
Print output.
General Asterisk PBX channel definitions.
const char * ast_channel_name(const struct ast_channel *chan)
#define ast_channel_lock(chan)
const char * ast_channel_uniqueid(const struct ast_channel *chan)
const char * ast_channel_context(const struct ast_channel *chan)
#define AST_NUM_CHANNEL_BUCKETS
const char * ast_channel_exten(const struct ast_channel *chan)
#define ast_channel_unlock(chan)
int ast_channelstorage_register_driver(const struct ast_channelstorage_driver *driver_type)
static int by_exten_cb(void *obj, void *arg, void *data, int flags)
static void lock_driver(struct ast_channelstorage_instance *driver)
static struct ast_channel * get_by_uniqueid(struct ast_channelstorage_instance *driver, const char *uniqueid)
static struct ast_channelstorage_driver driver_type
static struct ast_channel_iterator * iterator_by_exten_new(struct ast_channelstorage_instance *driver, const char *exten, const char *context)
static void close_instance(struct ast_channelstorage_instance *driver)
static void __startup(void)
static struct ast_channel * get_by_name_prefix(struct ast_channelstorage_instance *driver, const char *name, size_t name_len)
static struct ast_channel * iterator_next(struct ast_channelstorage_instance *driver, struct ast_channel_iterator *i)
static int active_channels(struct ast_channelstorage_instance *driver)
returns number of active/allocated channels
static int by_uniqueid_cb(void *obj, void *arg, void *data, int flags)
static int channel_cmp_cb(void *obj_left, void *obj_right, int flags)
static struct ast_channel_iterator * iterator_destroy(struct ast_channelstorage_instance *driver, struct ast_channel_iterator *i)
static struct ast_channel_iterator * iterator_by_name_new(struct ast_channelstorage_instance *driver, const char *name, size_t name_len)
static void unlock_driver(struct ast_channelstorage_instance *driver)
static struct ast_channelstorage_instance channelstorage_instance
static void prnt_channel_key(void *v_obj, void *where, ao2_prnt_fn *prnt)
static int hash_cb(const void *obj, const int flags)
static int insert_channel(struct ast_channelstorage_instance *driver, struct ast_channel *chan, int flags, int lock)
static struct ast_channel * get_by_exten(struct ast_channelstorage_instance *driver, const char *exten, const char *context)
static struct ast_channel_iterator * iterator_all_new(struct ast_channelstorage_instance *driver)
static int by_name_cb(void *obj, void *arg, void *data, int flags)
static struct ast_channelstorage_instance * get_instance(const char *name)
static int delete_channel(struct ast_channelstorage_instance *driver, struct ast_channel *chan, int lock)
static struct ast_channel * callback(struct ast_channelstorage_instance *driver, ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
#define ast_debug(level,...)
Log a DEBUG message.
static force_inline int attribute_pure ast_strlen_zero(const char *s)
static force_inline int attribute_pure ast_str_case_hash(const char *str)
Compute a hash value on a case-insensitive string.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
struct ao2_iterator simple_iterator
struct ao2_iterator * active_iterator
Main Channel structure associated with a channel.
struct ast_channel_id uniqueid
char exten[AST_MAX_EXTENSION]
struct ao2_container * handle
struct ast_channelstorage_driver_pvt * handle