📄 avpops.c
字号:
{ 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 + -