⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 header.c

📁 sip代理服务器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************\	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 + -