Index: apps/app_userevent.c =================================================================== --- apps/app_userevent.c (revision 8206) +++ apps/app_userevent.c (working copy) @@ -38,7 +38,12 @@ #include "asterisk/pbx.h" #include "asterisk/module.h" #include "asterisk/manager.h" +#include "asterisk/app.h" +#define MAX_ARGS 16 +#define MAX_SIZE_EVENTNAME 512 +#define MAX_SIZE_EVENTBODY 1024 + static char *tdesc = "Custom User Event Application"; static char *app = "UserEvent"; @@ -46,15 +51,16 @@ static char *synopsis = "Send an arbitrary event to the manager interface"; static char *descrip = -" UserEvent(eventname[|body]): Sends an arbitrary event to the\n" -"manager interface, with an optional body representing additional\n" +" UserEvent(eventname[|Header: data[|Header: data]]): Sends an arbitrary\n" +"event to the manager interface, with an optional body representing additional\n" "arguments. The format of the event will be:\n" " Event: UserEvent\n" " Channel: \n" " Uniqueid: \n" -" [body]\n" -"If the body is not specified, only Event, Channel, and Uniqueid fields\n" -"will be present. Returns 0."; +" Header: data\n" +" Header: data\n" +"If additional headers are not specified, only Event, Channel, and Uniqueid\n" +"fields will be present."; STANDARD_LOCAL_USER; @@ -63,9 +69,14 @@ static int userevent_exec(struct ast_channel *chan, void *data) { struct localuser *u; - char *info; - char eventname[512]; - char *eventbody; + char *parse; + char eventname[MAX_SIZE_EVENTNAME]; + char eventbody[MAX_SIZE_EVENTBODY]; + char *buf; + size_t space; + int i; + unsigned int argc; + char *argv[MAX_ARGS]; if (ast_strlen_zero(data)) { ast_log(LOG_WARNING, "UserEvent requires an argument (eventname|optional event body)\n"); @@ -74,30 +85,27 @@ LOCAL_USER_ADD(u); - info = ast_strdupa(data); - if (!info) { + parse = ast_strdupa(data); + if (!parse) { ast_log(LOG_ERROR, "Out of memory\n"); LOCAL_USER_REMOVE(u); return -1; } - snprintf(eventname, sizeof(eventname), "UserEvent%s", info); - eventbody = strchr(eventname, '|'); - if (eventbody) { - *eventbody = '\0'; - eventbody++; - } + argc = ast_app_separate_args(parse, '|', argv, MAX_ARGS); + + snprintf(eventname, sizeof(eventname), "UserEvent%s", argv[0]); + + space = MAX_SIZE_EVENTBODY; + buf = eventbody; + *buf = NULL; + for (i = 1; i < argc; i++) + ast_build_string(&buf, &space, "%s\r\n", argv[i]); - if(eventbody) { - ast_log(LOG_DEBUG, "Sending user event: %s, %s\n", eventname, eventbody); - manager_event(EVENT_FLAG_USER, eventname, - "Channel: %s\r\nUniqueid: %s\r\n%s\r\n", - chan->name, chan->uniqueid, eventbody); - } else { - ast_log(LOG_DEBUG, "Sending user event: %s\n", eventname); - manager_event(EVENT_FLAG_USER, eventname, - "Channel: %s\r\nUniqueid: %s\r\n", chan->name, chan->uniqueid); - } + ast_log(LOG_DEBUG, "Sending user event: %s, %s\n", eventname, eventbody); + manager_event(EVENT_FLAG_USER, eventname, + "Channel: %s\r\nUniqueid: %s\r\n%s", + chan->name, chan->uniqueid, eventbody); LOCAL_USER_REMOVE(u); return 0;