diff options
-rw-r--r-- | apps/app_meetme.c | 10 | ||||
-rw-r--r-- | apps/app_queue.c | 42 | ||||
-rw-r--r-- | apps/app_senddtmf.c | 6 | ||||
-rw-r--r-- | apps/app_setcdruserfield.c | 8 | ||||
-rw-r--r-- | channels/chan_agent.c | 24 | ||||
-rw-r--r-- | channels/chan_iax2.c | 8 | ||||
-rw-r--r-- | channels/chan_sip.c | 33 | ||||
-rw-r--r-- | channels/chan_zap.c | 97 | ||||
-rw-r--r-- | include/asterisk/jabber.h | 4 | ||||
-rw-r--r-- | include/asterisk/manager.h | 27 | ||||
-rw-r--r-- | main/config.c | 1 | ||||
-rw-r--r-- | main/db.c | 18 | ||||
-rw-r--r-- | main/manager.c | 288 | ||||
-rw-r--r-- | res/res_features.c | 12 | ||||
-rw-r--r-- | res/res_jabber.c | 15 | ||||
-rw-r--r-- | res/res_monitor.c | 28 | ||||
-rw-r--r-- | utils/astman.c | 8 |
17 files changed, 320 insertions, 309 deletions
diff --git a/apps/app_meetme.c b/apps/app_meetme.c index 7a79fca53..4ebe61c1c 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -2751,12 +2751,12 @@ static int admin_exec(struct ast_channel *chan, void *data) { return 0; } -static int meetmemute(struct mansession *s, struct message *m, int mute) +static int meetmemute(struct mansession *s, const struct message *m, int mute) { struct ast_conference *conf; struct ast_conf_user *user; - char *confid = astman_get_header(m, "Meetme"); - char *userid = astman_get_header(m, "Usernum"); + const char *confid = astman_get_header(m, "Meetme"); + char *userid = ast_strdupa(astman_get_header(m, "Usernum")); int userno; if (ast_strlen_zero(confid)) { @@ -2812,12 +2812,12 @@ static int meetmemute(struct mansession *s, struct message *m, int mute) return 0; } -static int action_meetmemute(struct mansession *s, struct message *m) +static int action_meetmemute(struct mansession *s, const struct message *m) { return meetmemute(s, m, 1); } -static int action_meetmeunmute(struct mansession *s, struct message *m) +static int action_meetmeunmute(struct mansession *s, const struct message *m) { return meetmemute(s, m, 0); } diff --git a/apps/app_queue.c b/apps/app_queue.c index 0a41d2b9d..79d2daeb7 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -401,7 +401,7 @@ struct call_queue { static AST_LIST_HEAD_STATIC(queues, call_queue); -static int set_member_paused(char *queuename, char *interface, int paused); +static int set_member_paused(const char *queuename, const char *interface, int paused); static void rr_dep_warning(void) { @@ -613,7 +613,7 @@ static int statechange_queue(const char *dev, int state, void *ign) return 0; } -static struct member *create_queue_member(char *interface, const char *membername, int penalty, int paused) +static struct member *create_queue_member(const char *interface, const char *membername, int penalty, int paused) { struct member *cur; @@ -686,7 +686,7 @@ static void clear_queue(struct call_queue *q) q->wrapuptime = 0; } -static int add_to_interfaces(char *interface) +static int add_to_interfaces(const char *interface) { struct member_interface *curint; @@ -713,7 +713,7 @@ static int add_to_interfaces(char *interface) return 0; } -static int interface_exists_global(char *interface) +static int interface_exists_global(const char *interface) { struct call_queue *q; struct member *mem; @@ -735,7 +735,7 @@ static int interface_exists_global(char *interface) return ret; } -static int remove_from_interfaces(char *interface) +static int remove_from_interfaces(const char *interface) { struct member_interface *curint; @@ -1100,7 +1100,7 @@ static struct call_queue *find_queue_by_name_rt(const char *queuename, struct as return q; } -static struct call_queue *load_realtime_queue(char *queuename) +static struct call_queue *load_realtime_queue(const char *queuename) { struct ast_variable *queue_vars; struct ast_config *member_config = NULL; @@ -2686,7 +2686,7 @@ static int wait_a_bit(struct queue_ent *qe) return ast_waitfordigit(qe->chan, retrywait); } -static struct member *interface_exists(struct call_queue *q, char *interface) +static struct member *interface_exists(struct call_queue *q, const char *interface) { struct member *mem; @@ -2741,7 +2741,7 @@ static void dump_queue_members(struct call_queue *pm_queue) ast_db_del(pm_family, pm_queue->name); } -static int remove_from_queue(char *queuename, char *interface) +static int remove_from_queue(const char *queuename, const char *interface) { struct call_queue *q; struct member *last_member, *look; @@ -2795,7 +2795,7 @@ static int remove_from_queue(char *queuename, char *interface) } -static int add_to_queue(char *queuename, char *interface, char *membername, int penalty, int paused, int dump) +static int add_to_queue(const char *queuename, const char *interface, const char *membername, int penalty, int paused, int dump) { struct call_queue *q; struct member *new_member; @@ -2846,7 +2846,7 @@ static int add_to_queue(char *queuename, char *interface, char *membername, int return res; } -static int set_member_paused(char *queuename, char *interface, int paused) +static int set_member_paused(const char *queuename, const char *interface, int paused) { int found = 0; struct call_queue *q; @@ -4027,7 +4027,7 @@ static char *complete_queue(const char *line, const char *word, int pos, int sta /*!\brief callback to display queues status in manager \addtogroup Group_AMI */ -static int manager_queues_show( struct mansession *s, struct message *m ) +static int manager_queues_show(struct mansession *s, const struct message *m) { char *a[] = { "queue", "show" }; @@ -4038,13 +4038,13 @@ static int manager_queues_show( struct mansession *s, struct message *m ) } /* Dump queue status */ -static int manager_queues_status( struct mansession *s, struct message *m ) +static int manager_queues_status(struct mansession *s, const struct message *m) { time_t now; int pos; - char *id = astman_get_header(m,"ActionID"); - char *queuefilter = astman_get_header(m,"Queue"); - char *memberfilter = astman_get_header(m,"Member"); + const char *id = astman_get_header(m,"ActionID"); + const char *queuefilter = astman_get_header(m,"Queue"); + const char *memberfilter = astman_get_header(m,"Member"); char idText[256] = ""; struct call_queue *q; struct queue_ent *qe; @@ -4128,9 +4128,9 @@ static int manager_queues_status( struct mansession *s, struct message *m ) return RESULT_SUCCESS; } -static int manager_add_queue_member(struct mansession *s, struct message *m) +static int manager_add_queue_member(struct mansession *s, const struct message *m) { - char *queuename, *interface, *penalty_s, *paused_s, *membername; + const char *queuename, *interface, *penalty_s, *paused_s, *membername; int paused, penalty = 0; queuename = astman_get_header(m, "Queue"); @@ -4181,9 +4181,9 @@ static int manager_add_queue_member(struct mansession *s, struct message *m) return 0; } -static int manager_remove_queue_member(struct mansession *s, struct message *m) +static int manager_remove_queue_member(struct mansession *s, const struct message *m) { - char *queuename, *interface; + const char *queuename, *interface; queuename = astman_get_header(m, "Queue"); interface = astman_get_header(m, "Interface"); @@ -4212,9 +4212,9 @@ static int manager_remove_queue_member(struct mansession *s, struct message *m) return 0; } -static int manager_pause_queue_member(struct mansession *s, struct message *m) +static int manager_pause_queue_member(struct mansession *s, const struct message *m) { - char *queuename, *interface, *paused_s; + const char *queuename, *interface, *paused_s; int paused; interface = astman_get_header(m, "Interface"); diff --git a/apps/app_senddtmf.c b/apps/app_senddtmf.c index 67cb2d5c1..96893e22e 100644 --- a/apps/app_senddtmf.c +++ b/apps/app_senddtmf.c @@ -94,10 +94,10 @@ static char mandescr_playdtmf[] = " Channel: Channel name to send digit to\n" " Digit: The dtmf digit to play\n"; -static int manager_play_dtmf(struct mansession *s, struct message *m) +static int manager_play_dtmf(struct mansession *s, const struct message *m) { - char *channel = astman_get_header(m, "Channel"); - char *digit = astman_get_header(m, "Digit"); + const char *channel = astman_get_header(m, "Channel"); + const char *digit = astman_get_header(m, "Digit"); struct ast_channel *chan = ast_get_channel_by_name_locked(channel); if (!chan) { diff --git a/apps/app_setcdruserfield.c b/apps/app_setcdruserfield.c index f6c83f48b..d6a4f2b06 100644 --- a/apps/app_setcdruserfield.c +++ b/apps/app_setcdruserfield.c @@ -73,12 +73,12 @@ static char *appendcdruserfield_app = "AppendCDRUserField"; static char *appendcdruserfield_synopsis = "Append to the CDR user field"; -static int action_setcdruserfield(struct mansession *s, struct message *m) +static int action_setcdruserfield(struct mansession *s, const struct message *m) { struct ast_channel *c = NULL; - char *userfield = astman_get_header(m, "UserField"); - char *channel = astman_get_header(m, "Channel"); - char *append = astman_get_header(m, "Append"); + const char *userfield = astman_get_header(m, "UserField"); + const char *channel = astman_get_header(m, "Channel"); + const char *append = astman_get_header(m, "Append"); if (ast_strlen_zero(channel)) { astman_send_error(s, m, "No Channel specified"); diff --git a/channels/chan_agent.c b/channels/chan_agent.c index 4d614e945..484f33333 100644 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -1395,9 +1395,9 @@ static force_inline int powerof(unsigned int d) * \returns * \sa action_agent_logoff(), action_agent_callback_login(), load_module(). */ -static int action_agents(struct mansession *s, struct message *m) +static int action_agents(struct mansession *s, const struct message *m) { - char *id = astman_get_header(m,"ActionID"); + const char *id = astman_get_header(m,"ActionID"); char idText[256] = ""; char chanbuf[256]; struct agent_pvt *p; @@ -1505,7 +1505,7 @@ static void agent_logoff_maintenance(struct agent_pvt *p, char *loginchan, long } -static int agent_logoff(char *agent, int soft) +static int agent_logoff(const char *agent, int soft) { struct agent_pvt *p; long logintime; @@ -1556,10 +1556,10 @@ static int agent_logoff_cmd(int fd, int argc, char **argv) * \returns * \sa action_agents(), action_agent_callback_login(), load_module(). */ -static int action_agent_logoff(struct mansession *s, struct message *m) +static int action_agent_logoff(struct mansession *s, const struct message *m) { - char *agent = astman_get_header(m, "Agent"); - char *soft_s = astman_get_header(m, "Soft"); /* "true" is don't hangup */ + const char *agent = astman_get_header(m, "Agent"); + const char *soft_s = astman_get_header(m, "Soft"); /* "true" is don't hangup */ int soft; int ret; /* return value of agent_logoff */ @@ -2234,13 +2234,13 @@ static int callback_exec(struct ast_channel *chan, void *data) * \returns * \sa action_agents(), action_agent_logoff(), load_module(). */ -static int action_agent_callback_login(struct mansession *s, struct message *m) +static int action_agent_callback_login(struct mansession *s, const struct message *m) { - char *agent = astman_get_header(m, "Agent"); - char *exten = astman_get_header(m, "Exten"); - char *context = astman_get_header(m, "Context"); - char *wrapuptime_s = astman_get_header(m, "WrapupTime"); - char *ackcall_s = astman_get_header(m, "AckCall"); + const char *agent = astman_get_header(m, "Agent"); + const char *exten = astman_get_header(m, "Exten"); + const char *context = astman_get_header(m, "Context"); + const char *wrapuptime_s = astman_get_header(m, "WrapupTime"); + const char *ackcall_s = astman_get_header(m, "AckCall"); struct agent_pvt *p; int login_state = 0; diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index b1dc0bff2..37fe4df00 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -4187,7 +4187,7 @@ static int iax2_show_peers(int fd, int argc, char *argv[]) { return __iax2_show_peers(0, fd, NULL, argc, argv); } -static int manager_iax2_show_netstats( struct mansession *s, struct message *m ) +static int manager_iax2_show_netstats(struct mansession *s, const struct message *m) { ast_cli_netstats(s, -1, 0); astman_append(s, "\r\n"); @@ -4220,12 +4220,12 @@ static int iax2_show_firmware(int fd, int argc, char *argv[]) } /* JDG: callback to display iax peers in manager */ -static int manager_iax2_show_peers( struct mansession *s, struct message *m ) +static int manager_iax2_show_peers(struct mansession *s, const struct message *m) { char *a[] = { "iax2", "show", "users" }; int ret; - char *id; - id = astman_get_header(m,"ActionID"); + const char *id = astman_get_header(m,"ActionID"); + if (!ast_strlen_zero(id)) astman_append(s, "ActionID: %s\r\n",id); ret = __iax2_show_peers(1, -1, s, 3, a ); diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 391dfec6a..6664fccda 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -1335,8 +1335,7 @@ static char *transfermode2str(enum transfermodes mode) attribute_const; static char *nat2str(int nat) attribute_const; static int peer_status(struct sip_peer *peer, char *status, int statuslen); static int sip_show_users(int fd, int argc, char *argv[]); -static int _sip_show_peers(int fd, int *total, struct mansession *s, struct message *m, int argc, char *argv[]); -static int manager_sip_show_peers( struct mansession *s, struct message *m ); +static int _sip_show_peers(int fd, int *total, struct mansession *s, const struct message *m, int argc, const char *argv[]); static int sip_show_peers(int fd, int argc, char *argv[]); static int sip_show_objects(int fd, int argc, char *argv[]); static void print_group(int fd, ast_group_t group, int crlf); @@ -1346,10 +1345,8 @@ static void cleanup_stale_contexts(char *new, char *old); static void print_codec_to_cli(int fd, struct ast_codec_pref *pref); static const char *domain_mode_to_text(const enum domain_mode mode); static int sip_show_domains(int fd, int argc, char *argv[]); -static int _sip_show_peer(int type, int fd, struct mansession *s, struct message *m, int argc, char *argv[]); -static int manager_sip_show_peer( struct mansession *s, struct message *m); +static int _sip_show_peer(int type, int fd, struct mansession *s, const struct message *m, int argc, const char *argv[]); static int sip_show_peer(int fd, int argc, char *argv[]); -static int _sip_show_peer(int type, int fd, struct mansession *s, struct message *m, int argc, char *argv[]); static int sip_show_user(int fd, int argc, char *argv[]); static int sip_show_registry(int fd, int argc, char *argv[]); static int sip_show_settings(int fd, int argc, char *argv[]); @@ -9394,10 +9391,10 @@ static char mandescr_show_peers[] = /*! \brief Show SIP peers in the manager API */ /* Inspired from chan_iax2 */ -static int manager_sip_show_peers( struct mansession *s, struct message *m ) +static int manager_sip_show_peers(struct mansession *s, const struct message *m) { - char *id = astman_get_header(m,"ActionID"); - char *a[] = { "sip", "show", "peers" }; + const char *id = astman_get_header(m,"ActionID"); + const char *a[] = {"sip", "show", "peers"}; char idtext[256] = ""; int total = 0; @@ -9419,11 +9416,11 @@ static int manager_sip_show_peers( struct mansession *s, struct message *m ) /*! \brief CLI Show Peers command */ static int sip_show_peers(int fd, int argc, char *argv[]) { - return _sip_show_peers(fd, NULL, NULL, NULL, argc, argv); + return _sip_show_peers(fd, NULL, NULL, NULL, argc, (const char **) argv); } /*! \brief _sip_show_peers: Execute sip show peers command */ -static int _sip_show_peers(int fd, int *total, struct mansession *s, struct message *m, int argc, char *argv[]) +static int _sip_show_peers(int fd, int *total, struct mansession *s, const struct message *m, int argc, const char *argv[]) { regex_t regexbuf; int havepattern = FALSE; @@ -9437,7 +9434,7 @@ static int _sip_show_peers(int fd, int *total, struct mansession *s, struct mess int peers_mon_offline = 0; int peers_unmon_offline = 0; int peers_unmon_online = 0; - char *id; + const char *id; char idtext[256] = ""; int realtimepeers; @@ -9843,11 +9840,11 @@ static char mandescr_show_peer[] = " ActionID: <id> Optional action ID for this AMI transaction.\n"; /*! \brief Show SIP peers in the manager API */ -static int manager_sip_show_peer( struct mansession *s, struct message *m) +static int manager_sip_show_peer(struct mansession *s, const struct message *m) { - char *id = astman_get_header(m,"ActionID"); - char *a[4]; - char *peer; + const char *id = astman_get_header(m,"ActionID"); + const char *a[4]; + const char *peer; int ret; peer = astman_get_header(m,"Peer"); @@ -9862,7 +9859,7 @@ static int manager_sip_show_peer( struct mansession *s, struct message *m) if (!ast_strlen_zero(id)) astman_append(s, "ActionID: %s\r\n",id); - ret = _sip_show_peer(1, -1, s, m, 4, a ); + ret = _sip_show_peer(1, -1, s, m, 4, a); astman_append(s, "\r\n\r\n" ); return ret; } @@ -9872,11 +9869,11 @@ static int manager_sip_show_peer( struct mansession *s, struct message *m) /*! \brief Show one peer in detail */ static int sip_show_peer(int fd, int argc, char *argv[]) { - return _sip_show_peer(0, fd, NULL, NULL, argc, argv); + return _sip_show_peer(0, fd, NULL, NULL, argc, (const char **) argv); } /*! \brief Show one peer in detail (main function) */ -static int _sip_show_peer(int type, int fd, struct mansession *s, struct message *m, int argc, char *argv[]) +static int _sip_show_peer(int type, int fd, struct mansession *s, const struct message *m, int argc, const char *argv[]) { char status[30] = ""; char cbuf[256]; diff --git a/channels/chan_zap.c b/channels/chan_zap.c index fd82dc36d..fab61b857 100644 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -9743,7 +9743,7 @@ static int zap_restart_cmd(int fd, int argc, char **argv) return RESULT_SUCCESS; } -static int action_zaprestart(struct mansession *s, struct message *m) +static int action_zaprestart(struct mansession *s, const struct message *m) { if (zap_restart() != 0) { astman_send_error(s, m, "Failed rereading zaptel configuration"); @@ -10116,46 +10116,49 @@ static struct zt_pvt *find_channel(int channel) return p; } -static int action_zapdndon(struct mansession *s, struct message *m) -{ - struct zt_pvt *p = NULL; - char *channel = astman_get_header(m, "ZapChannel"); - if (ast_strlen_zero(channel)) { - astman_send_error(s, m, "No channel specified"); - return 0; - } - p = find_channel(atoi(channel)); - if (!p) { - astman_send_error(s, m, "No such channel"); - return 0; - } - p->dnd = 1; - astman_send_ack(s, m, "DND Enabled"); - return 0; -} - -static int action_zapdndoff(struct mansession *s, struct message *m) -{ - struct zt_pvt *p = NULL; - char *channel = astman_get_header(m, "ZapChannel"); - if (ast_strlen_zero(channel)) { - astman_send_error(s, m, "No channel specified"); - return 0; - } - p = find_channel(atoi(channel)); - if (!p) { - astman_send_error(s, m, "No such channel"); - return 0; - } - p->dnd = 0; - astman_send_ack(s, m, "DND Disabled"); - return 0; -} - -static int action_transfer(struct mansession *s, struct message *m) +static int action_zapdndon(struct mansession *s, const struct message *m) { struct zt_pvt *p = NULL; - char *channel = astman_get_header(m, "ZapChannel"); + const char *channel = astman_get_header(m, "ZapChannel"); + + if (ast_strlen_zero(channel)) { + astman_send_error(s, m, "No channel specified"); + return 0; + } + p = find_channel(atoi(channel)); + if (!p) { + astman_send_error(s, m, "No such channel"); + return 0; + } + p->dnd = 1; + astman_send_ack(s, m, "DND Enabled"); + return 0; +} + +static int action_zapdndoff(struct mansession *s, const struct message *m) +{ + struct zt_pvt *p = NULL; + const char *channel = astman_get_header(m, "ZapChannel"); + + if (ast_strlen_zero(channel)) { + astman_send_error(s, m, "No channel specified"); + return 0; + } + p = find_channel(atoi(channel)); + if (!p) { + astman_send_error(s, m, "No such channel"); + return 0; + } + p->dnd = 0; + astman_send_ack(s, m, "DND Disabled"); + return 0; +} + +static int action_transfer(struct mansession *s, const struct message *m) +{ + struct zt_pvt *p = NULL; + const char *channel = astman_get_header(m, "ZapChannel"); + if (ast_strlen_zero(channel)) { astman_send_error(s, m, "No channel specified"); return 0; @@ -10170,10 +10173,11 @@ static int action_transfer(struct mansession *s, struct message *m) return 0; } -static int action_transferhangup(struct mansession *s, struct message *m) +static int action_transferhangup(struct mansession *s, const struct message *m) { struct zt_pvt *p = NULL; - char *channel = astman_get_header(m, "ZapChannel"); + const char *channel = astman_get_header(m, "ZapChannel"); + if (ast_strlen_zero(channel)) { astman_send_error(s, m, "No channel specified"); return 0; @@ -10188,12 +10192,13 @@ static int action_transferhangup(struct mansession *s, struct message *m) return 0; } -static int action_zapdialoffhook(struct mansession *s, struct message *m) +static int action_zapdialoffhook(struct mansession *s, const struct message *m) { struct zt_pvt *p = NULL; - char *channel = astman_get_header(m, "ZapChannel"); - char *number = astman_get_header(m, "Number"); + const char *channel = astman_get_header(m, "ZapChannel"); + const char *number = astman_get_header(m, "Number"); int i; + if (ast_strlen_zero(channel)) { astman_send_error(s, m, "No channel specified"); return 0; @@ -10219,10 +10224,10 @@ static int action_zapdialoffhook(struct mansession *s, struct message *m) return 0; } -static int action_zapshowchannels(struct mansession *s, struct message *m) +static int action_zapshowchannels(struct mansession *s, const struct message *m) { struct zt_pvt *tmp = NULL; - char *id = astman_get_header(m, "ActionID"); + const char *id = astman_get_header(m, "ActionID"); char idText[256] = ""; astman_send_ack(s, m, "Zapata channel status will follow"); diff --git a/include/asterisk/jabber.h b/include/asterisk/jabber.h index 95d18a9a3..8d7662f97 100644 --- a/include/asterisk/jabber.h +++ b/include/asterisk/jabber.h @@ -120,14 +120,14 @@ struct aji_client_container{ ASTOBJ_CONTAINER_COMPONENTS(struct aji_client); }; -int ast_aji_send(struct aji_client *client, char *address, char *message); +int ast_aji_send(struct aji_client *client, const char *address, const char *message); int ast_aji_disconnect(struct aji_client *client); int ast_aji_check_roster(void); void ast_aji_increment_mid(char *mid); int ast_aji_create_chat(struct aji_client *client,char *room, char *server, char *topic); int ast_aji_invite_chat(struct aji_client *client, char *user, char *room, char *message); int ast_aji_join_chat(struct aji_client *client,char *room); -struct aji_client *ast_aji_get_client(char *name); +struct aji_client *ast_aji_get_client(const char *name); struct aji_client_container *ast_aji_get_clients(void); #endif diff --git a/include/asterisk/manager.h b/include/asterisk/manager.h index 96326f07c..cbbe1fb90 100644 --- a/include/asterisk/manager.h +++ b/include/asterisk/manager.h @@ -58,13 +58,12 @@ /* Export manager structures */ #define AST_MAX_MANHEADERS 80 -#define AST_MAX_MANHEADER_LEN 256 struct mansession; struct message { - int hdrcount; - char headers[AST_MAX_MANHEADERS][AST_MAX_MANHEADER_LEN]; + unsigned int hdrcount; + const char *headers[AST_MAX_MANHEADERS]; }; struct manager_action { @@ -77,7 +76,7 @@ struct manager_action { /*! Permission required for action. EVENT_FLAG_* */ int authority; /*! Function to be called */ - int (*func)(struct mansession *s, struct message *m); + int (*func)(struct mansession *s, const struct message *m); /*! For easy linking */ struct manager_action *next; }; @@ -97,7 +96,7 @@ struct manager_action { int ast_manager_register2( const char *action, int authority, - int (*func)(struct mansession *s, struct message *m), + int (*func)(struct mansession *s, const struct message *m), const char *synopsis, const char *description); @@ -111,27 +110,23 @@ int ast_manager_unregister( char *action ); \param event Event name \param contents Contents of event */ -int manager_event(int category, const char *event, const char *contents, ...) - __attribute__ ((format (printf, 3,4))); +int __attribute__ ((format (printf, 3,4))) manager_event(int category, const char *event, const char *contents, ...); /*! Get header from mananger transaction */ -char *astman_get_header(struct message *m, char *var); +const char *astman_get_header(const struct message *m, char *var); /*! Get a linked list of the Variable: headers */ -struct ast_variable *astman_get_variables(struct message *m); +struct ast_variable *astman_get_variables(const struct message *m); /*! Send error in manager transaction */ -void astman_send_error(struct mansession *s, struct message *m, char *error); -void astman_send_response(struct mansession *s, struct message *m, char *resp, char *msg); -void astman_send_ack(struct mansession *s, struct message *m, char *msg); - -void astman_append(struct mansession *s, const char *fmt, ...) - __attribute__ ((format (printf, 2, 3))); +void astman_send_error(struct mansession *s, const struct message *m, char *error); +void astman_send_response(struct mansession *s, const struct message *m, char *resp, char *msg); +void astman_send_ack(struct mansession *s, const struct message *m, char *msg); +void __attribute__ ((format (printf, 2, 3))) astman_append(struct mansession *s, const char *fmt, ...); /*! Called by Asterisk initialization */ int init_manager(void); -/*! Called by Asterisk initialization */ int reload_manager(void); #endif /* _ASTERISK_MANAGER_H */ diff --git a/main/config.c b/main/config.c index f0c4fe0df..5639aa9e9 100644 --- a/main/config.c +++ b/main/config.c @@ -855,7 +855,6 @@ static struct ast_config *config_text_file_load(const char *database, const char lineno++; if (fgets(buf, sizeof(buf), f)) { if ( withcomments ) { - ast_log(LOG_NOTICE, "moo\n"); CB_ADD(lline_buffer); /* add the current lline buffer to the comment buffer */ lline_buffer[0] = 0; /* erase the lline buffer */ } @@ -519,11 +519,11 @@ struct ast_cli_entry cli_database[] = { database_deltree_usage }, }; -static int manager_dbput(struct mansession *s, struct message *m) +static int manager_dbput(struct mansession *s, const struct message *m) { - char *family = astman_get_header(m, "Family"); - char *key = astman_get_header(m, "Key"); - char *val = astman_get_header(m, "Val"); + const char *family = astman_get_header(m, "Family"); + const char *key = astman_get_header(m, "Key"); + const char *val = astman_get_header(m, "Val"); int res; if (ast_strlen_zero(family)) { @@ -539,7 +539,7 @@ static int manager_dbput(struct mansession *s, struct message *m) return 0; } - res = ast_db_put(family, key, val); + res = ast_db_put(family, key, (char *) val); if (res) { astman_send_error(s, m, "Failed to update entry"); } else { @@ -548,12 +548,12 @@ static int manager_dbput(struct mansession *s, struct message *m) return 0; } -static int manager_dbget(struct mansession *s, struct message *m) +static int manager_dbget(struct mansession *s, const struct message *m) { - char *id = astman_get_header(m,"ActionID"); + const char *id = astman_get_header(m,"ActionID"); char idText[256] = ""; - char *family = astman_get_header(m, "Family"); - char *key = astman_get_header(m, "Key"); + const char *family = astman_get_header(m, "Family"); + const char *key = astman_get_header(m, "Key"); char tmp[256]; int res; 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) diff --git a/res/res_features.c b/res/res_features.c index 7bd061157..22c1d66ca 100644 --- a/res/res_features.c +++ b/res/res_features.c @@ -1927,10 +1927,10 @@ static struct ast_cli_entry cli_features[] = { }; /*! \brief Dump lot status */ -static int manager_parking_status( struct mansession *s, struct message *m ) +static int manager_parking_status( struct mansession *s, const struct message *m) { struct parkeduser *cur; - char *id = astman_get_header(m,"ActionID"); + const char *id = astman_get_header(m,"ActionID"); char idText[256] = ""; if (!ast_strlen_zero(id)) @@ -1974,11 +1974,11 @@ static char mandescr_park[] = " *Channel2: Channel to announce park info to (and return to if timeout)\n" " Timeout: Number of milliseconds to wait before callback.\n"; -static int manager_park(struct mansession *s, struct message *m) +static int manager_park(struct mansession *s, const struct message *m) { - char *channel = astman_get_header(m, "Channel"); - char *channel2 = astman_get_header(m, "Channel2"); - char *timeout = astman_get_header(m, "Timeout"); + const char *channel = astman_get_header(m, "Channel"); + const char *channel2 = astman_get_header(m, "Channel2"); + const char *timeout = astman_get_header(m, "Timeout"); char buf[BUFSIZ]; int to = 0; int res = 0; diff --git a/res/res_jabber.c b/res/res_jabber.c index 583c44eeb..43c207383 100644 --- a/res/res_jabber.c +++ b/res/res_jabber.c @@ -55,7 +55,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #define JABBER_CONFIG "jabber.conf" /*-- Forward declarations */ -static int manager_jabber_send( struct mansession *s, struct message *m ); static int aji_highest_bit(int number); static void aji_buddy_destroy(struct aji_buddy *obj); static void aji_client_destroy(struct aji_client *obj); @@ -1367,7 +1366,7 @@ static void aji_handle_subscribe(struct aji_client *client, ikspak *pak) * \param aji_client struct , reciever, message. * \return 1. */ -int ast_aji_send(struct aji_client *client, char *address, char *message) +int ast_aji_send(struct aji_client *client, const char *address, const char *message) { int res = 0; iks *message_packet = NULL; @@ -2291,7 +2290,7 @@ static int aji_load_config(void) * \param void. * \return 1. */ -struct aji_client *ast_aji_get_client(char *name) +struct aji_client *ast_aji_get_client(const char *name) { struct aji_client *client = NULL; @@ -2314,13 +2313,13 @@ static char mandescr_jabber_send[] = " Message: Message to be sent to the buddy\n"; /*! \brief Send a Jabber Message via call from the Manager */ -static int manager_jabber_send( struct mansession *s, struct message *m ) +static int manager_jabber_send(struct mansession *s, const struct message *m) { struct aji_client *client = NULL; - char *id = astman_get_header(m,"ActionID"); - char *jabber = astman_get_header(m,"Jabber"); - char *screenname = astman_get_header(m,"ScreenName"); - char *message = astman_get_header(m,"Message"); + const char *id = astman_get_header(m,"ActionID"); + const char *jabber = astman_get_header(m,"Jabber"); + const char *screenname = astman_get_header(m,"ScreenName"); + const char *message = astman_get_header(m,"Message"); if (ast_strlen_zero(jabber)) { astman_send_error(s, m, "No transport specified"); diff --git a/res/res_monitor.c b/res/res_monitor.c index 128f4d82f..a45c3a180 100644 --- a/res/res_monitor.c +++ b/res/res_monitor.c @@ -474,13 +474,13 @@ static char start_monitor_action_help[] = " the input and output channels together after the\n" " recording is finished.\n"; -static int start_monitor_action(struct mansession *s, struct message *m) +static int start_monitor_action(struct mansession *s, const struct message *m) { struct ast_channel *c = NULL; - char *name = astman_get_header(m, "Channel"); - char *fname = astman_get_header(m, "File"); - char *format = astman_get_header(m, "Format"); - char *mix = astman_get_header(m, "Mix"); + const char *name = astman_get_header(m, "Channel"); + const char *fname = astman_get_header(m, "File"); + const char *format = astman_get_header(m, "Format"); + const char *mix = astman_get_header(m, "Mix"); char *d; if (ast_strlen_zero(name)) { @@ -527,10 +527,10 @@ static char stop_monitor_action_help[] = " started 'Monitor' action. The only parameter is 'Channel', the name\n" " of the channel monitored.\n"; -static int stop_monitor_action(struct mansession *s, struct message *m) +static int stop_monitor_action(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 res; if (ast_strlen_zero(name)) { astman_send_error(s, m, "No channel specified"); @@ -559,11 +559,11 @@ static char change_monitor_action_help[] = " File - Required. Is the new name of the file created in the\n" " monitor spool directory.\n"; -static int change_monitor_action(struct mansession *s, struct message *m) +static int change_monitor_action(struct mansession *s, const struct message *m) { struct ast_channel *c = NULL; - char *name = astman_get_header(m, "Channel"); - char *fname = astman_get_header(m, "File"); + const char *name = astman_get_header(m, "Channel"); + const char *fname = astman_get_header(m, "File"); if (ast_strlen_zero(name)) { astman_send_error(s, m, "No channel specified"); return 0; @@ -601,10 +601,10 @@ enum MONITOR_PAUSING_ACTION MONITOR_ACTION_UNPAUSE }; -static int do_pause_or_unpause(struct mansession *s, struct message *m, int action) +static int do_pause_or_unpause(struct mansession *s, const struct message *m, int action) { struct ast_channel *c = NULL; - char *name = astman_get_header(m, "Channel"); + const char *name = astman_get_header(m, "Channel"); if (IS_NULL_STRING(name)) { astman_send_error(s, m, "No channel specified"); @@ -633,7 +633,7 @@ static char pause_monitor_action_help[] = " be used to control this:\n" " Channel - Required. Used to specify the channel to record.\n"; -static int pause_monitor_action(struct mansession *s, struct message *m) +static int pause_monitor_action(struct mansession *s, const struct message *m) { return do_pause_or_unpause(s, m, MONITOR_ACTION_PAUSE); } @@ -644,7 +644,7 @@ static char unpause_monitor_action_help[] = " be used to control this:\n" " Channel - Required. Used to specify the channel to record.\n"; -static int unpause_monitor_action(struct mansession *s, struct message *m) +static int unpause_monitor_action(struct mansession *s, const struct message *m) { return do_pause_or_unpause(s, m, MONITOR_ACTION_UNPAUSE); } diff --git a/utils/astman.c b/utils/astman.c index 427b581b2..f072dcd57 100644 --- a/utils/astman.c +++ b/utils/astman.c @@ -38,7 +38,6 @@ #include <stdlib.h> #include "asterisk/md5.h" -#include "asterisk/manager.h" #include "asterisk/linkedlists.h" #undef gethostbyname @@ -54,6 +53,13 @@ */ #define _NEWT_CAST (void *) +#define DEFAULT_MANAGER_PORT 5038 + +struct message { + unsigned int hdrcount; + char headers[MAX_HEADERS][MAX_LEN]; +}; + static struct ast_mansession { struct sockaddr_in sin; int fd; |