[Asterisk-cvs] asterisk/channels chan_sip.c,1.792,1.793

kpfleming at lists.digium.com kpfleming at lists.digium.com
Tue Jul 26 18:06:56 CDT 2005


Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv24593/channels

Modified Files:
	chan_sip.c 
Log Message:
enhance SIP_PEER function to return additional items (bug #4816)


Index: chan_sip.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_sip.c,v
retrieving revision 1.792
retrieving revision 1.793
diff -u -d -r1.792 -r1.793
--- chan_sip.c	25 Jul 2005 23:26:47 -0000	1.792
+++ chan_sip.c	26 Jul 2005 22:13:31 -0000	1.793
@@ -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(&regl);
+	ASTOBJ_CONTAINER_INIT(&userl);	/* User object list */
+	ASTOBJ_CONTAINER_INIT(&peerl);	/* Peer object list */
+	ASTOBJ_CONTAINER_INIT(&regl);	/* 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 */




More information about the svn-commits mailing list