? ani.diff
Index: libpri.h
===================================================================
RCS file: /usr/cvsroot/libpri/libpri.h,v
retrieving revision 1.53
diff -u -r1.53 libpri.h
--- libpri.h	23 May 2005 16:51:30 -0000	1.53
+++ libpri.h	16 Jun 2005 18:25:59 -0000
@@ -299,6 +299,7 @@
 	int channel;				/* Channel requested */
 	int callingpres;			/* Presentation of Calling CallerID */
 	int callingplan;			/* Dialing plan of Calling entity */
+	char callingani[256];		/* Calling ANI */
 	char callingnum[256];		/* Calling number */
 	char callingname[256];		/* Calling name (if provided) */
 	int calledplan;				/* Dialing plan of Called number */
@@ -558,6 +559,7 @@
 #define PRI_RECEIVE_SUBADDR
 #define PRI_REDIRECTING_REASON
 #define PRI_AOC_UNITS
+#define PRI_ANI
 
 /* Send notification */
 extern int pri_notify(struct pri *pri, q931_call *c, int channel, int info);
Index: pri_facility.c
===================================================================
RCS file: /usr/cvsroot/libpri/pri_facility.c,v
retrieving revision 1.16
diff -u -r1.16 pri_facility.c
--- pri_facility.c	3 Jun 2005 18:29:25 -0000	1.16
+++ pri_facility.c	16 Jun 2005 18:26:00 -0000
@@ -187,7 +187,7 @@
 	int datalen = 0, res = 0;
 
 	if (comp->len == ASN1_LEN_INDEF) {
-		datalen = strlen(comp->data);
+		datalen = strlen((char *)comp->data);
 		res = datalen + 2;
 	} else
 		datalen = res = comp->len;
@@ -234,7 +234,7 @@
 			return -1;
 		}
 		if (comp->len == ASN1_LEN_INDEF) {
-			datalen = strlen(comp->data);
+			datalen = strlen((char *)comp->data);
 			res = datalen + 2;
 		} else
 			res = datalen = comp->len;
Index: pri_internal.h
===================================================================
RCS file: /usr/cvsroot/libpri/pri_internal.h,v
retrieving revision 1.23
diff -u -r1.23 pri_internal.h
--- pri_internal.h	23 May 2005 15:06:33 -0000	1.23
+++ pri_internal.h	16 Jun 2005 18:26:01 -0000
@@ -200,7 +200,8 @@
 	
 	int callerplan;
 	int callerpres;			/* Caller presentation */
-	char callernum[256];	/* Caller */
+	char callerani[256];	/* Caller */
+	char callernum[256];
 	char callername[256];
 
 	char digitbuf[64];	/* Buffer for digits that come in KEYPAD_FACILITY */
