Update of /usr/cvsroot/libpri
In directory mongoose.digium.com:/tmp/cvs-serv8249

Modified Files:
        libpri.h pri_facility.c pri_internal.h q931.c 
Log Message:
record network-provided-number as ANI when supplied (bug #4537)


Index: libpri.h
===================================================================
RCS file: /usr/cvsroot/libpri/libpri.h,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -d -r1.53 -r1.54
--- libpri.h    23 May 2005 16:51:30 -0000      1.53
+++ libpri.h    21 Jun 2005 20:37:22 -0000      1.54
@@ -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
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- pri_facility.c      3 Jun 2005 18:29:25 -0000       1.16
+++ pri_facility.c      21 Jun 2005 20:37:22 -0000      1.17
@@ -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
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- pri_internal.h      23 May 2005 15:06:33 -0000      1.23
+++ pri_internal.h      21 Jun 2005 20:37:22 -0000      1.24
@@ -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
retrieving revision 1.130
diff -u -d -r1.129 -r1.130
--- q931.c      29 May 2005 15:08:23 -0000      1.129
+++ q931.c      21 Jun 2005 20:37:22 -0000      1.130
@@ -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;

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to