#define AST_MAX_MANHEADERS 80
#define AST_MAX_MANHEADER_LEN 256
+/* Manager Helper Function */
+typedef int (*manager_hook_t)(int, const char *, char *);
+
+struct manager_custom_hook {
+ /*! Identifier */
+ char *file;
+ /*! helper function */
+ manager_hook_t helper;
+ /*! Linked list information */
+ AST_RWLIST_ENTRY(manager_custom_hook) list;
+};
+
+/*! Add a custom hook to be called when an event is fired */
+/*! \param hook struct manager_custom_hook object to add
+*/
+void ast_manager_register_hook(struct manager_custom_hook *hook);
+
+/*! Delete a custom hook to be called when an event is fired */
+/*! \param hook struct manager_custom_hook object to delete
+*/
+void ast_manager_unregister_hook(struct manager_custom_hook *hook);
+
struct mansession;
struct message {
static struct manager_action *first_action = NULL;
AST_MUTEX_DEFINE_STATIC(actionlock);
+static AST_RWLIST_HEAD_STATIC(manager_hooks, manager_custom_hook);
+
+/*! \brief Add a custom hook to be called when an event is fired */
+void ast_manager_register_hook(struct manager_custom_hook *hook)
+{
+ AST_RWLIST_WRLOCK(&manager_hooks);
+ AST_RWLIST_INSERT_TAIL(&manager_hooks, hook, list);
+ AST_RWLIST_UNLOCK(&manager_hooks);
+ return;
+}
+
+/*! \brief Delete a custom hook to be called when an event is fired */
+void ast_manager_unregister_hook(struct manager_custom_hook *hook)
+{
+ AST_RWLIST_WRLOCK(&manager_hooks);
+ AST_RWLIST_REMOVE(&manager_hooks, hook, list);
+ AST_RWLIST_UNLOCK(&manager_hooks);
+ return;
+}
+
/*! \brief
* Event list management functions.
* We assume that the event list always has at least one element,
const char *file, int line, const char *func, const char *fmt, ...)
{
struct mansession *s;
+ struct manager_custom_hook *hook;
char auth[80];
+ char tmp[4096] = "";
va_list ap;
struct timeval now;
struct ast_dynamic_str *buf;
}
AST_LIST_UNLOCK(&sessions);
+ AST_RWLIST_RDLOCK(&manager_hooks);
+ if (!AST_RWLIST_EMPTY(&manager_hooks)) {
+ char *p;
+ int len;
+ snprintf(tmp, sizeof(tmp), "event: %s\r\nprivilege: %s\r\n", event, authority_to_str(category, tmp, sizeof(tmp)));
+ len = strlen(tmp);
+ p = tmp + len;
+ va_start(ap, fmt);
+ vsnprintf(p, sizeof(tmp) - len, fmt, ap);
+ va_end(ap);
+ AST_RWLIST_TRAVERSE(&manager_hooks, hook, list) {
+ hook->helper(category, event, tmp);
+ }
+ }
+ AST_RWLIST_UNLOCK(&manager_hooks);
+
return 0;
}