Add support for manager hooks, so you could fire off manager events over IRC if you...
authorJoshua Colp <jcolp@digium.com>
Mon, 6 Nov 2006 17:05:04 +0000 (17:05 +0000)
committerJoshua Colp <jcolp@digium.com>
Mon, 6 Nov 2006 17:05:04 +0000 (17:05 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@47229 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/manager.h
main/manager.c
utils/astman.c

index 6a44ab9..c7b4896 100644 (file)
 #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 {
index 666cf28..80cfb07 100644 (file)
@@ -183,6 +183,26 @@ static AST_LIST_HEAD_STATIC(users, ast_manager_user);
 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,
@@ -2213,7 +2233,9 @@ int __manager_event(int category, const char *event,
        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;
@@ -2262,6 +2284,22 @@ int __manager_event(int category, const char *event,
        }
        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;
 }
 
index d3bbef8..f58aa6b 100644 (file)
@@ -40,8 +40,8 @@
 #include <stdlib.h>
 
 #include "asterisk/md5.h"
-#include "asterisk/manager.h"
 #include "asterisk/linkedlists.h"
+#include "asterisk/manager.h"
 
 #undef gethostbyname