📄 header.c
字号:
/***********************************************************************\ SIP Server Date Ver Author MemoRandom Jul 3,2002 1.0 Hiroaki Hata Created (C) 2002 All Copyrights reserved. *************************************************************************/#include <sys/types.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <string.h>#include <unistd.h>#include "udp.h"#include "sipd.h"#include "parser.h"#define MAGIC "z9hG4bK"static int analyze_displayname(char *buff,URI *url);static int analyze_user_info(char *buff,URI *url);static int analyze_host_port(char *buff,URI *url);static int analyze_param_segment(char *buff,URIPARAM *param);static int analyze_params(char *buff,URIPARAM *param);#ifdef TEST static char HOSTID[CLEN];static unsigned short HOSTPORT;static int debug=1;#elseextern char HOSTID[CLEN];extern unsigned short HOSTPORT;#endifstatic int analyze_displayname(char *buff,URI *url){ char *ptr; char *start; for(;*buff==' ';){ buff++; } if(*buff=='"'){ start=++buff; ptr=strchr(start,'"'); if(ptr==NULL){ return -10; }else{ *ptr='\0'; strcpy(url->display,start); return 0; } } if(strncmp(buff,"<sip:",5)==0){ return 0; } if(strncmp(buff,"sip:",4)==0){ return 0; } for(ptr=start=buff;*ptr;ptr++){ if(*ptr=='<' || *ptr==' ' ){ *ptr='\0'; break; } if(strncmp(ptr,"sip:",4)==0){ *ptr='\0'; break; } } strcpy(url->display,start); return 0;}static int analyze_user_info(char *buff,URI *url){ char *start; char *ptr; start=strstr(buff,"sip:"); if(start==NULL){ return -20; } start+=4; for(ptr=start;*ptr;ptr++){ if(*ptr=='>' || *ptr==' ' ||*ptr==';'){ *ptr='\0'; break; } } //Is There any @ ptr=strchr(start,'@'); if(ptr!=NULL){ *ptr='\0'; //Is There any PASSWORD ? ptr=strchr(start,':'); if(ptr!=NULL){ *ptr='\0'; ptr++; strcpy(url->password,ptr); } strcpy(url->username,start); }else{ return -50; } return 0;}static int analyze_host_port(char *buff,URI *url){ char *start; char *ptr; start=strstr(buff,"sip:"); if(start==NULL){ return -20; } start+=4; for(ptr=start;*ptr;ptr++){ if(*ptr=='>' || *ptr==' ' ||*ptr==';'){ *ptr='\0'; break; } } //Is There any @ ptr=strchr(start,'@'); if(ptr!=NULL){ start=++ptr; } /* else{ return -30; } */ //Is There any Port ? ptr=strchr(start,':'); if(ptr!=NULL){ *ptr='\0'; ptr++; url->port=atoi(ptr); } strcpy(url->host,start); return 0;}static int analyze_param_segment(char *buff,URIPARAM *param){ int len; if(buff==NULL||*buff=='\0') return OK; if(strlen(buff)>CLEN) { logging(2,"param too long"); logging(2,buff); return NG; } buff=SkipChars(buff,' '); if(strncmp(buff,PTAG,strlen(PTAG))==0){ buff+=strlen(PTAG); strcpy(param->tag,buff); }else if(strncmp(buff,PUSER,strlen(PUSER))==0){ buff+=strlen(PUSER); strcpy(param->user,buff); }else if(strncmp(buff,PBRANCH,strlen(PBRANCH))==0){ buff+=strlen(PBRANCH); strcpy(param->branch,buff); }else if(strncmp(buff,PMADDR,strlen(PMADDR))==0){ buff+=strlen(PMADDR); strcpy(param->maddr,buff); }else if(strncmp(buff,PTTL,strlen(PTTL))==0){ buff+=strlen(PTTL); param->ttl=atoi(buff); }else if(strncmp(buff,PTRANSPORT,strlen(PTRANSPORT))==0){ buff+=strlen(PTRANSPORT); strcpy(param->transport,buff); }else if(strncmp(buff,PMETHOD,strlen(PMETHOD))==0){ buff+=strlen(PMETHOD); strcpy(param->method,buff); }else if(strncmp(buff,PLR,strlen(PLR))==0){ param->lr=1; }else{ len=sizeof(param->aux); len=sizeof(param->aux)-strlen(param->aux); if(len > (strlen(buff)+10)){ strcat(param->aux,";"); strcat(param->aux,buff); }else{ logging(2,"param too long (2)"); logging(2,buff); return NG; } } return OK;}static int shape_buffer(char *in_buff,char *out_buff){ char *ptr; *out_buff='\0'; in_buff=SkipChars(in_buff,' '); if(*in_buff=='"'){ //ダブルクォテ〖ションを猴近する in_buff++; ptr=strchr(in_buff,'"'); if(ptr==NULL){ logging(2,"double quate cannot be found"); logging(2,in_buff); return NG; }else{ *ptr='\0'; strcpy(out_buff,in_buff); return OK; } }else{ //琐萨のスペ〖スを猴近する ptr=strchr(in_buff,' '); if(ptr!=NULL){ *ptr='\0'; } strcpy(out_buff,in_buff); } return OK;}static int analyze_pauth_segment(char *buff,PAUTH *param){ int len; char abuff[CLEN]; if(buff==NULL||*buff=='\0') return OK; if(strlen(buff)>CLEN) { logging(2,"pauth param too long"); logging(2,buff); return NG; } buff=SkipChars(buff,' '); if(strncmp(buff,PAUTH_REALM,strlen(PAUTH_REALM))==0){ buff+=strlen(PAUTH_REALM); shape_buffer(buff,abuff); strcpy(param->realm,abuff); }else if(strncmp(buff,PAUTH_USER,strlen(PAUTH_USER))==0){ buff+=strlen(PAUTH_USER); shape_buffer(buff,abuff); strcpy(param->username,abuff); }else if(strncmp(buff,PAUTH_DOMAIN,strlen(PAUTH_DOMAIN))==0){ buff+=strlen(PAUTH_DOMAIN); shape_buffer(buff,abuff); strcpy(param->domain,abuff); }else if(strncmp(buff,PAUTH_QOP,strlen(PAUTH_QOP))==0){ buff+=strlen(PAUTH_QOP); shape_buffer(buff,abuff); strcpy(param->qop,abuff); }else if(strncmp(buff,PAUTH_OPAQUE,strlen(PAUTH_OPAQUE))==0){ buff+=strlen(PAUTH_OPAQUE); shape_buffer(buff,abuff); strcpy(param->opaque,abuff); }else if(strncmp(buff,PAUTH_NONCE,strlen(PAUTH_NONCE))==0){ buff+=strlen(PAUTH_NONCE); shape_buffer(buff,abuff); strcpy(param->nonce,abuff); }else if(strncmp(buff,PAUTH_CNONCE,strlen(PAUTH_CNONCE))==0){ buff+=strlen(PAUTH_CNONCE); shape_buffer(buff,abuff); strcpy(param->cnonce,abuff); }else if(strncmp(buff,PAUTH_NC,strlen(PAUTH_NC))==0){ buff+=strlen(PAUTH_NC); shape_buffer(buff,abuff); strcpy(param->nc,abuff); }else if(strncmp(buff,PAUTH_URI,strlen(PAUTH_URI))==0){ buff+=strlen(PAUTH_URI); shape_buffer(buff,abuff); strcpy(param->uri,abuff); }else if(strncmp(buff,PAUTH_ALGORITHM,strlen(PAUTH_ALGORITHM))==0){ buff+=strlen(PAUTH_ALGORITHM); shape_buffer(buff,abuff); strcpy(param->algorithm,abuff); }else if(strncmp(buff,PAUTH_STALE,strlen(PAUTH_STALE))==0){ buff+=strlen(PAUTH_STALE); shape_buffer(buff,abuff); strcpy(param->stale,abuff); }else if(strncmp(buff,PAUTH_RESPONSE,strlen(PAUTH_RESPONSE))==0){ buff+=strlen(PAUTH_RESPONSE); shape_buffer(buff,abuff); strcpy(param->response,abuff); }else{ len=sizeof(param->aux); len=sizeof(param->aux)-strlen(param->aux); if(len > (strlen(buff)+10)){ strcat(param->aux,";"); strcat(param->aux,buff); }else{ logging(2,"param too long (2)"); logging(2,buff); return NG; } } return OK;}static int analyze_params(char *buff,URIPARAM *param){ char *start; char *ptr; char *ptr1; int ret=OK; for(start=buff;start!=NULL && *start!='\0' && ret==OK;start=ptr){ ptr=strchr(start,';'); if(ptr!=NULL){ *ptr='\0'; ptr1=strchr(start,'>'); if(ptr1!=NULL){ *ptr1='\0'; ret=analyze_param_segment(start, param); return ret; } ptr++; }else { ptr=strchr(start,'>'); if(ptr!=NULL){ *ptr='\0'; ptr++; } } ret=analyze_param_segment(start, param); } return ret;}int AnalyzePAUTH(char *pbuff,PAUTH *pauth){#define DIGEST "Digest" char buff[CLEN]; int ret=OK; char *start; char *ptr; if(pbuff == NULL || pauth==NULL){ return NG; } strncpy(buff,pbuff,CLEN-1); buff[CLEN-1]='\0'; ptr=SkipChars(buff,' '); if(strncmp(ptr,DIGEST,strlen(DIGEST))==0){ ptr+=strlen(DIGEST); ptr=SkipChars(ptr,' '); }else{ return NG; } for(start=ptr;start!=NULL && *start!='\0' && ret==OK ;start=ptr){ ptr=strchr(start,','); if(ptr!=NULL){ *ptr='\0'; ptr++; } ret=analyze_pauth_segment(start, pauth); } DisplayPAUTH(pauth);//Hata return ret;} int AnalyzeURI(char *buff,URI *url ){ int res; char *ptr; char tmp[256];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -