mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 04:11:08 +00:00
Add support for manager hooks, so you could fire off manager events over IRC if you were crazy enough. (issue #5161 reported by anthm with mods by moi)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@47229 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -60,6 +60,28 @@
|
|||||||
#define AST_MAX_MANHEADERS 80
|
#define AST_MAX_MANHEADERS 80
|
||||||
#define AST_MAX_MANHEADER_LEN 256
|
#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 mansession;
|
||||||
|
|
||||||
struct message {
|
struct message {
|
||||||
|
@@ -183,6 +183,26 @@ static AST_LIST_HEAD_STATIC(users, ast_manager_user);
|
|||||||
static struct manager_action *first_action = NULL;
|
static struct manager_action *first_action = NULL;
|
||||||
AST_MUTEX_DEFINE_STATIC(actionlock);
|
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
|
/*! \brief
|
||||||
* Event list management functions.
|
* Event list management functions.
|
||||||
* We assume that the event list always has at least one element,
|
* We assume that the event list always has at least one element,
|
||||||
@@ -2213,7 +2233,9 @@ int __manager_event(int category, const char *event,
|
|||||||
const char *file, int line, const char *func, const char *fmt, ...)
|
const char *file, int line, const char *func, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
struct mansession *s;
|
struct mansession *s;
|
||||||
|
struct manager_custom_hook *hook;
|
||||||
char auth[80];
|
char auth[80];
|
||||||
|
char tmp[4096] = "";
|
||||||
va_list ap;
|
va_list ap;
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
struct ast_dynamic_str *buf;
|
struct ast_dynamic_str *buf;
|
||||||
@@ -2262,6 +2284,22 @@ int __manager_event(int category, const char *event,
|
|||||||
}
|
}
|
||||||
AST_LIST_UNLOCK(&sessions);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -40,8 +40,8 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "asterisk/md5.h"
|
#include "asterisk/md5.h"
|
||||||
#include "asterisk/manager.h"
|
|
||||||
#include "asterisk/linkedlists.h"
|
#include "asterisk/linkedlists.h"
|
||||||
|
#include "asterisk/manager.h"
|
||||||
|
|
||||||
#undef gethostbyname
|
#undef gethostbyname
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user