--- chan_iax2.orig 2005-12-02 14:50:18.000000000 +0100 +++ chan_iax2.c 2005-12-02 17:24:44.000000000 +0100 @@ -4162,7 +4162,8 @@ #undef FORMAT2 } -static int __iax2_show_peers(int manager, int fd, int argc, char *argv[]) +/*! \brief __iax2_show_peers: Execute iax2 show peers command */ +static int __iax2_show_peers(int fd, int *total, struct mansession *s, struct message *m, int argc, char *argv[]) { regex_t regexbuf; int havepattern = 0; @@ -4175,10 +4176,19 @@ #define FORMAT "%-15.15s %-15.15s %s %-15.15s %-5d%s %s %-10s%s" struct iax2_peer *peer; - char name[256]; + char name[256] = ""; + char username[256] = ""; + char idtext[256] = ""; char iabuf[INET_ADDRSTRLEN]; int registeredonly=0; - char *term = manager ? "\r\n" : "\n"; + char *id; + char *term = s ? "\r\n" : "\n"; + + if (s) { /* Manager - get ActionID */ + id = astman_get_header(m,"ActionID"); + if (!ast_strlen_zero(id)) + snprintf(idtext,256,"ActionID: %s\r\n",id); + } switch (argc) { case 6: @@ -4214,7 +4224,10 @@ } ast_mutex_lock(&peerl.lock); - ast_cli(fd, FORMAT2, "Name/Username", "Host", " ", "Mask", "Port", " ", "Status", term); + if (!s) { /* Normal list */ + ast_cli(fd, FORMAT2, "Name/Username", "Host", " ", "Mask", "Port", " ", "Status", term); + } + for (peer = peerl.peers;peer;peer = peer->next) { char nm[20]; char status[20]; @@ -4226,10 +4239,12 @@ if (havepattern && regexec(®exbuf, peer->name, 0, NULL, 0)) continue; - if (!ast_strlen_zero(peer->username)) + if (!ast_strlen_zero(peer->username)) { snprintf(name, sizeof(name), "%s/%s", peer->name, peer->username); - else + snprintf(username, sizeof(username), "%s", peer->username); + } else { ast_copy_string(name, peer->name, sizeof(name)); + } retstatus = peer_status(peer, status, sizeof(status)); if (retstatus > 0) @@ -4247,22 +4262,48 @@ nm, ntohs(peer->addr.sin_port), ast_test_flag(peer, IAX_TRUNK) ? "(T)" : " ", peer->encmethods ? "(E)" : " ", status, term); - + + if (!s) { /* Normal list */ ast_cli(fd, FORMAT, name, peer->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), peer->addr.sin_addr) : "(Unspecified)", ast_test_flag(peer, IAX_DYNAMIC) ? "(D)" : "(S)", nm, ntohs(peer->addr.sin_port), ast_test_flag(peer, IAX_TRUNK) ? "(T)" : " ", peer->encmethods ? "(E)" : " ", status, term); + } else { /* Manager event */ + /* The names here need to be the same as other channels */ + ast_cli(fd, + "Event: PeerEntry\r\n%s" + "Channeltype: IAX2\r\n" + "Channel: IAX2/%s\r\n" + "ObjectName: %s\r\n" + "ObjectUserName: %s\r\n" + "ChanObjectType: peer\r\n" /* "peer" or "user" */ + "IPaddress: %s\r\n" + "IPport: %d\r\n" + "Dynamic: %s\r\n" + "Status: %s\r\n\r\n", + idtext, + peer->name, + name,username, + peer->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), peer->addr.sin_addr) : "-none-", + ntohs(peer->addr.sin_port), + ast_test_flag(peer, IAX_DYNAMIC) ? "yes" : "no", /* Dynamic or not? */ + status); + } total_peers++; } ast_mutex_unlock(&peerl.lock); - ast_cli(fd,"%d iax2 peers [%d online, %d offline, %d unmonitored]%s", total_peers, online_peers, offline_peers, unmonitored_peers, term); + if (!s) + ast_cli(fd,"%d iax2 peers [%d online, %d offline, %d unmonitored]%s", total_peers, online_peers, offline_peers, unmonitored_peers, term); if (havepattern) regfree(®exbuf); + if (total) + *total = total_peers; + return RESULT_SUCCESS; #undef FORMAT #undef FORMAT2 @@ -4270,8 +4311,9 @@ static int iax2_show_peers(int fd, int argc, char *argv[]) { - return __iax2_show_peers(0, fd, argc, argv); + return __iax2_show_peers(fd, NULL, NULL, NULL, argc, argv); } + static int manager_iax2_show_netstats( struct mansession *s, struct message *m ) { ast_cli_netstats(s->fd, 0); @@ -4304,19 +4346,30 @@ #undef FORMAT2 } -/* JDG: callback to display iax peers in manager */ +/*! \brief manager_iax2_show_peers: Show IAX2 peers in the manager API ---*/ +/* Inspired from chan_sip */ static int manager_iax2_show_peers( struct mansession *s, struct message *m ) { - char *a[] = { "iax2", "show", "users" }; - int ret; - char *id; - id = astman_get_header(m,"ActionID"); - if (!ast_strlen_zero(id)) - ast_cli(s->fd, "ActionID: %s\r\n",id); - ret = __iax2_show_peers(1, s->fd, 3, a ); - ast_cli(s->fd, "\r\n\r\n" ); - return ret; -} /* /JDG */ + char *id = astman_get_header(m,"ActionID"); + char *a[] = { "iax2", "show", "peers" }; + char idtext[256] = ""; + int total = 0; + + if (!ast_strlen_zero(id)) + snprintf(idtext,256,"ActionID: %s\r\n",id); + + astman_send_ack(s, m, "Peer status list will follow"); + /* List the peers in separate manager events */ + __iax2_show_peers(s->fd, &total, s, m, 3, a); + /* Send final confirmation */ + ast_cli(s->fd, + "Event: PeerlistComplete\r\n" + "ListItems: %d\r\n" + "%s" + "\r\n", total, idtext); + + return 0; +} static char *regstate2str(int regstate) {