Index: q931.c
===================================================================
RCS file: /usr/cvsroot/libpri/q931.c,v
retrieving revision 1.129
diff -u -r1.129 q931.c
--- q931.c	29 May 2005 15:08:23 -0000	1.129
+++ q931.c	16 Jun 2005 18:26:03 -0000
@@ -866,7 +866,7 @@
 {
 	if (order > 1)
 		return 0;
-	if (call->redirectingnum && strlen(call->redirectingnum)) {
+	if (call->redirectingnum && *call->redirectingnum) {
 		ie->data[0] = call->redirectingplan;
 		ie->data[1] = call->redirectingpres;
 		ie->data[2] = (call->redirectingreason & 0x0f) | 0x80;
@@ -904,32 +904,45 @@
 static FUNC_SEND(transmit_called_party_number)
 {
 	ie->data[0] = 0x80 | call->calledplan;
-	if (strlen(call->callednum)) 
+	if (*call->callednum)
 		memcpy(ie->data + 1, call->callednum, strlen(call->callednum));
 	return strlen(call->callednum) + 3;
 }
 
 static FUNC_RECV(receive_calling_party_number)
 {
-        int extbit;
+	u_int8_t *data;
+	size_t length;
+	int extbit;
         
-        call->callerplan = ie->data[0] & 0x7f;
-        extbit = (ie->data[0] >> 7) & 0x01;
+	call->callerplan = ie->data[0] & 0x7f;
+	extbit = (ie->data[0] >> 7) & 0x01;
 
-	/* Somebody's broken PRI stack sent a calling
-	 party number IE twice.  One with the callernam
-	 and one without. */
-	if (strlen(call->callernum))
-		return 0;
+	if (extbit) {
+		data = ie->data + 1;
+		length = len - 3;
+		call->callerpres = 0; /* PI presentation allowed
+								 SI user-provided, not screened */        
+	}
+	else {
+		data = ie->data + 2;
+		length = len - 4;
+		call->callerpres = ie->data[1] & 0x7f;
+	}
+
+	if (call->callerpres == PRES_ALLOWED_NETWORK_NUMBER ||
+		call->callerpres == PRES_PROHIB_NETWORK_NUMBER) {
+		q931_get_number((u_int8_t *)call->callerani, sizeof(call->callerani), data, length);
+
+		/*
+		 * Copy ANI to Caller*ID if Caller*ID is not already set
+		 */
+		if (!*call->callernum)
+			strncpy(call->callernum, call->callerani, sizeof(call->callernum) - 1);
+	}
+	else
+		q931_get_number((u_int8_t *)call->callernum, sizeof(call->callernum), data, length);
 
-        if (extbit) {
-	  q931_get_number((unsigned char *) call->callernum, sizeof(call->callernum), ie->data + 1, len - 3);
-	  call->callerpres = 0; /* PI presentation allowed
-				   SI user-provided, not screened */        
-        } else {
-	  q931_get_number((unsigned char *) call->callernum, sizeof(call->callernum), ie->data + 2, len - 4);
-	  call->callerpres = ie->data[1] & 0x7f;
-        }
 	return 0;
 }
 
@@ -937,7 +950,7 @@
 {
 	ie->data[0] = call->callerplan;
 	ie->data[1] = 0x80 | call->callerpres;
-	if (strlen(call->callernum)) 
+	if (*call->callernum) 
 		memcpy(ie->data + 2, call->callernum, strlen(call->callernum));
 	return strlen(call->callernum) + 4;
 }
@@ -1027,7 +1040,7 @@
 static FUNC_SEND(transmit_display)
 {
 	int i;
-	if ((pri->switchtype != PRI_SWITCH_NI1) && strlen(call->callername)) {
+	if ((pri->switchtype != PRI_SWITCH_NI1) && *call->callername) {
 		i = 0;
 		if(pri->switchtype != PRI_SWITCH_EUROISDN_E1) {
 			ie->data[0] = 0xb1;
@@ -1150,7 +1163,7 @@
 			}
 		} while (0);
 	}
-	if (/*(pri->switchtype == PRI_SWITCH_EUROISDN_E1) &&*/ call->redirectingnum && strlen(call->redirectingnum)) {
+	if (/*(pri->switchtype == PRI_SWITCH_EUROISDN_E1) &&*/ call->redirectingnum && *call->redirectingnum) {
 		if (!(first_i = i)) {
 			/* Add protocol information header */
 			ie->data[i++] = 0x80 | Q932_PROTOCOL_ROSE;
@@ -1185,7 +1198,7 @@
 		switch(call->redirectingpres) {
 		case PRES_ALLOWED_USER_NUMBER_NOT_SCREENED:
 		case PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN:
-			if (call->redirectingnum && strlen(call->redirectingnum)) {
+			if (call->redirectingnum && *call->redirectingnum) {
 				ASN1_ADD_SIMPLE(comp, 0xA0, ie->data, i);
 				ASN1_PUSH(compstk, compsp, comp);
 
@@ -1234,7 +1247,7 @@
 		switch(call->redirectingpres) {
 		case PRES_ALLOWED_USER_NUMBER_NOT_SCREENED:
 		case PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN:
-			if (call->redirectingnum && strlen(call->redirectingnum)) {
+			if (call->redirectingnum && *call->redirectingnum) {
 				ASN1_ADD_SIMPLE(comp, 0xA0, ie->data, i);
 				ASN1_PUSH(compstk, compsp, comp);
 
@@ -1569,7 +1582,7 @@
 		    ((*c >= 'a') && (*c <= 'z')) ||
 		    ((*c >= '0') && (*c <= '9'))) {
 			if (!lastascii) {
-				if (strlen(tmp)) { 
+				if (*tmp) { 
 					tmp[x++] = ',';
 					tmp[x++] = ' ';
 				}
@@ -1581,7 +1594,7 @@
 			if (lastascii) {
 				tmp[x++] = '\'';
 			}
-			if (strlen(tmp)) { 
+			if (*tmp) { 
 				tmp[x++] = ',';
 				tmp[x++] = ' ';
 			}
@@ -3368,6 +3381,7 @@
 		pri->ev.ring.callingpres = c->callerpres;
 		pri->ev.ring.callingplan = c->callerplan;
 		pri->ev.ring.ani2 = c->ani2;
+		strncpy(pri->ev.ring.callingani, c->callerani, sizeof(pri->ev.ring.callingani) - 1);
 		strncpy(pri->ev.ring.callingnum, c->callernum, sizeof(pri->ev.ring.callingnum) - 1);
 		strncpy(pri->ev.ring.callingname, c->callername, sizeof(pri->ev.ring.callingname) - 1);
 		pri->ev.ring.calledplan = c->calledplan;
@@ -3434,7 +3448,7 @@
 		}
 		pri->ev.e = PRI_EVENT_FACNAME;
 		strncpy(pri->ev.facname.callingname, c->callername, sizeof(pri->ev.facname.callingname) - 1);
-		strncpy(pri->ev.facname.callingnum, c->callernum, sizeof(pri->ev.facname.callingname) - 1);
+		strncpy(pri->ev.facname.callingnum, c->callernum, sizeof(pri->ev.facname.callingnum) - 1);
 		pri->ev.facname.channel = c->channelno | (c->ds1no << 8) | (c->ds1explicit << 16);
 		pri->ev.facname.cref = c->cr;
 		pri->ev.facname.call = c;
