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

📄 avpops.c

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
{	struct fis_param *ap;	int  flags;	char *s;	char *p;	flags=0;	s = (char*)*param;	ap = 0 ;		if (param_no==1)	{		if ( *s=='$' )		{			/* is variable */			if ((++s)==0)			{				LOG(L_ERR,"ERROR:avops:fixup_write_avp: bad param 1; "					"expected : $[from|to|ruri] or int/str value\n");				return E_UNSPEC;			}			if ( (p=strchr(s,'/'))!=0)				*(p++) = 0;			if ( (!strcasecmp( "from", s) && (flags|=AVPOPS_USE_FROM))				|| (!strcasecmp( "to", s) && (flags|=AVPOPS_USE_TO))				|| (!strcasecmp( "ruri", s) && (flags|=AVPOPS_USE_RURI))				|| (!strcasecmp( "src_ip", s) && (flags|=AVPOPS_USE_SRC_IP)) )			{				ap = (struct fis_param*)pkg_malloc(sizeof(struct fis_param));				if (ap==0)				{					LOG(L_ERR,"ERROR:avpops:fixup_write_avp: no more "						"pkg mem\n");					return E_OUT_OF_MEM;				}				memset( ap, 0, sizeof(struct fis_param));				/* any falgs ? */				if ( p && !( (flags&AVPOPS_USE_SRC_IP)==0 && (				(!strcasecmp("username",p) && (flags|=AVPOPS_FLAG_USER)) ||				(!strcasecmp("domain", p) && (flags|=AVPOPS_FLAG_DOMAIN)))) )				{					LOG(L_ERR,"ERROR:avpops:fixup_write_avp: flag \"%s\""						" unknown!\n", p);					return E_UNSPEC;				}				ap->flags = flags|AVPOPS_VAL_NONE;			} else {				LOG(L_ERR,"ERROR:avpops:fixup_write_avp: source \"%s\""					" unknown!\n", s);				return E_UNSPEC;			}		} else {			/* is value */			if ( (ap=parse_intstr_value(s,strlen(s)))==0 )			{				LOG(L_ERR,"ERROR:avops:fixup_write_avp: bad param 1; "					"expected : $[from|to|ruri] or int/str value\n");				return E_UNSPEC;			}		}	} else if (param_no==2) {		if ( (ap=get_attr_or_alias(s))==0 )		{			LOG(L_ERR,"ERROR:avpops:fixup_write_avp: bad attribute name"				"/alias <%s>\n", s);			return E_UNSPEC;		}		/* attr name is mandatory */		if (ap->flags&AVPOPS_VAL_NONE)		{			LOG(L_ERR,"ERROR:avpops:fixup_write_avp: you must specify "				"a name for the AVP\n");			return E_UNSPEC;		}	}	pkg_free(*param);	*param=(void*)ap;	return 0;}static int fixup_delete_avp(void** param, int param_no){	struct fis_param *ap;	char *p;	if (param_no==1) {		/* attribute name / alias */		if ( (p=strchr((char*)*param,'/'))!=0 )			*(p++)=0;		if ( (ap=get_attr_or_alias((char*)*param))==0 )		{			LOG(L_ERR,"ERROR:avpops:fixup_delete_avp: bad attribute name"				"/alias <%s>\n", (char*)*param);			return E_UNSPEC;		}		/* flags */		for( ; p&&*p ; p++ )		{			switch (*p)			{				case 'g':				case 'G':					ap->flags|=AVPOPS_FLAG_ALL;					break;				default:					LOG(L_ERR,"ERROR:avpops:fixup_delete_avp: bad flag "						"<%c>\n",*p);					return E_UNSPEC;			}		}		/* force some flags: if no avp name is given, force "all" flag */		if (ap->flags&AVPOPS_VAL_NONE)			ap->flags |= AVPOPS_FLAG_ALL;		pkg_free(*param);		*param=(void*)ap;	}	return 0;}static int fixup_pushto_avp(void** param, int param_no){	struct fis_param *ap;	char *s;	char *p;	s = (char*)*param;	ap = 0;	if (param_no==1)	{		if ( *s!='$' || (++s)==0)		{			LOG(L_ERR,"ERROR:avops:fixup_pushto_avp: bad param 1; expected : "				"$[ruri|hdr_name|..]\n");			return E_UNSPEC;		}		/* compose the param structure */		ap = (struct fis_param*)pkg_malloc(sizeof(struct fis_param));		if (ap==0)		{			LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: no more pkg mem\n");			return E_OUT_OF_MEM;		}		memset( ap, 0, sizeof(struct fis_param));		if ( (p=strchr((char*)*param,'/'))!=0 )			*(p++)=0;		if (!strcasecmp( "ruri", s))		{			ap->flags = AVPOPS_VAL_NONE|AVPOPS_USE_RURI;			if ( p && !(				(!strcasecmp("username",p) && (ap->flags|=AVPOPS_FLAG_USER)) ||				(!strcasecmp("domain",p) && (ap->flags|=AVPOPS_FLAG_DOMAIN)) ))			{				LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: unknown "					" ruri flag \"%s\"!\n",p);				return E_UNSPEC;			}		} else {			/* what's the hdr destination ? request or reply? */			if ( p==0 )			{				ap->flags = AVPOPS_USE_HDRREQ;			} else {				if (!strcasecmp( "request", p))					ap->flags = AVPOPS_USE_HDRREQ;				else if (!strcasecmp( "reply", p))					ap->flags = AVPOPS_USE_HDRRPL;				else				{					LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: header "						"destination \"%s\" unknown!\n",p);					return E_UNSPEC;				}			}			/* copy header name */			ap->val.s = (str*)pkg_malloc( sizeof(str) + strlen(s) + 1 );			if (ap->val.s==0)			{				LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: no more pkg mem\n");				return E_OUT_OF_MEM;			}			ap->val.s->s = ((char*)ap->val.s) + sizeof(str);			ap->val.s->len = strlen(s);			strcpy( ap->val.s->s, s);		}	} else if (param_no==2) {		/* attribute name / alias */		if ( (p=strchr(s,'/'))!=0 )			*(p++)=0;		if ( (ap=get_attr_or_alias(s))==0 )		{			LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: bad attribute name"				"/alias <%s>\n", (char*)*param);			return E_UNSPEC;		}		/* attr name is mandatory */		if (ap->flags&AVPOPS_VAL_NONE)		{			LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: you must specify "				"a name for the AVP\n");			return E_UNSPEC;		}		/* flags */		for( ; p&&*p ; p++ )		{			switch (*p) {				case 'g':				case 'G':					ap->flags|=AVPOPS_FLAG_ALL;					break;				default:					LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: bad flag "						"<%c>\n",*p);					return E_UNSPEC;			}		}	}	pkg_free(*param);	*param=(void*)ap;	return 0;}static int fixup_check_avp(void** param, int param_no){	struct fis_param *ap;	regex_t* re;	char *s;	s = (char*)*param;	ap = 0;	if (param_no==1)	{		if ( (ap=get_attr_or_alias(s))==0 )		{			LOG(L_ERR,"ERROR:avpops:fixup_check_avp: bad attribute name"				"/alias <%s>\n", (char*)*param);			return E_UNSPEC;		}		/* attr name is mandatory */		if (ap->flags&AVPOPS_VAL_NONE)		{			LOG(L_ERR,"ERROR:avpops:fixup_check_avp: you must specify "				"a name for the AVP\n");			return E_UNSPEC;		}	} else if (param_no==2) {		if ( (ap=parse_check_value(s))==0 )		{			LOG(L_ERR,"ERROR:avpops:fixup_check_avp: failed to parse "				"checked value \n");			return E_UNSPEC;		}		/* if REGEXP op -> compile the expresion */		if (ap->flags&AVPOPS_OP_RE)		{			if ( (ap->flags&AVPOPS_VAL_STR)==0 )			{				LOG(L_ERR,"ERROR:avpops:fixup_check_avp: regexp operation"					"requires string value\n");				return E_UNSPEC;			}			re = pkg_malloc(sizeof(regex_t));			if (re==0)			{				LOG(L_ERR,"ERROR:avpops:fixup_check_avp: no more pkg mem\n");				return E_OUT_OF_MEM;			}			DBG("DEBUG:avpops:fixup_check_avp: compiling regexp <%s>\n",				ap->val.s->s);			if (regcomp(re, ap->val.s->s, REG_EXTENDED|REG_ICASE|REG_NEWLINE))			{				pkg_free(re);				LOG(L_ERR,"ERROR:avpops:fixip_check_avp: bad re <%s>\n",					ap->val.s->s);				return E_BAD_RE;			}			/* free the string and link the regexp */			pkg_free(ap->val.s);			ap->val.s = (str*)re;		}	}	pkg_free(*param);	*param=(void*)ap;	return 0;}static int w_dbload_avps(struct sip_msg* msg, char* source, char* param){	return ops_dbload_avps ( msg, (struct fis_param*)source,								(struct db_param*)param, use_domain);}static int w_dbstore_avps(struct sip_msg* msg, char* source, char* param){	return ops_dbstore_avps ( msg, (struct fis_param*)source,								(struct db_param*)param, use_domain);}static int w_dbdelete_avps(struct sip_msg* msg, char* source, char* param){	return ops_dbdelete_avps ( msg, (struct fis_param*)source,								(struct db_param*)param, use_domain);}static int w_write_avps(struct sip_msg* msg, char* source, char* param){	return ops_write_avp ( msg, (struct fis_param*)source, 								(struct fis_param*)param);}static int w_delete_avps(struct sip_msg* msg, char* param, char* foo){	return ops_delete_avp ( msg, (struct fis_param*)param);}static int w_pushto_avps(struct sip_msg* msg, char* destination, char *param){	return ops_pushto_avp ( msg, (struct fis_param*)destination,								(struct fis_param*)param);}static int w_check_avps(struct sip_msg* msg, char* param, char *check){	return ops_check_avp ( msg, (struct fis_param*)param,								(struct fis_param*)check);}static int w_print_avps(struct sip_msg* msg, char* foo, char *bar){	return ops_print_avp();}

⌨️ 快捷键说明

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