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

📄 sip_msg.c

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
} while(0);	LUMP_LIST_LEN(len, org_msg->add_rm);	LUMP_LIST_LEN(len, org_msg->body_lumps);		/*length of reply lump structures*/	for(rpl_lump=org_msg->reply_lump;rpl_lump;rpl_lump=rpl_lump->next)			len+=ROUND4(sizeof(struct lump_rpl))+ROUND4(rpl_lump->text.len);	p=(char *)shm_malloc(len);	if (!p)	{		LOG(L_ERR , "ERROR: sip_msg_cloner: cannot allocate memory\n" );		return 0;	}	if (sip_msg_len)		*sip_msg_len = len;	/* filling up the new structure */	new_msg = (struct sip_msg*)p;	/* sip msg structure */	memcpy( new_msg , org_msg , sizeof(struct sip_msg) );	p += ROUND4(sizeof(struct sip_msg));	new_msg->add_rm = 0;	new_msg->body_lumps = 0;	/* new_uri */	if (org_msg->new_uri.s && org_msg->new_uri.len)	{		new_msg->new_uri.s = p;		memcpy( p , org_msg->new_uri.s , org_msg->new_uri.len);		p += ROUND4(org_msg->new_uri.len);	}	/* dst_uri */	if (org_msg->dst_uri.s && org_msg->dst_uri.len)	{		new_msg->dst_uri.s = p;		memcpy( p , org_msg->dst_uri.s , org_msg->dst_uri.len);		p += ROUND4(org_msg->dst_uri.len);	}	/* message buffers(org and scratch pad) */	memcpy( p , org_msg->buf, org_msg->len);	/* ZT to be safer */	*(p+org_msg->len)=0;	new_msg->buf = p;	p += ROUND4(new_msg->len+1);	/* unparsed and eoh pointer */	new_msg->unparsed = translate_pointer(new_msg->buf ,org_msg->buf,		org_msg->unparsed );	new_msg->eoh = translate_pointer(new_msg->buf,org_msg->buf,org_msg->eoh);	/* first line, updating the pointers*/	if ( org_msg->first_line.type==SIP_REQUEST )	{		new_msg->first_line.u.request.method.s =			translate_pointer( new_msg->buf , org_msg->buf ,			org_msg->first_line.u.request.method.s );		new_msg->first_line.u.request.uri.s =			translate_pointer( new_msg->buf , org_msg->buf ,			org_msg->first_line.u.request.uri.s );		new_msg->first_line.u.request.version.s =			translate_pointer( new_msg->buf , org_msg->buf ,			org_msg->first_line.u.request.version.s );		uri_trans(new_msg->buf, org_msg->buf, &new_msg->parsed_orig_ruri);		uri_trans(new_msg->buf, org_msg->buf, &new_msg->parsed_uri);	}	else if ( org_msg->first_line.type==SIP_REPLY )	{		new_msg->first_line.u.reply.version.s =			translate_pointer( new_msg->buf , org_msg->buf ,			org_msg->first_line.u.reply.version.s );		new_msg->first_line.u.reply.status.s =			translate_pointer( new_msg->buf , org_msg->buf ,			org_msg->first_line.u.reply.status.s );		new_msg->first_line.u.reply.reason.s =			translate_pointer( new_msg->buf , org_msg->buf ,			org_msg->first_line.u.reply.reason.s );	}	/*headers list*/	new_msg->via1=0;	new_msg->via2=0;	for( hdr=org_msg->headers,last_hdr=0 ; hdr ; hdr=hdr->next )	{		new_hdr = (struct hdr_field*)p;		memcpy(new_hdr, hdr, sizeof(struct hdr_field) );		p += ROUND4(sizeof( struct hdr_field));		new_hdr->name.s = translate_pointer(new_msg->buf, org_msg->buf,			hdr->name.s);		new_hdr->body.s = translate_pointer(new_msg->buf, org_msg->buf,			hdr->body.s);		/* by default, we assume we don't understand this header in TM		   and better set it to zero; if we do, we will set a specific		   value in the following switch statement		*/		new_hdr->parsed=0;		switch (hdr->type)		{			case HDR_VIA:				/*fprintf(stderr,"prepare to clone via |%.*s|\n",					via_len((struct via_body*)hdr->parsed),					via_s((struct via_body*)hdr->parsed,org_msg));*/				if ( !new_msg->via1 )				{					new_msg->h_via1 = new_hdr;					new_msg->via1 = via_body_cloner(new_msg->buf,						org_msg->buf, (struct via_body*)hdr->parsed, &p);					new_hdr->parsed  = (void*)new_msg->via1;					/*fprintf(stderr,"setting via1 |%.*s|\n",						via_len(new_msg->via1),						via_s(new_msg->via1,new_msg));*/					if ( new_msg->via1->next )						new_msg->via2 = new_msg->via1->next;				}				else if ( !new_msg->via2 && new_msg->via1 )				{					new_msg->h_via2 = new_hdr;					if ( new_msg->via1->next )						new_hdr->parsed = (void*)new_msg->via1->next;					else{						new_msg->via2 = via_body_cloner( new_msg->buf,							org_msg->buf, (struct via_body*)hdr->parsed, &p);						new_hdr->parsed  = (void*)new_msg->via2;					}				}				else if ( new_msg->via2 && new_msg->via1 )				{					new_hdr->parsed =  						via_body_cloner( new_msg->buf , org_msg->buf ,						(struct via_body*)hdr->parsed , &p);				}				break;			case HDR_CSEQ:				new_hdr->parsed = p;				p +=ROUND4(sizeof(struct cseq_body));				memcpy(new_hdr->parsed, hdr->parsed, sizeof(struct cseq_body));				((struct cseq_body*)new_hdr->parsed)->number.s =					translate_pointer(new_msg->buf ,org_msg->buf,					((struct cseq_body*)hdr->parsed)->number.s );				((struct cseq_body*)new_hdr->parsed)->method.s =					translate_pointer(new_msg->buf ,org_msg->buf,					((struct cseq_body*)hdr->parsed)->method.s );				if (!HOOK_SET(cseq)) new_msg->cseq = new_hdr;				break;			case HDR_TO:			case HDR_FROM:				if (hdr->type == HDR_TO) {					if (!HOOK_SET(to)) new_msg->to = new_hdr;				} else {					if (!HOOK_SET(from)) new_msg->from = new_hdr;				}				/* From header might be unparsed */				if (!hdr->parsed) break;				new_hdr->parsed = p;				p +=ROUND4(sizeof(struct to_body));				memcpy(new_hdr->parsed, hdr->parsed, sizeof(struct to_body));				((struct to_body*)new_hdr->parsed)->body.s =					translate_pointer( new_msg->buf , org_msg->buf ,					((struct to_body*)hdr->parsed)->body.s );				((struct to_body*)new_hdr->parsed)->uri.s =					translate_pointer( new_msg->buf , org_msg->buf ,					((struct to_body*)hdr->parsed)->uri.s );				if ( ((struct to_body*)hdr->parsed)->tag_value.s )					((struct to_body*)new_hdr->parsed)->tag_value.s =						translate_pointer( new_msg->buf , org_msg->buf ,						((struct to_body*)hdr->parsed)->tag_value.s );				/*to params*/				to_prm = ((struct to_body*)(hdr->parsed))->param_lst;				for(;to_prm;to_prm=to_prm->next)				{					/*alloc*/					new_to_prm = (struct to_param*)p;					p +=ROUND4(sizeof(struct to_param ));					/*coping*/					memcpy( new_to_prm, to_prm, sizeof(struct to_param ));					((struct to_body*)new_hdr->parsed)->param_lst = 0;					new_to_prm->name.s = translate_pointer( new_msg->buf,						org_msg->buf , to_prm->name.s );					new_to_prm->value.s = translate_pointer( new_msg->buf,						org_msg->buf , to_prm->value.s );					/*linking*/					if ( !((struct to_body*)new_hdr->parsed)->param_lst )						((struct to_body*)new_hdr->parsed)->param_lst							= new_to_prm;					else						((struct to_body*)new_hdr->parsed)->last_param->next							= new_to_prm;					((struct to_body*)new_hdr->parsed)->last_param						= new_to_prm;				}				break;			case HDR_CALLID:				if (!HOOK_SET(callid)) {					new_msg->callid = new_hdr;				}				break;			case HDR_CONTACT:				if (!HOOK_SET(contact)) {					new_msg->contact = new_hdr;				}				break;			case HDR_MAXFORWARDS :				if (!HOOK_SET(maxforwards)) {					new_msg->maxforwards = new_hdr;				}				break;			case HDR_ROUTE :				if (!HOOK_SET(route)) {					new_msg->route = new_hdr;				}				break;			case HDR_RECORDROUTE :				if (!HOOK_SET(record_route)) {					new_msg->record_route = new_hdr;				}				break;			case HDR_CONTENTTYPE :				if (!HOOK_SET(content_type)) {					new_msg->content_type = new_hdr;					new_msg->content_type->parsed = hdr->parsed;				}				break;			case HDR_CONTENTLENGTH :				if (!HOOK_SET(content_length)) {					new_msg->content_length = new_hdr;					new_msg->content_length->parsed = hdr->parsed;				}				break;			case HDR_AUTHORIZATION :				if (!HOOK_SET(authorization)) {					new_msg->authorization = new_hdr;				}				if (hdr->parsed) {					new_hdr->parsed = auth_body_cloner(new_msg->buf ,						org_msg->buf , (struct auth_body*)hdr->parsed , &p);				}				break;			case HDR_EXPIRES :				if (!HOOK_SET(expires)) {					new_msg->expires = new_hdr;				}				break;			case HDR_PROXYAUTH :				if (!HOOK_SET(proxy_auth)) {					new_msg->proxy_auth = new_hdr;				}				if (hdr->parsed) {					new_hdr->parsed = auth_body_cloner(new_msg->buf ,						org_msg->buf , (struct auth_body*)hdr->parsed , &p);				}				break;			case HDR_SUPPORTED :				if (!HOOK_SET(supported)) {					new_msg->supported = new_hdr;				}				break;			case HDR_PROXYREQUIRE :				if (!HOOK_SET(proxy_require)) {					new_msg->proxy_require = new_hdr;				}				break;			case HDR_UNSUPPORTED :				if (!HOOK_SET(unsupported)) {					new_msg->unsupported = new_hdr;				}				break;			case HDR_ALLOW :				if (!HOOK_SET(allow)) {					new_msg->allow = new_hdr;				}				break;			case HDR_EVENT:				if (!HOOK_SET(event)) {					new_msg->event = new_hdr;				}				break;			case HDR_ACCEPT:				if (!HOOK_SET(accept)) {					new_msg->accept = new_hdr;				}				break;			case HDR_ACCEPTLANGUAGE:				if (!HOOK_SET(accept_language)) {					new_msg->accept_language = new_hdr;				}				break;			case HDR_ORGANIZATION:				if (!HOOK_SET(organization)) {					new_msg->organization = new_hdr;				}				break;			case HDR_PRIORITY:				if (!HOOK_SET(priority)) {					new_msg->priority = new_hdr;				}				break;			case HDR_SUBJECT:				if (!HOOK_SET(subject)) {					new_msg->subject = new_hdr;				}				break;			case HDR_USERAGENT:				if (!HOOK_SET(user_agent)) {					new_msg->user_agent = new_hdr;				}				break;			case HDR_ACCEPTDISPOSITION:				if (!HOOK_SET(accept_disposition)) {					new_msg->accept_disposition = new_hdr;				}				break;			case HDR_CONTENTDISPOSITION:				if (!HOOK_SET(content_disposition)) {					new_msg->content_disposition = new_hdr;				}				break;		}/*switch*/		if ( last_hdr )		{			last_hdr->next = new_hdr;			last_hdr=last_hdr->next;		}		else		{			last_hdr=new_hdr;			new_msg->headers =new_hdr;		}		last_hdr->next = 0;		new_msg->last_header = last_hdr;	}	/* cloning data lump */#define CLONE_LUMP_LIST(anchor, list) \do { \	struct lump* lump_tmp, *l; \	struct lump** lump_anchor2, **a; \	a = (anchor); \	l = (list); \	while (l) \	{ \		lump_clone( (*a) , l , p ); \		/*before list*/ \		lump_tmp = l->before; \		lump_anchor2 = &((*a)->before); \		while ( lump_tmp ) \		{ \			lump_clone( (*lump_anchor2) , lump_tmp , p ); \			lump_anchor2 = &((*lump_anchor2)->before); \			lump_tmp = lump_tmp->before; \		} \		/*after list*/ \		lump_tmp = l->after; \		lump_anchor2 = &((*a)->after); \		while ( lump_tmp ) \		{ \			lump_clone( (*lump_anchor2) , lump_tmp , p ); \			lump_anchor2 = &((*lump_anchor2)->after); \			lump_tmp = lump_tmp->after; \		} \		a = &((*a)->next); \		l = l->next; \	} \} while(0)	CLONE_LUMP_LIST(&(new_msg->add_rm), org_msg->add_rm);	CLONE_LUMP_LIST(&(new_msg->body_lumps), org_msg->body_lumps);	/*cloning reply lump structures*/	rpl_lump_anchor = &(new_msg->reply_lump);	for(rpl_lump=org_msg->reply_lump;rpl_lump;rpl_lump=rpl_lump->next)	{		*(rpl_lump_anchor)=(struct lump_rpl*)p;		p+=ROUND4(sizeof( struct lump_rpl ));		(*rpl_lump_anchor)->flags = LUMP_RPL_SHMEM |			(rpl_lump->flags&(~(LUMP_RPL_NODUP|LUMP_RPL_NOFREE)));		(*rpl_lump_anchor)->text.len = rpl_lump->text.len;		(*rpl_lump_anchor)->text.s=p;		p+=ROUND4(rpl_lump->text.len);		memcpy((*rpl_lump_anchor)->text.s,rpl_lump->text.s,rpl_lump->text.len);		(*rpl_lump_anchor)->next=0;		rpl_lump_anchor = &((*rpl_lump_anchor)->next);	}	if (clone_authorized_hooks(new_msg, org_msg) < 0) {		shm_free(new_msg);		return 0;	}	return new_msg;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -