struct fis_param* parse_op_value(char *s) { struct fis_param *vp; int ops; int opd; char *p; char *t; int len; ops = 0; opd = 0; vp = 0; if ( (p=strchr(s,'/'))==0 || (p-s!=2&&p-s!=3) ) goto parse_error; /* get the operation */ if (strncasecmp(s,"add",3)==0) { ops |= AVPOPS_OP_ADD; } else if (strncasecmp(s,"sub",3)==0) { ops |= AVPOPS_OP_SUB; } else if (strncasecmp(s,"mul",3)==0) { ops |= AVPOPS_OP_MUL; } else if (strncasecmp(s,"div",3)==0) { ops |= AVPOPS_OP_DIV; } else if (strncasecmp(s,"mod",3)==0) { ops |= AVPOPS_OP_MOD; } else if (strncasecmp(s,"and",3)==0) { ops |= AVPOPS_OP_BAND; } else if (strncasecmp(s,"or",2)==0) { ops |= AVPOPS_OP_BOR; } else if (strncasecmp(s,"xor",3)==0) { ops |= AVPOPS_OP_BXOR; } else if (strncasecmp(s,"not",3)==0) { ops |= AVPOPS_OP_BNOT; } else { LM_ERR("unknown operation <%.*s>\n",2,s); goto error; } /* get the value */ if (*(++p)==0) goto parse_error; if ( (t=strchr(p,'/'))==0) len = strlen(p); else len = t-p; if (*p=='$') { /* is variable */ vp = avpops_parse_pvar(p); if (vp==0) { LM_ERR("unable to get pseudo-variable\n"); goto error; } if (vp->u.sval.type==PVT_NULL) { LM_ERR("bad param; expected : $pseudo-variable or int/str value\n"); goto error; } opd |= AVPOPS_VAL_PVAR; LM_DBG("flag==%d/%d\n", opd, ops); } else { /* value is explicitly given */ if ( (vp=parse_intstr_value(p,len))==0) { LM_ERR("unable to parse value\n"); goto error; } if((vp->opd&AVPOPS_VAL_INT)==0) { LM_ERR("value must be int\n"); goto error; } } /* any flags */ p = t; if (p!=0 && *p!=0 ) { if (*p!='/' || *(++p)==0) goto parse_error; while (*p) { switch (*p) { case 'g': case 'G': ops|=AVPOPS_FLAG_ALL; break; case 'd': case 'D': ops|=AVPOPS_FLAG_DELETE; break; default: LM_ERR("unknown flag <%c>\n",*p); goto error; } p++; } } vp->ops |= ops; vp->opd |= opd; return vp; parse_error: LM_ERR("parse error in <%s> pos %ld\n", s,(long)(p-s)); error: if (vp) pkg_free(vp); return 0; }
static int fixup_write_avp(void** param, int param_no) { struct hdr_field hdr; struct fis_param *ap; int flags; int len; 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|hdr] 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)) || (!strcasecmp( "dst_ip", s) && (flags|=AVPOPS_USE_DST_IP)) || (!strncasecmp( "hdr", s, 3) && (flags|=AVPOPS_USE_HDRREQ)) ) { 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|AVPOPS_USE_DST_IP|AVPOPS_USE_HDRREQ))==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; } if (flags&AVPOPS_USE_HDRREQ) { len = strlen(s); if (len<6 || s[3]!='[' || s[len-1]!=']') { LOG(L_ERR,"ERROR:avpops:fixup_write_avp: invalid hdr " "specificatoin \"%s\"\n",s); return E_UNSPEC; } s[len-1] = ':'; /* parse header name */ if (parse_hname2( s+4, s+len, &hdr)==0) { LOG(L_ERR,"BUG:avpops:fixup_write_avp: parse header " "failed\n"); return E_UNSPEC; } if (hdr.type==HDR_OTHER_T) { /* duplicate hdr name */ len -= 5; /*hdr[]*/ ap->val.s.s = pkg_malloc(len+1); if (ap->val.s.s==0) { LOG(L_ERR,"ERROR:avpops:fixup_write_avp: no more " "pkg mem\n"); return E_OUT_OF_MEM; } ap->val.s.len = len; memcpy( ap->val.s.s, s+4, len); ap->val.s.s[len] = 0; DBG("DEBUF:avpops:fixup_write_avp: hdr=<%s>\n", ap->val.s.s); } else { ap->val.n = hdr.type; flags |= AVPOPS_VAL_INT; } } 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; }
struct fis_param* parse_check_value(char *s) { struct fis_param *vp; int ops; int opd; char *p; char *t; int len; ops = 0; opd = 0; vp = 0; if ( (p=strchr(s,'/'))==0 || (p-s!=2&&p-s!=3) ) goto parse_error; /* get the operation */ if (strncasecmp(s,"eq",2)==0) { ops |= AVPOPS_OP_EQ; } else if (strncasecmp(s,"ne",2)==0) { ops |= AVPOPS_OP_NE; } else if (strncasecmp(s,"lt",2)==0) { ops |= AVPOPS_OP_LT; } else if (strncasecmp(s,"le",2)==0) { ops |= AVPOPS_OP_LE; } else if (strncasecmp(s,"gt",2)==0) { ops |= AVPOPS_OP_GT; } else if (strncasecmp(s,"ge",2)==0) { ops |= AVPOPS_OP_GE; } else if (strncasecmp(s,"re",2)==0) { ops |= AVPOPS_OP_RE; } else if (strncasecmp(s,"fm",2)==0) { ops |= AVPOPS_OP_FM; } else if (strncasecmp(s,"and",3)==0) { ops |= AVPOPS_OP_BAND; } else if (strncasecmp(s,"or",2)==0) { ops |= AVPOPS_OP_BOR; } else if (strncasecmp(s,"xor",3)==0) { ops |= AVPOPS_OP_BXOR; } else { LM_ERR("unknown operation <%.*s>\n",2,s); goto error; } /* get the value */ if (*(++p)==0) goto parse_error; if ( (t=strchr(p,'/'))==0) len = strlen(p); else len = t-p; if (*p=='$') { /* is variable */ vp = avpops_parse_pvar(p); if (vp==0) { LM_ERR("unable to get pseudo-variable\n"); goto error; } if (vp->u.sval.type==PVT_NULL) { LM_ERR("bad param; expected : $pseudo-variable or int/str value\n"); goto error; } opd |= AVPOPS_VAL_PVAR; LM_DBG("flag==%d/%d\n", opd, ops); } else { /* value is explicitly given */ if ( (vp=parse_intstr_value(p,len))==0) { LM_ERR("unable to parse value\n"); goto error; } } p = t; /* any flags */ if (p!=NULL && *p!=0) { if (*p!='/' || *(++p)==0) goto parse_error; while (*p) { switch (*p) { case 'g': case 'G': ops|=AVPOPS_FLAG_ALL; break; case 'i': case 'I': ops|=AVPOPS_FLAG_CI; break; default: LM_ERR("unknown flag <%c>\n",*p); goto error; } p++; } } vp->ops |= ops; vp->opd |= opd; return vp; parse_error: LM_ERR("parse error in <%s> pos %ld\n", s,(long)(p-s)); error: if (vp) pkg_free(vp); return 0; }
struct fis_param* parse_check_value(char *s) { struct fis_param *vp; int flags; char *p; char *t; int len; int type; str alias; flags = 0; vp = 0; if ( (p=strchr(s,'/'))==0 || p-s!=2 ) goto parse_error; /* get the operation */ if (strncasecmp(s,"eq",2)==0) { flags |= AVPOPS_OP_EQ; } else if (strncasecmp(s,"lt",2)==0) { flags |= AVPOPS_OP_LT; } else if (strncasecmp(s,"gt",2)==0) { flags |= AVPOPS_OP_GT; } else if (strncasecmp(s,"re",2)==0) { flags |= AVPOPS_OP_RE; } else if (strncasecmp(s,"fm",2)==0) { flags |= AVPOPS_OP_FM; } else { LOG(L_ERR,"ERROR:avpops:parse_check_value: unknown operation " "<%.*s>\n",2,s); goto error; } /* get the value */ if (*(++p)==0) goto parse_error; if ( (t=strchr(p,'/'))==0) len = strlen(p); else len = t-p; if (*p=='$') { if (*(++p)==0 || (--len)==0) goto parse_error; /* struct for value */ vp = (struct fis_param*)pkg_malloc(sizeof(struct fis_param)); if (vp==0) { LOG(L_ERR,"ERROR:avpops:parse_check_value: no more pkg mem\n"); goto error; } memset( vp, 0, sizeof(struct fis_param)); /* variable -> which one? */ if ( (strncasecmp(p,"ruri" ,len)==0 && (flags|=AVPOPS_USE_RURI)) || (strncasecmp(p,"from" ,len)==0 && (flags|=AVPOPS_USE_FROM)) || (strncasecmp(p,"to" ,len)==0 && (flags|=AVPOPS_USE_TO)) || (strncasecmp(p,"src_ip",len)==0 && (flags|=AVPOPS_USE_SRC_IP)) || (strncasecmp(p,"dst_ip",len)==0 && (flags|=AVPOPS_USE_DST_IP))) { flags |= AVPOPS_VAL_NONE; } else { alias.s = p; alias.len = len; if ( lookup_avp_galias( &alias, &type, &vp->val)!=0 ) { LOG(L_ERR,"ERROR:avpops:parse_check_value: unknown " "variable/alias <%.*s>\n",len,p); goto error; } flags |= AVPOPS_VAL_AVP | ((type&AVP_NAME_STR)?AVPOPS_VAL_STR:AVPOPS_VAL_INT); DBG("flag==%d\n",flags); } p += len; } else { /* value is explicitly given */ if ( (vp=parse_intstr_value(p,len))==0) { LOG(L_ERR,"ERROR:avpops:parse_check_value: unable to " "parse value\n"); goto error; } /* go over */ p += len; } /* any flags */ if (*p!=0 ) { if (*p!='/' || *(++p)==0) goto parse_error; while (*p) { switch (*p) { case 'g': case 'G': flags|=AVPOPS_FLAG_ALL; break; case 'i': case 'I': flags|=AVPOPS_FLAG_CI; break; default: LOG(L_ERR,"ERROR:avpops:parse_check_value: unknown flag " "<%c>\n",*p); goto error; } p++; } } vp->flags |= flags; return vp; parse_error: LOG(L_ERR,"ERROR:avpops:parse_check_value: parse error in <%s> pos %ld\n", s,(long)(p-s)); error: if (vp) pkg_free(vp); return 0; }