Audiohook inheritance function. More...
#include "asterisk.h"#include "asterisk/datastore.h"#include "asterisk/channel.h"#include "asterisk/logger.h"#include "asterisk/audiohook.h"#include "asterisk/pbx.h"#include "asterisk/module.h"
Go to the source code of this file.
Data Structures | |
| struct | audiohook_inheritance_datastore |
| struct | inheritable_audiohook |
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static void | audiohook_inheritance_destroy (void *data) |
| Destroy dynamically allocated data on an audiohook_inheritance_datastore. | |
| static void | audiohook_inheritance_fixup (void *data, struct ast_channel *old_chan, struct ast_channel *new_chan) |
| Move audiohooks as defined by previous calls to the AUDIOHOOK_INHERIT function. | |
| static int | func_inheritance_write (struct ast_channel *chan, const char *function, char *data, const char *value) |
| Set the permissibility of inheritance for a particular audiohook source on a channel. | |
| static int | load_module (void) |
| static int | setup_inheritable_audiohook (struct audiohook_inheritance_datastore *audiohook_inheritance_datastore, const char *source) |
| Create a new inheritable_audiohook structure and add it to an audiohook_inheritance_datastore. | |
| static struct audiohook_inheritance_datastore * | setup_inheritance_datastore (struct ast_channel *chan) |
| create an audiohook_inheritance_datastore and attach it to a channel | |
| static int | unload_module (void) |
Variables | |
| static struct ast_module_info __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Audiohook inheritance function" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| static struct ast_datastore_info | audiohook_inheritance_info |
| static struct ast_custom_function | inheritance_function |
Audiohook inheritance function.
Definition in file func_audiohookinherit.c.
| static void __reg_module | ( | void | ) | [static] |
Definition at line 295 of file func_audiohookinherit.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 295 of file func_audiohookinherit.c.
| static void audiohook_inheritance_destroy | ( | void * | data | ) | [static] |
Destroy dynamically allocated data on an audiohook_inheritance_datastore.
| data | Pointer to the audiohook_inheritance_datastore in question. |
Definition at line 137 of file func_audiohookinherit.c.
References audiohook_inheritance_datastore::allowed_list, ast_free, and AST_LIST_REMOVE_HEAD.
{
struct audiohook_inheritance_datastore *audiohook_inheritance_datastore = data;
struct inheritable_audiohook *inheritable_audiohook = NULL;
while ((inheritable_audiohook = AST_LIST_REMOVE_HEAD(&audiohook_inheritance_datastore->allowed_list, list))) {
ast_free(inheritable_audiohook);
}
ast_free(audiohook_inheritance_datastore);
}
| static void audiohook_inheritance_fixup | ( | void * | data, |
| struct ast_channel * | old_chan, | ||
| struct ast_channel * | new_chan | ||
| ) | [static] |
Move audiohooks as defined by previous calls to the AUDIOHOOK_INHERIT function.
Move allowed audiohooks from the old channel to the new channel.
| data | The ast_datastore containing audiohook inheritance information that will be moved |
| old_chan | The "clone" channel from a masquerade. We are moving the audiohook in question off of this channel |
| new_chan | The "original" channel from a masquerade. We are moving the audiohook in question to this channel |
Definition at line 117 of file func_audiohookinherit.c.
References audiohook_inheritance_datastore::allowed_list, ast_audiohook_move_by_source(), ast_debug, AST_LIST_TRAVERSE, ast_channel::name, and inheritable_audiohook::source.
{
struct inheritable_audiohook *audiohook = NULL;
struct audiohook_inheritance_datastore *datastore = data;
ast_debug(2, "inheritance fixup occurring for channels %s(%p) and %s(%p)", old_chan->name, old_chan, new_chan->name, new_chan);
AST_LIST_TRAVERSE(&datastore->allowed_list, audiohook, list) {
ast_audiohook_move_by_source(old_chan, new_chan, audiohook->source);
ast_debug(3, "Moved audiohook %s from %s(%p) to %s(%p)\n",
audiohook->source, old_chan->name, old_chan, new_chan->name, new_chan);
}
return;
}
| static int func_inheritance_write | ( | struct ast_channel * | chan, |
| const char * | function, | ||
| char * | data, | ||
| const char * | value | ||
| ) | [static] |
Set the permissibility of inheritance for a particular audiohook source on a channel.
For details regarding what happens in the function, see the inline comments
| chan | The channel we are operating on |
| function | The name of the dialplan function (AUDIOHOOK_INHERIT) |
| data | The audiohook source for which we are setting inheritance permissions |
| value | The value indicating the permission for audiohook inheritance |
Definition at line 207 of file func_audiohookinherit.c.
References audiohook_inheritance_datastore::allowed_list, ast_channel_datastore_find(), ast_channel_lock, ast_channel_unlock, ast_debug, ast_free, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_log(), ast_strlen_zero(), ast_true(), audiohook_inheritance_info, ast_datastore::data, LOG_WARNING, ast_channel::name, setup_inheritable_audiohook(), setup_inheritance_datastore(), and inheritable_audiohook::source.
{
int allow;
struct ast_datastore *datastore = NULL;
struct audiohook_inheritance_datastore *inheritance_datastore = NULL;
struct inheritable_audiohook *inheritable_audiohook;
/* Step 1: Get data from function call */
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "No argument provided to INHERITANCE function.\n");
return -1;
}
if (ast_strlen_zero(value)) {
ast_log(LOG_WARNING, "No value provided to INHERITANCE function.\n");
return -1;
}
allow = ast_true(value);
/* Step 2: retrieve or set up datastore */
ast_channel_lock(chan);
if (!(datastore = ast_channel_datastore_find(chan, &audiohook_inheritance_info, NULL))) {
ast_channel_unlock(chan);
/* In the case where we cannot find the datastore, we can take a few shortcuts */
if (!allow) {
ast_debug(1, "Audiohook %s is already set to not be inheritable on channel %s\n", data, chan->name);
return 0;
} else if (!(inheritance_datastore = setup_inheritance_datastore(chan))) {
ast_log(LOG_WARNING, "Unable to set up audiohook inheritance datastore on channel %s\n", chan->name);
return -1;
} else {
return setup_inheritable_audiohook(inheritance_datastore, data);
}
} else {
inheritance_datastore = datastore->data;
}
ast_channel_unlock(chan);
/* Step 3: Traverse the list to see if we're trying something redundant */
AST_LIST_TRAVERSE_SAFE_BEGIN(&inheritance_datastore->allowed_list, inheritable_audiohook, list) {
if (!strcasecmp(inheritable_audiohook->source, data)) {
if (allow) {
ast_debug(2, "Audiohook source %s is already set up to be inherited from channel %s\n", data, chan->name);
return 0;
} else {
ast_debug(2, "Removing inheritability of audiohook %s from channel %s\n", data, chan->name);
AST_LIST_REMOVE_CURRENT(list);
ast_free(inheritable_audiohook);
return 0;
}
}
}
AST_LIST_TRAVERSE_SAFE_END;
/* Step 4: There is no step 4 */
/* Step 5: This means we are addressing an audiohook source which we have not encountered yet for the channel. Create a new inheritable
* audiohook structure if we're allowing inheritance, or just return if not
*/
if (allow) {
return setup_inheritable_audiohook(inheritance_datastore, data);
} else {
ast_debug(1, "Audiohook %s is already set to not be inheritable on channel %s\n", data, chan->name);
return 0;
}
}
| static int load_module | ( | void | ) | [static] |
Definition at line 287 of file func_audiohookinherit.c.
References ast_custom_function_register, AST_MODULE_LOAD_DECLINE, and AST_MODULE_LOAD_SUCCESS.
{
if (ast_custom_function_register(&inheritance_function)) {
return AST_MODULE_LOAD_DECLINE;
} else {
return AST_MODULE_LOAD_SUCCESS;
}
}
| static int setup_inheritable_audiohook | ( | struct audiohook_inheritance_datastore * | audiohook_inheritance_datastore, |
| const char * | source | ||
| ) | [static] |
Create a new inheritable_audiohook structure and add it to an audiohook_inheritance_datastore.
| audiohook_inheritance_datastore | The audiohook_inheritance_datastore we want to add the new inheritable_audiohook to |
| source | The audiohook source for the newly created inheritable_audiohook |
| 0 | Success |
| non-zero | Failure |
Definition at line 182 of file func_audiohookinherit.c.
References audiohook_inheritance_datastore::allowed_list, ast_calloc, ast_debug, AST_LIST_INSERT_TAIL, and inheritable_audiohook::source.
Referenced by func_inheritance_write().
{
struct inheritable_audiohook *inheritable_audiohook = NULL;
inheritable_audiohook = ast_calloc(1, sizeof(*inheritable_audiohook) + strlen(source));
if (!inheritable_audiohook) {
return -1;
}
strcpy(inheritable_audiohook->source, source);
AST_LIST_INSERT_TAIL(&audiohook_inheritance_datastore->allowed_list, inheritable_audiohook, list);
ast_debug(3, "Set audiohook %s to be inheritable\n", source);
return 0;
}
| static struct audiohook_inheritance_datastore* setup_inheritance_datastore | ( | struct ast_channel * | chan | ) | [static, read] |
create an audiohook_inheritance_datastore and attach it to a channel
| chan | The channel to which we wish to attach the new datastore |
Definition at line 154 of file func_audiohookinherit.c.
References ast_calloc, ast_channel_datastore_add(), ast_channel_lock, ast_channel_unlock, ast_datastore_alloc(), ast_datastore_free(), audiohook_inheritance_info, and ast_datastore::data.
Referenced by func_inheritance_write().
{
struct ast_datastore *datastore = NULL;
struct audiohook_inheritance_datastore *audiohook_inheritance_datastore = NULL;
if (!(datastore = ast_datastore_alloc(&audiohook_inheritance_info, NULL))) {
return NULL;
}
if (!(audiohook_inheritance_datastore = ast_calloc(1, sizeof(*audiohook_inheritance_datastore)))) {
ast_datastore_free(datastore);
return NULL;
}
datastore->data = audiohook_inheritance_datastore;
ast_channel_lock(chan);
ast_channel_datastore_add(chan, datastore);
ast_channel_unlock(chan);
return audiohook_inheritance_datastore;
}
| static int unload_module | ( | void | ) | [static] |
Definition at line 282 of file func_audiohookinherit.c.
References ast_custom_function_unregister().
{
return ast_custom_function_unregister(&inheritance_function);
}
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Audiohook inheritance function" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 295 of file func_audiohookinherit.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 295 of file func_audiohookinherit.c.
struct ast_datastore_info audiohook_inheritance_info [static] |
{
.type = "audiohook inheritance",
.destroy = audiohook_inheritance_destroy,
.chan_fixup = audiohook_inheritance_fixup,
}
Definition at line 102 of file func_audiohookinherit.c.
Referenced by func_inheritance_write(), and setup_inheritance_datastore().
struct ast_custom_function inheritance_function [static] |
{
.name = "AUDIOHOOK_INHERIT",
.write = func_inheritance_write,
}
Definition at line 277 of file func_audiohookinherit.c.