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

📄 msilo.c

📁 性能优秀的SIP Proxy
💻 C
📖 第 1 页 / 共 3 页
字号:
		{			DBG("MSILO:m_store: ERROR 'To' cannot be parsed\n");			goto error;		}	}		if(pto->uri.len == reg_addr.len && 			!strncasecmp(pto->uri.s, reg_addr.s, reg_addr.len))	{		DBG("MSILO:m_store: message to MSILO REGISTRAR!\n");		goto error;	}	db_keys[nr_keys] = sc_to;		db_vals[nr_keys].type = DB_STR;	db_vals[nr_keys].nul = 0;	db_vals[nr_keys].val.str_val.s = pto->uri.s;	db_vals[nr_keys].val.str_val.len = pto->uri.len;	nr_keys++;	/* check FROM URI */	if(!msg->from || !msg->from->body.s)	{		DBG("MSILO:m_store: ERROR cannot find 'from' header!\n");		goto error;	}	if(msg->from->parsed == NULL)	{		DBG("MSILO:m_store: 'From' header not parsed\n");		/* parsing from header */		if ( parse_from_header( msg )<0 ) 		{			DBG("MSILO:m_store: ERROR cannot parse From header\n");			goto error;		}	}	pfrom = (struct to_body*)msg->from->parsed;	DBG("MSILO:m_store: 'From' header: <%.*s>\n", pfrom->uri.len,			pfrom->uri.s);			if(reg_addr.s && pfrom->uri.len == reg_addr.len && 			!strncasecmp(pfrom->uri.s, reg_addr.s, reg_addr.len))	{		DBG("MSILO:m_store: message from MSILO REGISTRAR!\n");		goto error;	}	db_keys[nr_keys] = sc_from;		db_vals[nr_keys].type = DB_STR;	db_vals[nr_keys].nul = 0;	db_vals[nr_keys].val.str_val.s = pfrom->uri.s;	db_vals[nr_keys].val.str_val.len = pfrom->uri.len;	nr_keys++;	/* get the R-URI */	memset(&puri, 0, sizeof(struct sip_uri));	if(ms_userid_avp!=0)	{		avp = NULL;		avp_name.n = ms_userid_avp;		avp=search_first_avp(0, avp_name, &avp_value, 0);		if(avp!=NULL && is_avp_str_val(avp))		{			if(parse_uri(avp_value.s.s, avp_value.s.len, &puri)!=0)			{				LOG(L_ERR, "MSILO:m_store: bad new URI in userid avp!\n");				goto error;			} else {				DBG("MSILO:m_store: using user id from avp\n");			}		}	}	if(mode && mode[0]=='0' && puri.user.len == 0 && msg->new_uri.len > 0)	{		DBG("MSILO:m_store: NEW R-URI found - check if is AoR!\n");		if(parse_uri(msg->new_uri.s, msg->new_uri.len, &puri)!=0)		{			LOG(L_ERR, "MSILO:m_store: bad new R-URI!\n");			goto error;		}		if(puri.user.len>0 && puri.user.s!=NULL				&& puri.host.len>0 && puri.host.s!=NULL)		{			if(str2ip(&puri.host)!=NULL || str2ip6(&puri.host)!=NULL)			{ /* it is a IPv4 or IPv6 address */				puri.user.len = 0;			}		}		else			puri.user.len = 0;	}		if(mode && mode[0]<='1' && puri.user.len == 0 			&& msg->first_line.u.request.uri.len > 0 )	{		DBG("MSILO:m_store: R-URI found - check if is AoR!\n");		if(parse_uri(msg->first_line.u.request.uri.s,			msg->first_line.u.request.uri.len, &puri)!=0)		{			LOG(L_ERR, "MSILO:m_store: bad R-URI!\n");			goto error;		}		if(puri.user.len>0 && puri.user.s!=NULL				&& puri.host.len>0 && puri.host.s!=NULL)		{			if(str2ip(&puri.host)!=NULL || str2ip6(&puri.host)!=NULL)			{ /* it is a IPv4 or IPv6 address */				puri.user.len = 0;			}		}		else			puri.user.len = 0;	}		if (puri.user.len == 0)	{		DBG("MSILO:m_store: TO used as R-URI\n");		if(parse_uri(pto->uri.s, pto->uri.len, &puri)!=0)		{			LOG(L_ERR, "MSILO:m_store: bad R-URI!\n");			goto error;		}		if(puri.user.len<=0 || puri.user.s==NULL				|| puri.host.len<=0 || puri.host.s==NULL)		{			LOG(L_ERR, "MSILO:m_store: bad URI in To header!\n");			goto error;		}	}	db_keys[nr_keys] = sc_uri_user;		db_vals[nr_keys].type = DB_STR;	db_vals[nr_keys].nul = 0;	db_vals[nr_keys].val.str_val.s = puri.user.s;	db_vals[nr_keys].val.str_val.len = puri.user.len;	nr_keys++;	db_keys[nr_keys] = sc_uri_host;		db_vals[nr_keys].type = DB_STR;	db_vals[nr_keys].nul = 0;	db_vals[nr_keys].val.str_val.s = puri.host.s;	db_vals[nr_keys].val.str_val.len = puri.host.len;	nr_keys++;	/* add the message's body in SQL query */		db_keys[nr_keys] = sc_body;		db_vals[nr_keys].type = DB_BLOB;	db_vals[nr_keys].nul = 0;	db_vals[nr_keys].val.blob_val.s = body.s;	db_vals[nr_keys].val.blob_val.len = body.len;	nr_keys++;		lexpire = ms_expire_time;	/* add 'content-type' -- parse the content-type header */	if ((mime=parse_content_type_hdr(msg))<1 ) 	{		LOG(L_ERR,"MSILO:m_store: ERROR cannot parse Content-Type header\n");		goto error;	}	db_keys[nr_keys]      = sc_ctype;	db_vals[nr_keys].type = DB_STR;	db_vals[nr_keys].nul  = 0;	db_vals[nr_keys].val.str_val.s   = "text/plain";	db_vals[nr_keys].val.str_val.len = 10;		/** check the content-type value */	if( mime!=(TYPE_TEXT<<16)+SUBTYPE_PLAIN		&& mime!=(TYPE_MESSAGE<<16)+SUBTYPE_CPIM )	{		if(m_extract_content_type(msg->content_type->body.s, 				msg->content_type->body.len, &ctype, CT_TYPE) != -1)		{			DBG("MSILO:m_store: 'content-type' found\n");			db_vals[nr_keys].val.str_val.s   = ctype.type.s;			db_vals[nr_keys].val.str_val.len = ctype.type.len;		}	}	nr_keys++;	/* check 'expires' -- no more parsing - already done by get_body() */	if(msg->expires && msg->expires->body.len > 0)	{		DBG("MSILO:m_store: 'expires' found\n");		val = atoi(msg->expires->body.s);		if(val > 0)			lexpire = (ms_expire_time<=val)?ms_expire_time:val;	}	/* current time */	val = (int)time(NULL);		/* add expiration time */	db_keys[nr_keys] = sc_exp_time;	db_vals[nr_keys].type = DB_INT;	db_vals[nr_keys].nul = 0;	db_vals[nr_keys].val.int_val = val+lexpire;	nr_keys++;	/* add incoming time */	db_keys[nr_keys] = sc_inc_time;	db_vals[nr_keys].type = DB_INT;	db_vals[nr_keys].nul = 0;	db_vals[nr_keys].val.int_val = val;	nr_keys++;	/* add sending time */	db_keys[nr_keys] = sc_snd_time;	db_vals[nr_keys].type = DB_INT;	db_vals[nr_keys].nul = 0;	db_vals[nr_keys].val.int_val = 0;	if(ms_userid_avp!=0)	{		avp = NULL;		avp_name.n = ms_snd_time_avp;		avp=search_first_avp(0, avp_name, &avp_value, 0);		if(avp!=NULL && is_avp_str_val(avp))		{			if(ms_extract_time(&avp_value.s, &db_vals[nr_keys].val.int_val)!=0)				db_vals[nr_keys].val.int_val = 0;		}	}	nr_keys++;	if (msilo_dbf.use_table(db_con, ms_db_table) < 0)	{		LOG(L_ERR, "MSILO:m_store: Error in use_table\n");		goto error;	}	if(msilo_dbf.insert(db_con, db_keys, db_vals, nr_keys) < 0)	{		LOG(L_ERR, "MSILO:m_store: error storing message\n");		goto error;	}	DBG("MSILO:m_store: message stored. T:<%.*s> F:<%.*s>\n",		pto->uri.len, pto->uri.s, pfrom->uri.len, pfrom->uri.s);	#ifdef STATISTICS	update_stat(ms_stored_msgs, 1);#endif	if(reg_addr.len <= 0			|| reg_addr.len+CONTACT_PREFIX_LEN+CONTACT_SUFFIX_LEN+1>=1024)		goto done;	if(flags!=NULL && flags[0]=='0')		goto done;		DBG("MSILO:m_store: sending info message.\n");	strcpy(buf1, CONTACT_PREFIX);	strncat(buf1,reg_addr.s,reg_addr.len);	strncat(buf1, CONTACT_SUFFIX, CONTACT_SUFFIX_LEN);	str_hdr.len = CONTACT_PREFIX_LEN+reg_addr.len+CONTACT_SUFFIX_LEN;	str_hdr.s = buf1;	strncpy(buf, "User [", 6);	body.len = 6;	if(pto->uri.len+OFFLINE_MESSAGE_LEN+7/*6+1*/ < 512)	{		strncpy(buf+body.len, pto->uri.s, pto->uri.len);		body.len += pto->uri.len;	}	strncpy(buf+body.len, OFFLINE_MESSAGE, OFFLINE_MESSAGE_LEN);	body.len += OFFLINE_MESSAGE_LEN;	body.s = buf;	/* look for Contact header -- must be parsed by now*/	ctaddr.s = NULL;	if(ms_use_contact && msg->contact!=NULL && msg->contact->body.s!=NULL			&& msg->contact->body.len > 0)	{		DBG("MSILO:m_store: contact header found\n");		if((msg->contact->parsed!=NULL 			&& ((contact_body_t*)(msg->contact->parsed))->contacts!=NULL)			|| (parse_contact(msg->contact)==0			&& msg->contact->parsed!=NULL			&& ((contact_body_t*)(msg->contact->parsed))->contacts!=NULL))		{			DBG("MSILO:m_store: using contact header for info msg\n");			ctaddr.s = 			((contact_body_t*)(msg->contact->parsed))->contacts->uri.s;			ctaddr.len =			((contact_body_t*)(msg->contact->parsed))->contacts->uri.len;					if(!ctaddr.s || ctaddr.len < 6 || strncmp(ctaddr.s, "sip:", 4)				|| ctaddr.s[4]==' ')				ctaddr.s = NULL;			else				DBG("MSILO:m_store: feedback contact [%.*s]\n",						ctaddr.len,ctaddr.s);		}	}			tmb.t_request(&msg_type,  /* Type of the message */			(ctaddr.s)?&ctaddr:&pfrom->uri,    /* Request-URI */			&pfrom->uri,      /* To */			&reg_addr,        /* From */			&str_hdr,         /* Optional headers including CRLF */			&body,            /* Message body */			NULL,             /* Callback function */			NULL              /* Callback parameter */		);done:	return 1;error:	return -1;}/** * dump message */static int m_dump(struct sip_msg* msg, char* str1, char* str2){	struct to_body to, *pto = NULL;	db_key_t db_keys[3];	db_op_t  db_ops[3];	db_val_t db_vals[3];	db_key_t db_cols[6];	db_res_t* db_res = NULL;	int i, db_no_cols = 6, db_no_keys = 3, mid, n;	static char hdr_buf[1024];	static char body_buf[1024];	struct sip_uri puri;	str str_vals[4], hdr_str , body_str;	time_t rtime;		/* init */	db_keys[0]=sc_uri_user;	db_keys[1]=sc_uri_host;	db_keys[2]=sc_snd_time;	db_ops[0]=OP_EQ;	db_ops[1]=OP_EQ;	db_ops[2]=OP_EQ;	db_cols[0]=sc_mid;	db_cols[1]=sc_from;	db_cols[2]=sc_to;	db_cols[3]=sc_body;	db_cols[4]=sc_ctype;	db_cols[5]=sc_inc_time;		DBG("MSILO:m_dump: ------------ start ------------\n");	hdr_str.s=hdr_buf;	hdr_str.len=1024;	body_str.s=body_buf;	body_str.len=1024;		/* check for TO header */	if(msg->to==NULL && (parse_headers(msg, HDR_TO_F, 0)==-1				|| msg->to==NULL || msg->to->body.s==NULL))	{		LOG(L_ERR,"MSILO:m_dump: ERROR cannot find TO HEADER!\n");		goto error;	}	/* get TO header URI */	if(msg->to->parsed != NULL)	{		pto = (struct to_body*)msg->to->parsed;		DBG("MSILO:m_dump: 'To' header ALREADY PARSED: <%.*s>\n",			pto->uri.len, pto->uri.s );		}	else	{		memset( &to , 0, sizeof(to) );		parse_to(msg->to->body.s,			msg->to->body.s + msg->to->body.len + 1, &to);		if(to.uri.len <= 0) /* || to.error != PARSE_OK) */		{			DBG("MSILO:m_dump: 'To' header NOT parsed\n");			goto error;		}		pto = &to;	}	/**	 * check if has expires=0 (REGISTER)	 */	if(parse_headers(msg, HDR_EXPIRES_F, 0) >= 0)	{		/* check 'expires' > 0 */		if(msg->expires && msg->expires->body.len > 0)		{			i = atoi(msg->expires->body.s);			if(i <= 0)			{ /* user goes offline */				DBG("MSILO:m_dump: user <%.*s> goes offline - expires=%d\n",						pto->uri.len, pto->uri.s, i);				goto error;			}			else				DBG("MSILO:m_dump: user <%.*s> online - expires=%d\n",						pto->uri.len, pto->uri.s, i);		}	}	else	{		DBG("MSILO:m_dump: 'expires' threw error at parsing\n");		goto error;

⌨️ 快捷键说明

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