int dump_route_test(char *hdr,int hdrlen,unsigned char* payload,int paylen,FILE* fd,char segregationLevel,char *prefix) { int i=2;/* flags + urilength */ unsigned char flags=0; if(!(segregationLevel & (ONLY_URIS|JUNIT))){ return dump_standard_hdr_test(hdr,hdrlen,(unsigned char*)payload,paylen,fd); } flags=payload[0]; i=2; if(flags & HAS_NAME_F){ i+=2; } if((!(segregationLevel & JUNIT)) && (segregationLevel & ONLY_URIS)){ return dump_standard_hdr_test(hdr,hdrlen,(unsigned char*)(payload+i),payload[1],fd); } if((segregationLevel & JUNIT) && (segregationLevel & ONLY_URIS)){ return print_uri_junit_tests(hdr,hdrlen,&payload[i],payload[1],fd,1,""); } if(segregationLevel & JUNIT){ i=2; fprintf(fd,"%sgetAddress.getDisplayName=(S)",prefix); if(flags & HAS_NAME_F){ fprintf(fd,"%.*s\n",payload[i+1],&hdr[payload[i]]); i+=2; }else fprintf(fd,"(null)\n"); return print_uri_junit_tests(hdr,hdrlen,&payload[i],payload[1],fd,0,"getAddress.getURI."); } return 0; }
int dump_contact_body_test(char *hdr,int hdrlen,unsigned char *payload,int paylen,int fd,char segregationLevel,char *prefix) { unsigned char flags, numcontacts; int i,offset; flags=payload[0]; if(!segregationLevel){ return dump_standard_hdr_test(hdr,hdrlen,payload,paylen,fd); } if(flags & STAR_F){ return 1; } numcontacts=payload[1]; if(numcontacts==0){ LM_ERR("no contacts present?\n"); return -1; } if(segregationLevel & (JUNIT|SEGREGATE|ONLY_URIS)){ for(i=0,offset=2+numcontacts;i<numcontacts;i++){ dump_contact_test(hdr,hdrlen,&payload[offset],payload[2+i],fd,segregationLevel,prefix); offset+=payload[2+i]; } } return 1; }
int dump_via_body_test(char *hdr,int hdrlen,unsigned char *payload,int paylen,int fd,char segregationLevel) { unsigned char numvias; int i,offset; if(!segregationLevel){ return dump_standard_hdr_test(hdr,hdrlen,payload,paylen,fd); } numvias=payload[1]; if(numvias==0){ LM_ERR("no vias present?\n"); return -1; } if(segregationLevel & SEGREGATE) for(i=0,offset=2+numvias;i<numvias;i++){ dump_standard_hdr_test(hdr,hdrlen,&payload[offset],payload[2+i],fd); offset+=payload[2+i]; } return 1; }
int dump_digest_test(char *hdr,int hdrlen,unsigned char* payload,int paylen,FILE* fd,char segregationLevel) { int i=2;/* 2*flags */ unsigned char flags1=0; flags1=payload[0]; if(!(segregationLevel & ONLY_URIS)) return dump_standard_hdr_test(hdr,hdrlen,payload,paylen,fd); i=2; if(flags1 & HAS_NAME_F) i+=2; if(flags1 & HAS_REALM_F) i+=2; if(flags1 & HAS_NONCE_F) i+=2; if(flags1 & HAS_URI_F){ if(!(segregationLevel & JUNIT) && (segregationLevel & ONLY_URIS)) return dump_standard_hdr_test(hdr,hdrlen,&payload[i+1],payload[i],fd); if((segregationLevel & JUNIT) && (segregationLevel & ONLY_URIS)) return print_uri_junit_tests(hdr,hdrlen,&payload[i+1],payload[i],fd,1,""); } return 0; }
/** * dumps to FD a NBO int which is the header length, the header, * an NBO int which is the payload length, and the payload. * * hdr is the header, * hdrlen is the header length, * payload is the payload, * paylen is the payload length, * fd is the file descriptor to which to dump, * segregationLevel is wether only URIS must be dumped or all the header code. * * return 0 on success, <0 on error */ int dump_to_body_test(char *hdr,int hdrlen,unsigned char* payload,int paylen,int fd,char segregationLevel) { int i=2;/* flags + urilength */ unsigned char flags=0; flags=payload[0]; if(!segregationLevel){ return dump_standard_hdr_test(hdr,hdrlen,payload,paylen,fd); } i=2; if(flags & HAS_DISPLAY_F){ i+=2; } if(flags & HAS_TAG_F){ i+=2; } if(!(segregationLevel & JUNIT) && (segregationLevel & ONLY_URIS)){ return dump_standard_hdr_test(hdr,hdrlen,&payload[i],payload[1],fd); } if((segregationLevel & JUNIT) && (segregationLevel & ONLY_URIS)){ return print_uri_junit_tests(hdr,hdrlen,&payload[i],payload[1],fd,1,""); } return 0; }
int dump_route_body_test(char *hdr,int hdrlen,unsigned char *payload,int paylen,int fd,char segregationLevel,char *prefix) { unsigned char numroutes; int i,offset; if(!segregationLevel){ return dump_standard_hdr_test(hdr,hdrlen,(unsigned char*)payload,paylen,fd); } numroutes=payload[1]; if(numroutes==0){ LM_ERR("no routes present?\n"); return -1; } if(segregationLevel & (JUNIT|SEGREGATE|ONLY_URIS)){ for(i=0,offset=2+numroutes;i<numroutes;i++){ dump_route_test(hdr,hdrlen,&payload[offset],payload[2+i],fd,segregationLevel,prefix); offset+=payload[2+i]; } } return 1; }
int dump_contact_test(char *hdr,int hdrlen,unsigned char* payload,int paylen,int fd,char segregationLevel,char *prefix) { int i=2;/* flags + urilength */ unsigned char flags=0; int n; flags=payload[0]; if((segregationLevel & SEGREGATE)&& !(segregationLevel & ONLY_URIS)) return dump_standard_hdr_test(hdr,hdrlen,payload,paylen,fd); i=2; if(flags & HAS_NAME_F) i+=2; if(flags & HAS_Q_F) i+=2; if(flags & HAS_EXPIRES_F) i+=2; if(flags & HAS_RECEIVED_F) i+=2; if(flags & HAS_METHOD_F) i+=2; if(!(segregationLevel & JUNIT) && (segregationLevel & ONLY_URIS)) return dump_standard_hdr_test(hdr,hdrlen,(&payload[i]),(int)payload[1],fd); if((segregationLevel & JUNIT) && (segregationLevel & ONLY_URIS)) return print_uri_junit_tests(hdr,hdrlen,&payload[i],payload[1],fd,1,""); if((segregationLevel & JUNIT) && !(segregationLevel & ONLY_URIS)){ i=2; n=write(fd,prefix,strlen(prefix)); n=write(fd,"getAddress.getDisplayName=(S)",29); if(flags & HAS_NAME_F){ n=write(fd,&hdr[payload[i]],payload[i+1]); n=write(fd,"\n",1); i+=2; }else n=write(fd,"(null)\n",7); n=write(fd,prefix,strlen(prefix)); n=write(fd,"getQValue=(F)",13); if(flags & HAS_Q_F){ n=write(fd,&hdr[payload[i]],payload[i+1]); n=write(fd,"\n",1); i+=2; }else n=write(fd,"(null)\n",7); n=write(fd,prefix,strlen(prefix)); n=write(fd,"getExpires=(I)",14); if(flags & HAS_EXPIRES_F){ n=write(fd,&hdr[payload[i]],payload[i+1]); n=write(fd,"\n",1); i+=2; }else n=write(fd,"(null)\n",7); if(flags & HAS_RECEIVED_F){ i+=2; } if(flags & HAS_METHOD_F){ i+=2; } n=write(fd,prefix,strlen(prefix)); n=write(fd,"getParameter=(SAVP)",19); for(i+=payload[1];i<paylen-1;i+=2){ printf("%.*s=",payload[i+1]-payload[i]-1,&hdr[payload[i]]); printf("%.*s;",(payload[i+2]-payload[i+1])==0?0:(payload[i+2]-payload[i+1]-1),&hdr[payload[i+1]]); } n=write(fd,"\n",1); if (n < 0) LM_ERR("error while writing the final eol\n"); } return 0; }
int print_uri_junit_tests(char *hdrstart,int hdrlen,unsigned char *payload,int paylen,FILE *fd,char also_hdr,char *prefix) { int i=4,k=0,m=0;/*1*pointer+1*len+2*flags*/ unsigned char uriidx=0,flags1=0,flags2=0,urilen; char *ch_uriptr,*aux,*aux2,*aux3,*uritype=NULL,*secure=NULL; uriidx=payload[0]; if(uriidx>hdrlen){ fprintf(fd,"bad index for start of uri: hdrlen=%d uri_index=%d\n",hdrlen,uriidx); return -1; } if(also_hdr) dump_standard_hdr_test(hdrstart,hdrlen,payload,paylen,fd); ch_uriptr = hdrstart+uriidx; urilen=payload[1]; flags1=payload[2]; flags2=payload[3]; fprintf(fd,"%stoString=(S)%.*s\n",prefix,urilen,ch_uriptr); uritype=flags1&SIP_OR_TEL_F?"sip":"tel"; secure=flags1&SECURE_F?"s":""; fprintf(fd,"%sgetScheme=(S)%s%s\n",prefix,uritype,secure); fprintf(fd,"%sisSecure=(B)%s\n",prefix,flags1&SECURE_F?"true":"false"); fprintf(fd,"%sisSipURI=(B)%s\n",prefix,"true"); fprintf(fd,"%sgetUser=(S)",prefix); if(flags1 & USER_F){ fprintf(fd,"%.*s\n",(payload[i+1]-1)-payload[i],&ch_uriptr[payload[i]]); ++i; }else fprintf(fd,"(null)\n"); fprintf(fd,"%sgetUserPassword=(S)",prefix); if(flags1 & PASSWORD_F){ fprintf(fd,"%.*s\n",(payload[i+1]-1)-payload[i],&ch_uriptr[payload[i]]); ++i; }else fprintf(fd,"(null)\n"); fprintf(fd,"%sgetHost=(S)",prefix); if(flags1 & HOST_F){ fprintf(fd,"%.*s\n",(payload[i+1]-1)-payload[i],&ch_uriptr[payload[i]]); ++i; }else fprintf(fd,"(null)\n");/*can't happen*/ fprintf(fd,"%sgetPort=(I)",prefix); if(flags1 & PORT_F){ fprintf(fd,"%.*s\n",(payload[i+1]-1)-payload[i],&ch_uriptr[payload[i]]); ++i; }else fprintf(fd,"(null)\n"); /*user=phone;transport=udp*/ if(flags1 & PARAMETERS_F){ aux=&ch_uriptr[payload[i]]; aux2=NULL; aux3=aux; m=(payload[i+1]-1-payload[i]); fprintf(fd,"%sgetParameter=(SAVP)",prefix);/*SVP = Attribute Value Pair*/ for(k=0;k<=m;k++){ if((aux3[k]==';'||(k==m)) && aux2==NULL){/*no parameterValue was found*/ fprintf(fd,"%.*s=;",(int)(aux3-aux+k),aux); aux2=NULL;/*resets the parameterValue-start pointer*/ aux=aux3+1+k;/*points to the next parameter*/ }else if((aux3[k]==';'||(k==m)) && aux2!=NULL){ fprintf(fd,"%.*s=%.*s;",(int)(aux2-aux),aux,(int)(aux3-aux2-1+k),aux2+1); aux2=NULL; aux=aux3+1+k; } else if(aux3[k]=='='){ aux2=aux3+k; } } fprintf(fd,"\n"); ++i; } if(flags1 & HEADERS_F){ aux=&ch_uriptr[payload[i]]; aux2=NULL; aux3=aux; m=(payload[i+1]-1-payload[i]); fprintf(fd,"%sgetHeader=(SAVP)",prefix); for(k=0;k<=m;k++){ if((aux3[k]==';'||(k==m)) && aux2==NULL){/*no parameterValue was found*/ fprintf(fd,"%.*s=;",(int)(aux3-aux+k),aux); aux2=NULL;/*resets the parameterValue-start pointer*/ aux=aux3+1+k;/*points to the next parameter*/ }else if((aux3[k]==';'||(k==m)) && aux2!=NULL){ fprintf(fd,"%.*s=%.*s;",(int)(aux2-aux),aux,(int)(aux3-aux2-1+k),aux2+1); aux2=NULL; aux=aux3+1+k; } else if(aux3[k]=='='){ aux2=aux3+k; } } fprintf(fd,"\n"); ++i; } ++i; fprintf(fd,"%sgetTransportParam=(S)",prefix); if(flags2 & TRANSPORT_F){ fprintf(fd,"%.*s\n",payload[i+1],&ch_uriptr[payload[i]]); i+=2; }else fprintf(fd,"(null)\n"); fprintf(fd,"%sgetTTLparam=(I)",prefix); if(flags2 & TTL_F){ fprintf(fd,"%.*s\n",payload[i+1],&ch_uriptr[payload[i]]); i+=2; }else fprintf(fd,"(null)\n"); fprintf(fd,"%sgetUserParam=(S)",prefix); if(flags2 & USER_F){ fprintf(fd,"%.*s\n",payload[i+1],&ch_uriptr[payload[i]]); i+=2; }else fprintf(fd,"(null)\n"); fprintf(fd,"%sgetMethodParam=(S)",prefix); if(flags2 & METHOD_F){ fprintf(fd,"%.*s\n",payload[i+1],&ch_uriptr[payload[i]]); i+=2; }else fprintf(fd,"(null)\n"); fprintf(fd,"%sgetMAddrParam=(S)",prefix); if(flags2 & MADDR_F){ fprintf(fd,"%.*s\n",payload[i+1],&ch_uriptr[payload[i]]); i+=2; }else fprintf(fd,"(null)\n"); if(flags2 & LR_F){ i+=2; } fprintf(fd,"\n"); return 0; }
int dump_headers_test(char *msg,int msglen,unsigned char *payload,int len,char type,int fd,char segregationLevel) { char *hdr_start_ptr; short int start_idx; memcpy(&start_idx,payload,2); start_idx=ntohs(start_idx); hdr_start_ptr = &msg[start_idx]; switch(type){ case 'f':/*from*/ case 't':/*to*/ case 'o':/*refer-to*/ case 'p':/*rpid= remote parte id*/ dump_to_body_test(hdr_start_ptr,payload[HEADER_LEN_IDX],&payload[HEADER_PAYLOAD_IDX], len-HEADER_PAYLOAD_IDX,fd,segregationLevel); break; case 'm':/*contact*/ dump_contact_body_test(hdr_start_ptr,payload[HEADER_LEN_IDX],&payload[HEADER_PAYLOAD_IDX], len-HEADER_PAYLOAD_IDX,fd,segregationLevel,""); break; case 'r':/*route*/ case 'R':/*record-route*/ dump_route_body_test(hdr_start_ptr,payload[HEADER_LEN_IDX],&payload[HEADER_PAYLOAD_IDX], len-HEADER_PAYLOAD_IDX,fd,segregationLevel,""); break; case 'l':/*contentlength*/ dump_standard_hdr_test(hdr_start_ptr,payload[HEADER_LEN_IDX],&payload[HEADER_PAYLOAD_IDX], len-HEADER_PAYLOAD_IDX,fd); break; case 'v':/*via*/ dump_via_body_test(hdr_start_ptr,payload[HEADER_LEN_IDX],&payload[HEADER_PAYLOAD_IDX], len-HEADER_PAYLOAD_IDX,fd,segregationLevel); break; case 'A':/*Accept*/ dump_standard_hdr_test(hdr_start_ptr,payload[HEADER_LEN_IDX],&payload[HEADER_PAYLOAD_IDX], len-HEADER_PAYLOAD_IDX,fd); break; case 'c':/*content-type*/ dump_standard_hdr_test(hdr_start_ptr,payload[HEADER_LEN_IDX],&payload[HEADER_PAYLOAD_IDX], len-HEADER_PAYLOAD_IDX,fd); break; case 'S':/*CSeq*/ dump_standard_hdr_test(hdr_start_ptr,payload[HEADER_LEN_IDX],&payload[HEADER_PAYLOAD_IDX], len-HEADER_PAYLOAD_IDX,fd); break; case 'P':/*expires*/ dump_standard_hdr_test(hdr_start_ptr,payload[HEADER_LEN_IDX],&payload[HEADER_PAYLOAD_IDX], len-HEADER_PAYLOAD_IDX,fd); break; case 'a':/*allow*/ dump_standard_hdr_test(hdr_start_ptr,payload[HEADER_LEN_IDX],&payload[HEADER_PAYLOAD_IDX], len-HEADER_PAYLOAD_IDX,fd); break; case 'h':/*proxy-authenticate*/ case 'H':/*authorization*/ case 'z':/*proxy-authorization*/ dump_standard_hdr_test(hdr_start_ptr,payload[HEADER_LEN_IDX],&payload[HEADER_PAYLOAD_IDX], len-HEADER_PAYLOAD_IDX,fd); break; default: return 1; } return 1; }