Index: channels/chan_sip.c =================================================================== RCS file: /usr/cvsroot/asterisk/channels/chan_sip.c,v retrieving revision 1.792 diff -u -r1.792 chan_sip.c --- channels/chan_sip.c 25 Jul 2005 23:26:47 -0000 1.792 +++ channels/chan_sip.c 26 Jul 2005 21:16:59 -0000 @@ -6534,6 +6534,31 @@ return "Unknown"; } } + +/*--- peer_status: Report Peer status in character string */ +/* returns 1 if peer is online, -1 if unmonitored */ +static int peer_status(struct sip_peer *peer, char *status, int statuslen) +{ + int res = 0; + if (peer->maxms) { + if (peer->lastms < 0) { + ast_copy_string(status, "UNREACHABLE", statuslen); + } else if (peer->lastms > peer->maxms) { + snprintf(status, statuslen, "LAGGED (%d ms)", peer->lastms); + res = 1; + } else if (peer->lastms) { + snprintf(status, statuslen, "OK (%d ms)", peer->lastms); + res = 1; + } else { + ast_copy_string(status, "UNKNOWN", statuslen); + } + } else { + ast_copy_string(status, "Unmonitored", statuslen); + /* Checking if port is 0 */ + res = -1; + } + return res; +} /*--- sip_show_users: CLI Command 'SIP Show Users' ---*/ static int sip_show_users(int fd, int argc, char *argv[]) @@ -6667,6 +6692,7 @@ char nm[20] = ""; char status[20] = ""; char srch[2000]; + char pstatus; ASTOBJ_RDLOCK(iterator); @@ -6680,32 +6706,20 @@ snprintf(name, sizeof(name), "%s/%s", iterator->name, iterator->username); else ast_copy_string(name, iterator->name, sizeof(name)); - if (iterator->maxms) { - if (iterator->lastms < 0) { - ast_copy_string(status, "UNREACHABLE", sizeof(status)); + + pstatus = peer_status(iterator, status, sizeof(status)); + if (pstatus) + peers_online++; + else { + if (pstatus == 0) peers_offline++; - } else if (iterator->lastms > iterator->maxms) { - snprintf(status, sizeof(status), "LAGGED (%d ms)", iterator->lastms); - peers_online++; - } else if (iterator->lastms) { - snprintf(status, sizeof(status), "OK (%d ms)", iterator->lastms); - peers_online++; - } else { + else { /* Unmonitored */ /* Checking if port is 0 */ - if ( ntohs(iterator->addr.sin_port) == 0 ) { + if ( ntohs(iterator->addr.sin_port) == 0 ) { peers_offline++; } else { peers_online++; } - ast_copy_string(status, "UNKNOWN", sizeof(status)); - } - } else { - ast_copy_string(status, "Unmonitored", sizeof(status)); - /* Checking if port is 0 */ - if ( ntohs(iterator->addr.sin_port) == 0 ) { - peers_offline++; - } else { - peers_online++; } } @@ -7103,7 +7117,7 @@ if (!codec) break; ast_cli(fd, "%s", ast_getformatname(codec)); - if (x < 31 && ast_codec_pref_index(pref,x+1)) + if (x < 31 && ast_codec_pref_index(pref, x+1)) ast_cli(fd, "|"); } @@ -7112,14 +7126,7 @@ ast_cli(fd, ")\n"); ast_cli(fd, " Status : "); - if (peer->lastms < 0) - ast_copy_string(status, "UNREACHABLE", sizeof(status)); - else if (peer->lastms > peer->maxms) - snprintf(status, sizeof(status), "LAGGED (%d ms)", peer->lastms); - else if (peer->lastms) - snprintf(status, sizeof(status), "OK (%d ms)", peer->lastms); - else - ast_copy_string(status, "UNKNOWN", sizeof(status)); + peer_status(peer, status, sizeof(status)); ast_cli(fd, "%s\n",status); ast_cli(fd, " Useragent : %s\n", peer->useragent); ast_cli(fd, " Reg. Contact : %s\n", peer->fullcontact); @@ -7192,15 +7199,8 @@ ast_cli(fd, "\r\n"); ast_cli(fd, "Status: "); - if (peer->lastms < 0) - ast_copy_string(status, "UNREACHABLE", sizeof(status)); - else if (peer->lastms > peer->maxms) - snprintf(status, sizeof(status), "LAGGED (%d ms)", peer->lastms); - else if (peer->lastms) - snprintf(status, sizeof(status), "OK (%d ms)", peer->lastms); - else - ast_copy_string(status, "UNKNOWN", sizeof(status)); - ast_cli(fd, "%s\r\n",status); + peer_status(peer, status, sizeof(status)); + ast_cli(fd, "%s\r\n", status); ast_cli(fd, "SIP-Useragent: %s\r\n", peer->useragent); ast_cli(fd, "Reg-Contact : %s\r\n", peer->fullcontact); if (peer->chanvars) { @@ -8197,6 +8197,18 @@ if (!strcasecmp(colname, "ip")) { ast_copy_string(buf, peer->addr.sin_addr.s_addr ? ast_inet_ntoa(iabuf, sizeof(iabuf), peer->addr.sin_addr) : "", len); + } else if (!strcasecmp(colname, "status")) { + peer_status(peer, buf, sizeof(buf)); + } else if (!strcasecmp(colname, "language")) { + ast_copy_string(buf, peer->language, len); + } else if (!strcasecmp(colname, "regexten")) { + ast_copy_string(buf, peer->regexten, len); + } else if (!strcasecmp(colname, "limit")) { + snprintf(buf, len, "%d", peer->incominglimit); + } else if (!strcasecmp(colname, "curcalls")) { + snprintf(buf, len, "%d", peer->inUse); + } else if (!strcasecmp(colname, "useragent")) { + ast_copy_string(buf, peer->useragent, len); } else if (!strcasecmp(colname, "mailbox")) { ast_copy_string(buf, peer->mailbox, len); } else if (!strcasecmp(colname, "context")) { @@ -8233,6 +8245,7 @@ return ret; } +/* Structure to declare a dialplan function: SIPPEER */ struct ast_custom_function sippeer_function = { .name = "SIPPEER", .synopsis = "Gets SIP peer information", @@ -8247,6 +8260,13 @@ "- callerid_name The configured Caller ID name.\n" "- callerid_num The configured Caller ID number.\n" "- codecs The configured codecs.\n" + "- status Status (if qualify=yes).\n" + "- regexten Registration extension\n" + "- limit Call limit (incominglimit)\n" + "- curcalls Current amount of calls \n" + " Only available if incominglimit is set\n" + "- language Default language for peer\n" + "- useragent Current user agent id for peer\n" "- codec[x] Preferred codec index number 'x' (beginning with zero).\n" "\n" }; @@ -11554,43 +11574,53 @@ /*--- load_module: PBX load module - initialization ---*/ int load_module() { - ASTOBJ_CONTAINER_INIT(&userl); - ASTOBJ_CONTAINER_INIT(&peerl); - ASTOBJ_CONTAINER_INIT(®l); + ASTOBJ_CONTAINER_INIT(&userl); /* User object list */ + ASTOBJ_CONTAINER_INIT(&peerl); /* Peer object list */ + ASTOBJ_CONTAINER_INIT(®l); /* Registry object list */ + sched = sched_context_create(); if (!sched) { ast_log(LOG_WARNING, "Unable to create schedule context\n"); } + io = io_context_create(); if (!io) { ast_log(LOG_WARNING, "Unable to create I/O context\n"); } + /* Make sure we can register our sip channel type */ if (ast_channel_register(&sip_tech)) { ast_log(LOG_ERROR, "Unable to register channel type %s\n", channeltype); return -1; } - if (reload_config()) + if (reload_config()) /* Load the configuration from sip.conf */ return -1; + /* Register all CLI functions for SIP */ ast_cli_register_multiple(my_clis, sizeof(my_clis)/ sizeof(my_clis[0])); + /* Tell the RTP subdriver that we're here */ ast_rtp_proto_register(&sip_rtp); + /* Register dialplan applications */ ast_register_application(app_dtmfmode, sip_dtmfmode, synopsis_dtmfmode, descrip_dtmfmode); + + /* These will be removed soon */ ast_register_application(app_sipaddheader, sip_addheader, synopsis_sipaddheader, descrip_sipaddheader); ast_register_application(app_sipgetheader, sip_getheader, synopsis_sipgetheader, descrip_sipgetheader); + /* Register dialplan functions */ + ast_custom_function_register(&sip_header_function); + ast_custom_function_register(&sippeer_function); + + /* Register manager commands */ ast_manager_register2("SIPpeers", EVENT_FLAG_SYSTEM, manager_sip_show_peers, "List SIP peers (text format)", mandescr_show_peers); ast_manager_register2("SIPshowpeer", EVENT_FLAG_SYSTEM, manager_sip_show_peer, "Show SIP peer (text format)", mandescr_show_peer); - ast_custom_function_register(&sip_header_function); - ast_custom_function_register(&sippeer_function); - - sip_poke_all_peers(); + sip_poke_all_peers(); sip_send_all_registers(); /* And start the monitor for the first time */