diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-01-05 22:16:33 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-01-05 22:16:33 +0000 |
commit | a6d4c512c85a5c5a908521066fe4a7ba772e4aec (patch) | |
tree | ccaced165563a62abe8a3613e25cb0f1abc7295c /main/manager.c | |
parent | 5d863dcd8db84fab3df37c0f32fb459fd1b94948 (diff) |
reduce stack consumption for AMI and AMI/HTTP requests by nearly 20K in most cases
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@49676 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/manager.c')
-rw-r--r-- | main/manager.c | 288 |
1 files changed, 149 insertions, 139 deletions
diff --git a/main/manager.c b/main/manager.c index c0fa09a47..260595007 100644 --- a/main/manager.c +++ b/main/manager.c @@ -70,16 +70,16 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/linkedlists.h" struct fast_originate_helper { - char tech[AST_MAX_MANHEADER_LEN]; - char data[AST_MAX_MANHEADER_LEN]; + char tech[AST_MAX_EXTENSION]; + char data[AST_MAX_EXTENSION]; int timeout; char app[AST_MAX_APP]; - char appdata[AST_MAX_MANHEADER_LEN]; - char cid_name[AST_MAX_MANHEADER_LEN]; - char cid_num[AST_MAX_MANHEADER_LEN]; + char appdata[AST_MAX_EXTENSION]; + char cid_name[AST_MAX_EXTENSION]; + char cid_num[AST_MAX_EXTENSION]; char context[AST_MAX_CONTEXT]; char exten[AST_MAX_EXTENSION]; - char idtext[AST_MAX_MANHEADER_LEN]; + char idtext[AST_MAX_EXTENSION]; char account[AST_MAX_ACCOUNT_CODE]; int priority; struct ast_variable *vars; @@ -160,7 +160,7 @@ struct mansession { /*! Authorization for writing */ int writeperm; /*! Buffer */ - char inbuf[AST_MAX_MANHEADER_LEN]; + char inbuf[1024]; int inlen; int send_events; int displaysystemname; /*!< Add system name to manager responses and events */ @@ -675,7 +675,7 @@ static void destroy_session(struct mansession *s) free_session(s); } -char *astman_get_header(struct message *m, char *var) +const char *astman_get_header(const struct message *m, char *var) { char cmp[80]; int x; @@ -690,7 +690,7 @@ char *astman_get_header(struct message *m, char *var) return ""; } -struct ast_variable *astman_get_variables(struct message *m) +struct ast_variable *astman_get_variables(const struct message *m) { int varlen, x, y; struct ast_variable *head = NULL, *cur; @@ -739,9 +739,9 @@ struct ast_variable *astman_get_variables(struct message *m) be read until either the current action finishes or get_input() obtains the session lock. */ -void astman_send_error(struct mansession *s, struct message *m, char *error) +void astman_send_error(struct mansession *s, const struct message *m, char *error) { - char *id = astman_get_header(m,"ActionID"); + const char *id = astman_get_header(m,"ActionID"); astman_append(s, "Response: Error\r\n"); if (!ast_strlen_zero(id)) @@ -749,9 +749,9 @@ void astman_send_error(struct mansession *s, struct message *m, char *error) astman_append(s, "Message: %s\r\n\r\n", error); } -void astman_send_response(struct mansession *s, struct message *m, char *resp, char *msg) +void astman_send_response(struct mansession *s, const struct message *m, char *resp, char *msg) { - char *id = astman_get_header(m,"ActionID"); + const char *id = astman_get_header(m,"ActionID"); astman_append(s, "Response: %s\r\n", resp); if (!ast_strlen_zero(id)) @@ -762,7 +762,7 @@ void astman_send_response(struct mansession *s, struct message *m, char *resp, c astman_append(s, "\r\n"); } -void astman_send_ack(struct mansession *s, struct message *m, char *msg) +void astman_send_ack(struct mansession *s, const struct message *m, char *msg) { astman_send_response(s, m, "Success", msg); } @@ -822,11 +822,11 @@ static int ast_is_number(char *string) return ret ? atoi(string) : 0; } -static int ast_strings_to_mask(char *string) +static int strings_to_mask(const char *string) { int x, ret = -1; - x = ast_is_number(string); + x = ast_is_number((char *) string); if (x) ret = x; @@ -853,9 +853,9 @@ static int ast_strings_to_mask(char *string) Rather than braindead on,off this now can also accept a specific int mask value or a ',' delim list of mask strings (the same as manager.conf) -anthm */ -static int set_eventmask(struct mansession *s, char *eventmask) +static int set_eventmask(struct mansession *s, const char *eventmask) { - int maskint = ast_strings_to_mask(eventmask); + int maskint = strings_to_mask(eventmask); ast_mutex_lock(&s->__lock); if (maskint >= 0) @@ -865,15 +865,15 @@ static int set_eventmask(struct mansession *s, char *eventmask) return maskint; } -static int authenticate(struct mansession *s, struct message *m) +static int authenticate(struct mansession *s, const struct message *m) { struct ast_config *cfg; char *cat; - char *user = astman_get_header(m, "Username"); - char *pass = astman_get_header(m, "Secret"); - char *authtype = astman_get_header(m, "AuthType"); - char *key = astman_get_header(m, "Key"); - char *events = astman_get_header(m, "Events"); + const char *user = astman_get_header(m, "Username"); + const char *pass = astman_get_header(m, "Secret"); + const char *authtype = astman_get_header(m, "AuthType"); + const char *key = astman_get_header(m, "Key"); + const char *events = astman_get_header(m, "Events"); cfg = ast_config_load("manager.conf"); if (!cfg) @@ -969,7 +969,7 @@ static char mandescr_ping[] = " manager connection open.\n" "Variables: NONE\n"; -static int action_ping(struct mansession *s, struct message *m) +static int action_ping(struct mansession *s, const struct message *m) { astman_send_response(s, m, "Pong", NULL); return 0; @@ -981,16 +981,16 @@ static char mandescr_getconfig[] = "Variables:\n" " Filename: Configuration filename (e.g. foo.conf)\n"; -static int action_getconfig(struct mansession *s, struct message *m) +static int action_getconfig(struct mansession *s, const struct message *m) { struct ast_config *cfg; - char *fn = astman_get_header(m, "Filename"); + const char *fn = astman_get_header(m, "Filename"); int catcount = 0; int lineno = 0; char *category=NULL; struct ast_variable *v; char idText[256] = ""; - char *id = astman_get_header(m, "ActionID"); + const char *id = astman_get_header(m, "ActionID"); if (!ast_strlen_zero(id)) snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id); @@ -1018,11 +1018,11 @@ static int action_getconfig(struct mansession *s, struct message *m) } -static void handle_updates(struct mansession *s, struct message *m, struct ast_config *cfg) +static void handle_updates(struct mansession *s, const struct message *m, struct ast_config *cfg) { int x; char hdr[40]; - char *action, *cat, *var, *value, *match; + const char *action, *cat, *var, *value, *match; struct ast_category *category; struct ast_variable *v; @@ -1054,13 +1054,13 @@ static void handle_updates(struct mansession *s, struct message *m, struct ast_c } } else if (!strcasecmp(action, "delcat")) { if (!ast_strlen_zero(cat)) - ast_category_delete(cfg, cat); + ast_category_delete(cfg, (char *) cat); } else if (!strcasecmp(action, "update")) { if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && (category = ast_category_get(cfg, cat))) - ast_variable_update(category, var, value, match); + ast_variable_update(category, (char *) var, (char *) value, (char *) match); } else if (!strcasecmp(action, "delete")) { if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && (category = ast_category_get(cfg, cat))) - ast_variable_delete(category, var, match); + ast_variable_delete(category, (char *) var, (char *) match); } else if (!strcasecmp(action, "append")) { if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && (category = ast_category_get(cfg, cat)) && @@ -1086,15 +1086,15 @@ static char mandescr_updateconfig[] = " Value-XXXXXX: Value to work on\n" " Match-XXXXXX: Extra match required to match line\n"; -static int action_updateconfig(struct mansession *s, struct message *m) +static int action_updateconfig(struct mansession *s, const struct message *m) { struct ast_config *cfg; - char *sfn = astman_get_header(m, "SrcFilename"); - char *dfn = astman_get_header(m, "DstFilename"); + const char *sfn = astman_get_header(m, "SrcFilename"); + const char *dfn = astman_get_header(m, "DstFilename"); int res; char idText[256] = ""; - char *id = astman_get_header(m, "ActionID"); - char *rld = astman_get_header(m, "Reload"); + const char *id = astman_get_header(m, "ActionID"); + const char *rld = astman_get_header(m, "Reload"); if (!ast_strlen_zero(id)) snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id); @@ -1131,15 +1131,15 @@ static char mandescr_waitevent[] = "Variables: \n" " Timeout: Maximum time to wait for events\n"; -static int action_waitevent(struct mansession *s, struct message *m) +static int action_waitevent(struct mansession *s, const struct message *m) { - char *timeouts = astman_get_header(m, "Timeout"); + const char *timeouts = astman_get_header(m, "Timeout"); int timeout = -1, max; int x; int needexit = 0; time_t now; struct eventqent *eqe; - char *id = astman_get_header(m,"ActionID"); + const char *id = astman_get_header(m,"ActionID"); char idText[256] = ""; if (!ast_strlen_zero(id)) @@ -1218,12 +1218,12 @@ static char mandescr_listcommands[] = " action that is available to the user\n" "Variables: NONE\n"; -static int action_listcommands(struct mansession *s, struct message *m) +static int action_listcommands(struct mansession *s, const struct message *m) { struct manager_action *cur = first_action; char idText[256] = ""; char temp[BUFSIZ]; - char *id = astman_get_header(m,"ActionID"); + const char *id = astman_get_header(m,"ActionID"); if (!ast_strlen_zero(id)) snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id); @@ -1248,9 +1248,9 @@ static char mandescr_events[] = " 'off' if no events should be sent,\n" " 'system,call,log' to select which flags events should have to be sent.\n"; -static int action_events(struct mansession *s, struct message *m) +static int action_events(struct mansession *s, const struct message *m) { - char *mask = astman_get_header(m, "EventMask"); + const char *mask = astman_get_header(m, "EventMask"); int res; res = set_eventmask(s, mask); @@ -1266,7 +1266,7 @@ static char mandescr_logoff[] = "Description: Logoff this manager session\n" "Variables: NONE\n"; -static int action_logoff(struct mansession *s, struct message *m) +static int action_logoff(struct mansession *s, const struct message *m) { astman_send_response(s, m, "Goodbye", "Thanks for all the fish."); return -1; @@ -1277,10 +1277,10 @@ static char mandescr_hangup[] = "Variables: \n" " Channel: The channel name to be hungup\n"; -static int action_hangup(struct mansession *s, struct message *m) +static int action_hangup(struct mansession *s, const struct message *m) { struct ast_channel *c = NULL; - char *name = astman_get_header(m, "Channel"); + const char *name = astman_get_header(m, "Channel"); if (ast_strlen_zero(name)) { astman_send_error(s, m, "No channel specified"); return 0; @@ -1303,12 +1303,12 @@ static char mandescr_setvar[] = " *Variable: Variable name\n" " *Value: Value\n"; -static int action_setvar(struct mansession *s, struct message *m) +static int action_setvar(struct mansession *s, const struct message *m) { struct ast_channel *c = NULL; - char *name = astman_get_header(m, "Channel"); - char *varname = astman_get_header(m, "Variable"); - char *varval = astman_get_header(m, "Value"); + const char *name = astman_get_header(m, "Channel"); + const char *varname = astman_get_header(m, "Variable"); + const char *varval = astman_get_header(m, "Value"); if (ast_strlen_zero(varname)) { astman_send_error(s, m, "No variable specified"); @@ -1345,12 +1345,12 @@ static char mandescr_getvar[] = " *Variable: Variable name\n" " ActionID: Optional Action id for message matching.\n"; -static int action_getvar(struct mansession *s, struct message *m) +static int action_getvar(struct mansession *s, const struct message *m) { struct ast_channel *c = NULL; - char *name = astman_get_header(m, "Channel"); - char *varname = astman_get_header(m, "Variable"); - char *id = astman_get_header(m,"ActionID"); + const char *name = astman_get_header(m, "Channel"); + const char *varname = astman_get_header(m, "Variable"); + const char *id = astman_get_header(m,"ActionID"); char *varval; char workspace[1024]; @@ -1368,7 +1368,7 @@ static int action_getvar(struct mansession *s, struct message *m) } if (varname[strlen(varname) - 1] == ')') { - ast_func_read(c, varname, workspace, sizeof(workspace)); + ast_func_read(c, (char *) varname, workspace, sizeof(workspace)); } else { pbx_retrieve_variable(c, varname, &varval, workspace, sizeof(workspace), NULL); } @@ -1387,10 +1387,10 @@ static int action_getvar(struct mansession *s, struct message *m) /*! \brief Manager "status" command to show channels */ /* Needs documentation... */ -static int action_status(struct mansession *s, struct message *m) +static int action_status(struct mansession *s, const struct message *m) { - char *id = astman_get_header(m,"ActionID"); - char *name = astman_get_header(m,"Channel"); + const char *id = astman_get_header(m,"ActionID"); + const char *name = astman_get_header(m,"Channel"); char idText[256] = ""; struct ast_channel *c; char bridge[256]; @@ -1488,13 +1488,13 @@ static char mandescr_redirect[] = " ActionID: Optional Action id for message matching.\n"; /*! \brief action_redirect: The redirect manager command */ -static int action_redirect(struct mansession *s, struct message *m) +static int action_redirect(struct mansession *s, const struct message *m) { - char *name = astman_get_header(m, "Channel"); - char *name2 = astman_get_header(m, "ExtraChannel"); - char *exten = astman_get_header(m, "Exten"); - char *context = astman_get_header(m, "Context"); - char *priority = astman_get_header(m, "Priority"); + const char *name = astman_get_header(m, "Channel"); + const char *name2 = astman_get_header(m, "ExtraChannel"); + const char *exten = astman_get_header(m, "Exten"); + const char *context = astman_get_header(m, "Context"); + const char *priority = astman_get_header(m, "Priority"); struct ast_channel *chan, *chan2 = NULL; int pi = 0; int res; @@ -1548,10 +1548,10 @@ static char mandescr_command[] = " ActionID: Optional Action id for message matching.\n"; /*! \brief action_command: Manager command "command" - execute CLI command */ -static int action_command(struct mansession *s, struct message *m) +static int action_command(struct mansession *s, const struct message *m) { - char *cmd = astman_get_header(m, "Command"); - char *id = astman_get_header(m, "ActionID"); + const char *cmd = astman_get_header(m, "Command"); + const char *id = astman_get_header(m, "ActionID"); astman_append(s, "Response: Follows\r\nPrivilege: Command\r\n"); if (!ast_strlen_zero(id)) astman_append(s, "ActionID: %s\r\n", id); @@ -1625,19 +1625,19 @@ static char mandescr_originate[] = " Account: Account code\n" " Async: Set to 'true' for fast origination\n"; -static int action_originate(struct mansession *s, struct message *m) -{ - char *name = astman_get_header(m, "Channel"); - char *exten = astman_get_header(m, "Exten"); - char *context = astman_get_header(m, "Context"); - char *priority = astman_get_header(m, "Priority"); - char *timeout = astman_get_header(m, "Timeout"); - char *callerid = astman_get_header(m, "CallerID"); - char *account = astman_get_header(m, "Account"); - char *app = astman_get_header(m, "Application"); - char *appdata = astman_get_header(m, "Data"); - char *async = astman_get_header(m, "Async"); - char *id = astman_get_header(m, "ActionID"); +static int action_originate(struct mansession *s, const struct message *m) +{ + const char *name = astman_get_header(m, "Channel"); + const char *exten = astman_get_header(m, "Exten"); + const char *context = astman_get_header(m, "Context"); + const char *priority = astman_get_header(m, "Priority"); + const char *timeout = astman_get_header(m, "Timeout"); + const char *callerid = astman_get_header(m, "CallerID"); + const char *account = astman_get_header(m, "Account"); + const char *app = astman_get_header(m, "Application"); + const char *appdata = astman_get_header(m, "Data"); + const char *async = astman_get_header(m, "Async"); + const char *id = astman_get_header(m, "ActionID"); struct ast_variable *vars = astman_get_variables(m); char *tech, *data; char *l = NULL, *n = NULL; @@ -1742,10 +1742,10 @@ static char mandescr_mailboxstatus[] = " Waiting: <count>\n" "\n"; -static int action_mailboxstatus(struct mansession *s, struct message *m) +static int action_mailboxstatus(struct mansession *s, const struct message *m) { - char *mailbox = astman_get_header(m, "Mailbox"); - char *id = astman_get_header(m,"ActionID"); + const char *mailbox = astman_get_header(m, "Mailbox"); + const char *id = astman_get_header(m,"ActionID"); char idText[256] = ""; int ret; if (ast_strlen_zero(mailbox)) { @@ -1774,10 +1774,10 @@ static char mandescr_mailboxcount[] = " NewMessages: <count>\n" " OldMessages: <count>\n" "\n"; -static int action_mailboxcount(struct mansession *s, struct message *m) +static int action_mailboxcount(struct mansession *s, const struct message *m) { - char *mailbox = astman_get_header(m, "Mailbox"); - char *id = astman_get_header(m,"ActionID"); + const char *mailbox = astman_get_header(m, "Mailbox"); + const char *id = astman_get_header(m,"ActionID"); char idText[256] = ""; int newmsgs = 0, oldmsgs = 0; if (ast_strlen_zero(mailbox)) { @@ -1810,11 +1810,11 @@ static char mandescr_extensionstate[] = "Will return an \"Extension Status\" message.\n" "The response will include the hint for the extension and the status.\n"; -static int action_extensionstate(struct mansession *s, struct message *m) +static int action_extensionstate(struct mansession *s, const struct message *m) { - char *exten = astman_get_header(m, "Exten"); - char *context = astman_get_header(m, "Context"); - char *id = astman_get_header(m,"ActionID"); + const char *exten = astman_get_header(m, "Exten"); + const char *context = astman_get_header(m, "Context"); + const char *id = astman_get_header(m,"ActionID"); char idText[256] = ""; char hint[256] = ""; int status; @@ -1847,10 +1847,10 @@ static char mandescr_timeout[] = " *Timeout: Maximum duration of the call (sec)\n" "Acknowledges set time with 'Timeout Set' message\n"; -static int action_timeout(struct mansession *s, struct message *m) +static int action_timeout(struct mansession *s, const struct message *m) { struct ast_channel *c = NULL; - char *name = astman_get_header(m, "Channel"); + const char *name = astman_get_header(m, "Channel"); int timeout = atoi(astman_get_header(m, "Timeout")); if (ast_strlen_zero(name)) { astman_send_error(s, m, "No channel specified"); @@ -1901,9 +1901,9 @@ static char mandescr_userevent[] = " Header1: Content1\n" " HeaderN: ContentN\n"; -static int action_userevent(struct mansession *s, struct message *m) +static int action_userevent(struct mansession *s, const struct message *m) { - char *event = astman_get_header(m, "UserEvent"); + const char *event = astman_get_header(m, "UserEvent"); char body[2048] = ""; int x, bodylen = 0; for (x = 0; x < m->hdrcount; x++) { @@ -1919,11 +1919,11 @@ static int action_userevent(struct mansession *s, struct message *m) return 0; } -static int process_message(struct mansession *s, struct message *m) +static int process_message(struct mansession *s, const struct message *m) { char action[80] = ""; struct manager_action *tmp = first_action; - char *id = astman_get_header(m,"ActionID"); + const char *id = astman_get_header(m,"ActionID"); char idText[256] = ""; int ret = 0; @@ -1939,8 +1939,8 @@ static int process_message(struct mansession *s, struct message *m) } if (!s->authenticated) { if (!strcasecmp(action, "Challenge")) { - char *authtype; - authtype = astman_get_header(m, "AuthType"); + const char *authtype = astman_get_header(m, "AuthType"); + if (!strcasecmp(authtype, "MD5")) { if (ast_strlen_zero(s->challenge)) snprintf(s->challenge, sizeof(s->challenge), "%ld", ast_random()); @@ -2050,29 +2050,42 @@ static int get_input(struct mansession *s, char *output) return 0; } +static int do_message(struct mansession *s) +{ + struct message m = { 0 }; + char header_buf[sizeof(s->inbuf)] = { '\0' }; + int res; + + for (;;) { + res = get_input(s, header_buf); + if (res > 0) { + /* Strip trailing \r\n */ + if (strlen(header_buf) < 2) + continue; + header_buf[strlen(header_buf) - 2] = '\0'; + if (ast_strlen_zero(header_buf)) + return process_message(s, &m) ? -1 : 0; + else if (m.hdrcount < (AST_MAX_MANHEADERS - 1)) + m.headers[m.hdrcount++] = ast_strdupa(header_buf); + } else { + return res; + } + } +} + static void *session_do(void *data) { struct mansession *s = data; - struct message m; int res; ast_mutex_lock(&s->__lock); astman_append(s, "Asterisk Call Manager/1.0\r\n"); ast_mutex_unlock(&s->__lock); - memset(&m, 0, sizeof(m)); for (;;) { - res = get_input(s, m.headers[m.hdrcount]); - if (res > 0) { - /* Strip trailing \r\n */ - if (strlen(m.headers[m.hdrcount]) < 2) - continue; - m.headers[m.hdrcount][strlen(m.headers[m.hdrcount]) - 2] = '\0'; - if (ast_strlen_zero(m.headers[m.hdrcount])) { - if (process_message(s, &m)) - break; - memset(&m, 0, sizeof(m)); - } else if (m.hdrcount < AST_MAX_MANHEADERS - 1) - m.hdrcount++; + res = do_message(s); + + if (res == 0) { + continue; } else if (res < 0) { break; } else if (s->eventq->next) { @@ -2339,7 +2352,7 @@ static int ast_manager_register_struct(struct manager_action *act) /*! \brief register a new command with manager, including online help. This is the preferred way to register a manager command */ -int ast_manager_register2(const char *action, int auth, int (*func)(struct mansession *s, struct message *m), const char *synopsis, const char *description) +int ast_manager_register2(const char *action, int auth, int (*func)(struct mansession *s, const struct message *m), const char *synopsis, const char *description) { struct manager_action *cur; @@ -2380,17 +2393,6 @@ static struct mansession *find_session(unsigned long ident) } -static void vars2msg(struct message *m, struct ast_variable *vars) -{ - int x; - for (x = 0; vars && (x < AST_MAX_MANHEADERS); x++, vars = vars->next) { - if (!vars) - break; - m->hdrcount = x + 1; - snprintf(m->headers[x], sizeof(m->headers[x]), "%s: %s", vars->name, vars->value); - } -} - enum { FORMAT_RAW, FORMAT_HTML, @@ -2408,7 +2410,6 @@ static char *generic_http_callback(int format, struct sockaddr_in *requestor, co int blastaway = 0; char *c = workspace; char *retval = NULL; - struct message m; struct ast_variable *v; for (v = params; v; v = v->next) { @@ -2451,21 +2452,19 @@ static char *generic_http_callback(int format, struct sockaddr_in *requestor, co s->sessiontimeout += httptimeout; ast_mutex_unlock(&s->__lock); - memset(&m, 0, sizeof(m)); if (s) { + struct message m = { 0 }; char tmp[80]; - ast_build_string(&c, &len, "Content-type: text/%s\r\n", contenttype[format]); - sprintf(tmp, "%08lx", s->managerid); - ast_build_string(&c, &len, "%s\r\n", ast_http_setcookie("mansession_id", tmp, httptimeout, cookie, sizeof(cookie))); - if (format == FORMAT_HTML) - ast_build_string(&c, &len, "<title>Asterisk™ Manager Test Interface</title>"); - vars2msg(&m, params); - if (format == FORMAT_XML) { - ast_build_string(&c, &len, "<ajax-response>\n"); - } else if (format == FORMAT_HTML) { - ast_build_string(&c, &len, "<body bgcolor=\"#ffffff\"><table align=center bgcolor=\"#f1f1f1\" width=\"500\">\r\n"); - ast_build_string(&c, &len, "<tr><td colspan=\"2\" bgcolor=\"#f1f1ff\"><h1> Manager Tester</h1></td></tr>\r\n"); + unsigned int x; + size_t hdrlen; + + for (x = 0; params && (x < AST_MAX_MANHEADERS); x++, params = params->next) { + hdrlen = strlen(params->name) + strlen(params->value) + 3; + m.headers[m.hdrcount] = alloca(hdrlen); + snprintf((char *) m.headers[m.hdrcount], hdrlen, "%s: %s", params->name, params->value); + m.hdrcount = x + 1; } + if (process_message(s, &m)) { if (s->authenticated) { if (option_verbose > 1) { @@ -2482,6 +2481,17 @@ static char *generic_http_callback(int format, struct sockaddr_in *requestor, co } s->needdestroy = 1; } + ast_build_string(&c, &len, "Content-type: text/%s\r\n", contenttype[format]); + sprintf(tmp, "%08lx", s->managerid); + ast_build_string(&c, &len, "%s\r\n", ast_http_setcookie("mansession_id", tmp, httptimeout, cookie, sizeof(cookie))); + if (format == FORMAT_HTML) + ast_build_string(&c, &len, "<title>Asterisk™ Manager Interface</title>"); + if (format == FORMAT_XML) { + ast_build_string(&c, &len, "<ajax-response>\n"); + } else if (format == FORMAT_HTML) { + ast_build_string(&c, &len, "<body bgcolor=\"#ffffff\"><table align=center bgcolor=\"#f1f1f1\" width=\"500\">\r\n"); + ast_build_string(&c, &len, "<tr><td colspan=\"2\" bgcolor=\"#f1f1ff\"><h1> Manager Tester</h1></td></tr>\r\n"); + } if (s->outputstr) { char *tmp; if (format == FORMAT_XML) |