📄 header.c
字号:
if(url==NULL||buff==NULL) return -1; //DisplayName strcpy(tmp,buff); res=analyze_displayname(tmp,url); //UserInfot strcpy(tmp,buff); res=analyze_user_info(tmp,url); //if(res!=0) return res; //HostPort strcpy(tmp,buff); res=analyze_host_port(tmp,url); if(res!=0) return res; //Analyze URI Params //>で矢机误を贿める strcpy(tmp,buff); ptr=strchr(tmp,'>'); if(ptr!=NULL){ *ptr='\0'; } //セミコロンがあれば、パラメ〖タがある ptr=strchr(tmp,';'); if(ptr!=NULL){ res=analyze_params(++ptr,&(url->param)); if(res!=OK) return res; } //AUX Parameter strcpy(tmp,buff); ptr=strchr(tmp,'>'); if(ptr!=NULL){ if(NULL!=(strchr(++ptr,';'))){ if(strlen(ptr)>CLEN){ logging(2,"extra param too long"); logging(2,ptr); return NG; }else{ strcpy(url->aux,ptr); } //tag猛を藐叫 if(strncmp(ptr,";tag=",strlen(";tag="))==0){ ptr+=strlen(";tag="); strcpy(url->tag,ptr); } } } return OK;}int AnalyzeIntHeader(char *buff,int *val){ if(val==NULL||buff==NULL) return -1; *val = atoi(buff); return OK;}int AnalyzeCharHeader(char *buff, char *val){ char *ptr; if(buff==NULL||val==NULL) return -1; ptr=SkipChars(buff,' '); if(strlen(ptr) >CLEN-1) return -2; strcpy(val,ptr); return 0;}int AnalyzeVia(char *buff,VIA *via){ char *ptr; char *ptr1; char tmp[SCLEN]; int len; int ret; ptr=buff; len=SCLEN; ptr=SkipChars(ptr,' '); ptr=SeparateLex1(ptr,'/',tmp,&len); if(len>0 && len <SCLEN && ptr!=NULL){ strcpy(via->proto,tmp); }else{ return NG; } len=SCLEN; ptr=SeparateLex1(ptr,'/',tmp,&len); if(len>0 && len <SCLEN && ptr!=NULL){ strcpy(via->ver,tmp); }else{ return NG-1; } len=SCLEN; ptr=SeparateLex1(ptr,' ',tmp,&len); if(len>0 && len <SCLEN && ptr!=NULL){ strcpy(via->trans,tmp); }else{ return NG-2; } ptr=SkipChars(ptr,' '); len=SCLEN; //ポ〖ト戎规はあるか々 ptr1=SeparateLex1(ptr,':',tmp,&len); if(ptr1!=NULL){ ptr=ptr1; if(len>0 && len <SCLEN ){ //ポ〖ト戎规がある strcpy(via->host,tmp); ptr1=SeparateLex1(ptr,';',tmp,&len); //パラメ〖タまであるか if(ptr1!=NULL){ if(len>0 && len <SCLEN){ //ポ〖ト戎规はありパラメ〖タもある via->port=atoi(tmp); }else{ return NG-3; } }else{ //ポ〖ト戎规はあるがパラメ〖タはない via->port=atoi(ptr); } ptr=ptr1; }else{ return NG-4; } }else{ //ポ〖ト戎规がない via->port=SIP_PORT; ptr1=SeparateLex1(ptr,';',tmp,&len); //パラメ〖タまであるか if(len>0 && len <SCLEN && ptr1!=NULL){ //ポ〖ト戎规はありパラメ〖タもある strcpy(via->host,tmp); }else{ strcpy(via->host,ptr); } ptr=ptr1; } //パラメ〖タの豺老 if(ptr!=NULL) { ret=analyze_params(ptr,&(via->param)); if(ret!=OK){ return NG-4; } } return OK; }int AnalyzeCSeq(char *buff,CSEQ *cseq){ char tmp[2][128]; char *ptr[2]; ptr[0]=tmp[0];ptr[1]=tmp[1]; SeparateLex(buff,' ',ptr,2); cseq->seq=atoi(tmp[0]); strcpy(cseq->method,tmp[1]); return 0; }int AddVia(VIA **top,unsigned char *hash){ VIA *ptr; char branch[256]; //topからはじまるVIAセリ〖の办戎呵介に极サ〖バ攫鼠を纳裁する //办戎呵稿のVIAを梳まえる // //VIAエリアを澄瘦する ptr=(VIA *)malloc(sizeof(VIA)); if(ptr==NULL){ logging(1,"memory short (234)"); return NG; } memset(ptr,0,sizeof(VIA)); //攫鼠肋年 strcpy(ptr->proto,"SIP"); strcpy(ptr->ver,"2.0"); strcpy(ptr->trans,"UDP"); strcpy(ptr->host,HOSTID); ptr->port=HOSTPORT; sprintf(branch,"%s%s",MAGIC,hash); *branch='\0'; strcpy(ptr->param.branch,branch); //纳裁する if(NULL==*top){ *top=ptr; }else{ ptr->next=*top; *top=ptr; } return OK;}int AddURI(URI **top){ URI *ptr; //topからはじまるURIセリ〖の办戎呵介に极サ〖バ攫鼠を纳裁する // //URIエリアを澄瘦する ptr=(URI *)malloc(sizeof(URI)); if(ptr==NULL){ logging(1,"memory short (2345)"); return NG; } memset(ptr,0,sizeof(URI)); //纳裁する if(NULL==*top){ *top=ptr; }else{ ptr->next=*top; *top=ptr; } //攫鼠肋年 strcpy(ptr->host,HOSTID); ptr->port=HOSTPORT; sprintf(ptr->username,"NTTPC%d",getpid()); return OK;}int SearchVia(VIA **top,char *host,int *port){ VIA *ptr; //VIA topが极尸であるかどうか浮汉する ptr=*top; if (ptr==NULL){ logging(2,"Not found Via in Response(344)"); return NG; } //极サ〖バ案かどうか浮汉する if(strcmp(HOSTID,ptr->host)==0){ //极サ〖バ案である *top=ptr->next; //呵稿萨VIAを久殿する free(ptr); ptr=*top; } strcpy(host,ptr->host); *port=ptr->port; return OK;}int DeleteURI(URI **top){ URI *ptr; if(top==NULL){ logging(3,"Invlid parameter BUG(Delete URI)"); return NG; } //URI topが极尸であるかどうか浮汉する ptr=*top; if (ptr==NULL){ return OK; } //极サ〖バ案かどうか浮汉する if(strcmp(HOSTID,ptr->host)==0){ //极サ〖バ案である *top=ptr->next; //呵稿萨VIAを久殿する free(ptr); } return OK;}void DisplayURI(int level,URI *uri){ printf("DisplayName:%s\n",uri->display); printf("UserName:%s\n",uri->username); printf("Password:%s\n",uri->password); printf("Host:%s\n",uri->host); printf("Port:%d\n",uri->port); printf("tag:%s\n",uri->param.tag); printf("maddr:%s\n",uri->param.maddr); printf("branch:%s\n",uri->param.branch); printf("ttl:%d\n",uri->param.ttl); printf("lr:%d\n",uri->param.lr); printf("transport:%s\n",uri->param.transport); printf("user:%s\n",uri->param.user); printf("method:%s\n",uri->param.method); printf("param.aux:%s\n",uri->param.aux); printf("tag:%s\n",uri->tag); printf("aux:%s\n",uri->aux); printf("------------------------------\n");}void DisplayPAUTH(PAUTH *pauth){ if(pauth==NULL) return; printf("realm=%s\n",pauth->realm); printf("domain=%s\n",pauth->domain); printf("qop=%s\n",pauth->qop); printf("opaque=%s\n",pauth->opaque); printf("nonce=%s\n",pauth->nonce); printf("cnonce=%s\n",pauth->cnonce); printf("nc=%s\n",pauth->nc); printf("uri=%s\n",pauth->uri); printf("username=%s\n",pauth->username); printf("algorithm=%s\n",pauth->algorithm); printf("stale=%s\n",pauth->stale); printf("response=%s\n",pauth->response); printf("aux=%s\n",pauth->aux);}#ifdef TESTstatic void trim(char *p){ for(;*p;p++){ if(*p==0x0d||*p==0x0a){ *p='\0'; break; } }}static void test_URI(int argc ,char **argv){ char buff[256]; FILE *fp; URI url; int res; if(argc<2){ exit(0); } fp=fopen(argv[1],"r"); if(fp==NULL){ exit(0); } for(;fgets(buff,200,fp);){ trim(buff); memset(&url,0,sizeof(URI)); printf("------------------------\n"); printf("%s\n",buff); printf("----\n"); res=AnalyzeURI(buff,&url); printf("res=%d\n",res); if(res==OK){ DisplayURI(1,&url); } } fclose(fp);}static void testVIA(int argc,char **argv){ VIA via; int ret; char mes[]="SIP/2.0/UDP 10.1.2.3:5060;branch=sidugy9suga;received=192.168.10.2"; printf("Original mes=%s\n",mes); memset(&via,0,sizeof(VIA)); ret=AnalyzeVia(mes,&via); printf("ret=%d\n",ret); printf("proto=%s\n",via.proto); printf("ver=%s\n",via.ver); printf("trans=%s\n",via.trans); printf("host=%s\n",via.host); printf("port=%d\n",via.port); printf("branch=%s\n",via.param.branch);}main(int argc,char **argv){ testVIA(argc,argv); //test_URI(argc,argv);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -