ensure that user events are identified with the correct type (issue #5200)
[asterisk/asterisk.git] / apps / app_userevent.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * UserEvent application -- send manager event
5  * 
6  *
7  * This program is free software, distributed under the terms of
8  * the GNU General Public License
9  */
10
11 #include <stdlib.h>
12 #include <unistd.h>
13 #include <string.h>
14 #include <stdlib.h>
15
16 #include "asterisk.h"
17
18 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
19
20 #include "asterisk/lock.h"
21 #include "asterisk/file.h"
22 #include "asterisk/logger.h"
23 #include "asterisk/channel.h"
24 #include "asterisk/pbx.h"
25 #include "asterisk/module.h"
26 #include "asterisk/manager.h"
27
28 static char *tdesc = "Custom User Event Application";
29
30 static char *app = "UserEvent";
31
32 static char *synopsis = "Send an arbitrary event to the manager interface";
33
34 static char *descrip = 
35 "  UserEvent(eventname[|body]): Sends an arbitrary event to the\n"
36 "manager interface, with an optional body representing additional\n"
37 "arguments.  The format of the event will be:\n"
38 "    Event: UserEvent<specified event name>\n"
39 "    Channel: <channel name>\n"
40 "    Uniqueid: <call uniqueid>\n"
41 "    [body]\n"
42 "If the body is not specified, only Event, Channel, and Uniqueid fields\n"
43 "will be present.  Returns 0.";
44
45 STANDARD_LOCAL_USER;
46
47 LOCAL_USER_DECL;
48
49 static int userevent_exec(struct ast_channel *chan, void *data)
50 {
51         struct localuser *u;
52         char info[512];
53     char eventname[512];
54         char *eventbody;
55
56         if (!data || !strlen(data)) {
57                 ast_log(LOG_WARNING, "UserEvent requires an argument (eventname|optional event body)\n");
58                 return -1;
59         }
60
61         strncpy(info, (char *)data, strlen((char *)data) + AST_MAX_EXTENSION-1);
62         snprintf(eventname, sizeof(eventname), "UserEvent%s", info);
63         eventbody = strchr(eventname, '|');
64         if (eventbody) {
65                 *eventbody = '\0';
66                 eventbody++;
67         }
68         LOCAL_USER_ADD(u);
69
70         if(eventbody) {
71             ast_log(LOG_DEBUG, "Sending user event: %s, %s\n", eventname, eventbody);
72             manager_event(EVENT_FLAG_USER, eventname, 
73                         "Channel: %s\r\nUniqueid: %s\r\n%s\r\n",
74                         chan->name, chan->uniqueid, eventbody);
75         } else {
76             ast_log(LOG_DEBUG, "Sending user event: %s\n", eventname);
77             manager_event(EVENT_FLAG_USER, eventname, 
78                         "Channel: %s\r\nUniqueid: %s\r\n", chan->name, chan->uniqueid);
79         }
80
81         LOCAL_USER_REMOVE(u);
82         return 0;
83 }
84
85 int unload_module(void)
86 {
87         STANDARD_HANGUP_LOCALUSERS;
88         return ast_unregister_application(app);
89 }
90
91 int load_module(void)
92 {
93         return ast_register_application(app, userevent_exec, synopsis, descrip);
94 }
95
96 char *description(void)
97 {
98         return tdesc;
99 }
100
101 int usecount(void)
102 {
103         int res;
104         STANDARD_USECOUNT(res);
105         return res;
106 }
107
108 char *key()
109 {
110         return ASTERISK_GPL_KEY;
111 }