avpops.c

来自「性能优秀的SIP Proxy」· C语言 代码 · 共 1,264 行 · 第 1/3 页

C
1,264
字号
						" pseudo-variable [%s]\n", s);				return E_OUT_OF_MEM;			}			if (ap->sval.type==XL_NULL)			{				LOG(L_ERR,"ERROR:avops:fixup_write_avp: bad param 1; "					"expected : $pseudo-variable or int/str value\n");				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(s==0 || *s!='$')		{			LOG(L_ERR,"ERROR:avpops:fixup_write_avp: bad attribute name"				" in param 2 <%s>\n", s);			return E_UNSPEC;		}				/* is variable */		ap = avpops_parse_pvar(s, 			XL_THROW_ERROR|XL_DISABLE_MULTI|XL_DISABLE_COLORS);		if (ap==0)		{			LOG(L_ERR,"ERROR:avpops:fixup_write_avp: unable to get"					" pseudo-variable in param 2 [%s]\n", s);			return E_OUT_OF_MEM;		}		if (ap->sval.type!=XL_AVP)		{			LOG(L_ERR,"ERROR:avops:fixup_write_avp: bad param 2 [%s]; "				"expected : $avp(name)\n", s);			return E_UNSPEC;		}	}	*param=(void*)ap;	return 0;}static int fixup_delete_avp(void** param, int param_no){	struct fis_param *ap=NULL;	char *p;	char *s;	unsigned int flags;	str s0;	s = (char*)(*param);	if (param_no==1) {		/* attribute name / alias */		if ( (p=strchr(s,'/'))!=0 )			*(p++)=0;				if(*s=='$')		{			/* is variable */			ap = avpops_parse_pvar(s, 				XL_THROW_ERROR|XL_DISABLE_MULTI|XL_DISABLE_COLORS);			if (ap==0)			{				LOG(L_ERR,"ERROR:avpops:fixup_delete_avp: unable to get"					" pseudo-variable in param \n");				return E_UNSPEC;			}			if (ap->sval.type!=XL_AVP)			{				LOG(L_ERR,"ERROR:avops:fixup_delete_avp: bad param; "					"expected : $avp(name)\n");				return E_UNSPEC;			}			ap->opd|=AVPOPS_VAL_PVAR;		} else {			if(strlen(s)<1)			{				LOG(L_ERR,"ERROR:avops:parse_avp_db: bad param - "					"expected : $avp(name), *, s or i value\n");				return E_UNSPEC;			}			ap = (struct fis_param*)pkg_malloc(sizeof(struct fis_param));			if (ap==0)			{				LOG(L_ERR,"ERROR:avpops:fixup_delete_avp: no more "					"pkg mem\n");				return E_OUT_OF_MEM;			}			memset(ap, 0, sizeof(struct fis_param));			ap->opd|=AVPOPS_VAL_NONE;			switch(*s) {				case 's': case 'S':					ap->opd = AVPOPS_VAL_NONE|AVPOPS_VAL_STR;				break;				case 'i': case 'I':					ap->opd = AVPOPS_VAL_NONE|AVPOPS_VAL_INT;				break;				case '*': case 'a': case 'A':					ap->opd = AVPOPS_VAL_NONE;				break;				default:					LOG(L_ERR,"ERROR:avpops:fixup_delete_avp: bad param - "						"expected : *, s or i AVP flag\n");					pkg_free(ap);					return E_UNSPEC;			}			/* flags */			flags = 0;			if(*(s+1)!='\0')			{				s0.s = s+1;				s0.len = strlen(s0.s);				if(str2int(&s0, &flags)!=0)				{					LOG(L_ERR,					"ERROR:avpops:fixup_delete_avp: error - bad avp flags\n");					pkg_free(ap);					return E_UNSPEC;				}			}			ap->sval.flags |= flags<<24;		}		/* flags */		for( ; p&&*p ; p++ )		{			switch (*p)			{				case 'g':				case 'G':					ap->ops|=AVPOPS_FLAG_ALL;					break;				default:					LOG(L_ERR,"ERROR:avpops:fixup_delete_avp: bad flag "						"<%c>\n",*p);					if(ap!=NULL)						pkg_free(ap);					return E_UNSPEC;			}		}		/* force some flags: if no avp name is given, force "all" flag */		if (ap->opd&AVPOPS_VAL_NONE)			ap->ops |= AVPOPS_FLAG_ALL;		*param=(void*)ap;	}	return 0;}static int fixup_copy_avp(void** param, int param_no){	struct fis_param *ap;	char *s;	char *p;	s = (char*)*param;	ap = 0;	p = 0;	if (param_no==2)	{		/* avp / flags */		if ( (p=strchr(s,'/'))!=0 )			*(p++)=0;	}	ap = avpops_parse_pvar(s, 			XL_THROW_ERROR|XL_DISABLE_MULTI|XL_DISABLE_COLORS);	if (ap==0)	{		LOG(L_ERR,"ERROR:avpops:fixup_copy_avp: unable to get"				" pseudo-variable in P%d\n", param_no);		return E_OUT_OF_MEM;	}	/* attr name is mandatory */	if (ap->sval.type!=XL_AVP)	{		LOG(L_ERR,"ERROR:avpops:fixup_copy_avp: you must specify "			"only AVP as parameter\n");		return E_UNSPEC;	}	if (param_no==2)	{		/* flags */		for( ; p&&*p ; p++ )		{			switch (*p) {				case 'g':				case 'G':					ap->ops|=AVPOPS_FLAG_ALL;					break;				case 'd':				case 'D':					ap->ops|=AVPOPS_FLAG_DELETE;					break;				case 'n':				case 'N':					ap->ops|=AVPOPS_FLAG_CASTN;					break;				case 's':				case 'S':					ap->ops|=AVPOPS_FLAG_CASTS;					break;				default:					LOG(L_ERR,"ERROR:avpops:fixup_copy_avp: bad flag "						"<%c>\n",*p);					return E_UNSPEC;			}		}	}	*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!='$')		{			LOG(L_ERR,"ERROR:avops:fixup_pushto_avp: bad param 1; expected : "				"$ru $du ...\n");			return E_UNSPEC;		}		/* compose the param structure */		if ( (p=strchr(s,'/'))!=0 )			*(p++)=0;		ap = avpops_parse_pvar(s, 			XL_THROW_ERROR|XL_DISABLE_MULTI|XL_DISABLE_COLORS);		if (ap==0)		{			LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: unable to get"					" pseudo-variable in param 1\n");			return E_OUT_OF_MEM;		}		switch(ap->sval.type) {			case XL_RURI:				ap->opd = AVPOPS_VAL_NONE|AVPOPS_USE_RURI;				if ( p && !(					(!strcasecmp("username",p)							&& (ap->opd|=AVPOPS_FLAG_USER0)) ||					(!strcasecmp("domain",p)							&& (ap->opd|=AVPOPS_FLAG_DOMAIN0)) ))				{					LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: unknown "						" ruri flag \"%s\"!\n",p);					return E_UNSPEC;				}			break;			case XL_DSTURI:				if ( p!=0 )				{					LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: unknown "						" duri flag \"%s\"!\n",p);					return E_UNSPEC;				}				ap->opd = AVPOPS_VAL_NONE|AVPOPS_USE_DURI;			break;			case XL_HDR:				/* what's the hdr destination ? request or reply? */				LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: push to header "						" is obsoleted - use append_hf() or append_to_reply()"						" from textops module!\n");				return E_UNSPEC;			break;			case XL_BRANCH:				if ( p!=0 )				{					LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: unknown "						" branch flag \"%s\"!\n",p);					return E_UNSPEC;				}				ap->opd = AVPOPS_VAL_NONE|AVPOPS_USE_BRANCH;			break;			default:				LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: unsupported "					" destination \"%s\"; expected $ru,$du,$br\n",s);				return E_UNSPEC;		}	} else if (param_no==2) {		/* attribute name*/		if ( *s!='$')		{			LOG(L_ERR,"ERROR:avops:fixup_pushto_avp: bad param 1; expected : "				"$pseudo-variable ...\n");			return E_UNSPEC;		}		/* compose the param structure */		if ( (p=strchr(s,'/'))!=0 )			*(p++)=0;		ap = avpops_parse_pvar(s, 			XL_THROW_ERROR|XL_DISABLE_COLORS);		if (ap==0)		{			LOG(L_ERR,"ERROR:avpops:fixup_pudhto_avp: unable to get"					" pseudo-variable in param 2\n");			return E_OUT_OF_MEM;		}		if (ap->sval.type==XL_NULL)		{			LOG(L_ERR,"ERROR:avops:fixup_pushto_avp: bad param 2; "				"expected : $pseudo-variable ...\n");			pkg_free(ap);			return E_UNSPEC;		}		ap->opd |= AVPOPS_VAL_PVAR;		/* flags */		for( ; p&&*p ; p++ )		{			switch (*p) {				case 'g':				case 'G':					ap->ops|=AVPOPS_FLAG_ALL;					break;				default:					LOG(L_ERR,"ERROR:avpops:fixup_pushto_avp: bad flag "						"<%c>\n",*p);					pkg_free(ap);					return E_UNSPEC;			}		}	}	*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)	{		ap = avpops_parse_pvar(s, 			XL_THROW_ERROR|XL_DISABLE_MULTI|XL_DISABLE_COLORS);		if (ap==0)		{			LOG(L_ERR,"ERROR:avpops:fixup_check_avp: unable to get"					" pseudo-variable in P1\n");			return E_OUT_OF_MEM;		}		/* attr name is mandatory */		if (ap->sval.type==XL_NULL)		{			LOG(L_ERR,				"ERROR:avpops:fixup_check_avp: NULL pseudo-variable in P1\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->ops&AVPOPS_OP_RE)		{			if ( (ap->opd&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->sval.p.val.len, ap->sval.p.val.s);			if (regcomp(re, ap->sval.p.val.s,						REG_EXTENDED|REG_ICASE|REG_NEWLINE))			{				pkg_free(re);				LOG(L_ERR,"ERROR:avpops:fixip_check_avp: bad re <%.*s>\n",					ap->sval.p.val.len, ap->sval.p.val.s);				return E_BAD_RE;			}			/* free the string and link the regexp */			// pkg_free(ap->sval.p.s);			ap->sval.p.val.s = (char*)re;		} else if (ap->ops&AVPOPS_OP_FM) {			if ( !( ap->opd&AVPOPS_VAL_PVAR ||			(!(ap->opd&AVPOPS_VAL_PVAR) && ap->opd&AVPOPS_VAL_STR) ) )			{				LOG(L_ERR,"ERROR:avpops:fixup_check_avp: fast_match operation "					"requires string value or avp name/alias (%d/%d)\n",					ap->opd, ap->ops);				return E_UNSPEC;			}		}	}	*param=(void*)ap;

⌨️ 快捷键说明

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