Remove pthread.h from source. We should be using asterisk/lock.h everywhere instead...
[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 <asterisk/lock.h>
12 #include <asterisk/file.h>
13 #include <asterisk/logger.h>
14 #include <asterisk/channel.h>
15 #include <asterisk/pbx.h>
16 #include <asterisk/module.h>
17 #include <asterisk/manager.h>
18 #include <stdlib.h>
19 #include <unistd.h>
20 #include <string.h>
21 #include <stdlib.h>
22
23 static char *tdesc = "Custom User Event Application";
24
25 static char *app = "UserEvent";
26
27 static char *synopsis = "Send an arbitrary event to the manager interface";
28
29 static char *descrip = 
30 "  UserEvent(eventname[|body]): Sends an arbitrary event to the\n"
31 "manager interface, with an optional body representing additional\n"
32 "arguments.  The format of the event will be:\n"
33 "    Event: UserEvent<specified event name>\n"
34 "    Channel: <channel name>\n"
35 "    Uniqueid: <call uniqueid>\n"
36 "    [body]\n"
37 "If the body is not specified, only Event, Channel, and Uniqueid fields\n"
38 "will be present.  Returns 0.";
39
40 STANDARD_LOCAL_USER;
41
42 LOCAL_USER_DECL;
43
44 static int userevent_exec(struct ast_channel *chan, void *data)
45 {
46         struct localuser *u;
47         char info[512];
48     char eventname[512];
49         char *eventbody;
50
51         if (!data || !strlen(data)) {
52                 ast_log(LOG_WARNING, "UserEvent requires an argument (eventname|optional event body)\n");
53                 return -1;
54         }
55
56         strncpy(info, (char *)data, strlen((char *)data) + AST_MAX_EXTENSION-1);
57         eventbody = strchr(eventname, '|');
58         if (eventbody) {
59                 *eventbody = '\0';
60                 eventbody++;
61         }
62         snprintf(eventname, sizeof(eventname), "UserEvent%s", info);
63         LOCAL_USER_ADD(u);
64
65         if(eventbody) {
66             ast_log(LOG_DEBUG, "Sending user event: %s, %s\n", eventname, eventbody);
67             manager_event(EVENT_FLAG_CALL, eventname, 
68                         "Channel: %s\r\nUniqueid: %s\r\n%s\r\n",
69                         chan->name, chan->uniqueid, eventbody);
70         } else {
71             ast_log(LOG_DEBUG, "Sending user event: %s\n", eventname);
72             manager_event(EVENT_FLAG_CALL, eventname, 
73                         "Channel: %s\r\nUniqueid: %s\r\n", chan->name, chan->uniqueid);
74         }
75
76         LOCAL_USER_REMOVE(u);
77         return 0;
78 }
79
80 int unload_module(void)
81 {
82         STANDARD_HANGUP_LOCALUSERS;
83         return ast_unregister_application(app);
84 }
85
86 int load_module(void)
87 {
88         return ast_register_application(app, userevent_exec, synopsis, descrip);
89 }
90
91 char *description(void)
92 {
93         return tdesc;
94 }
95
96 int usecount(void)
97 {
98         int res;
99         STANDARD_USECOUNT(res);
100         return res;
101 }
102
103 char *key()
104 {
105         return ASTERISK_GPL_KEY;
106 }