rem: switch(e->l.operand){ case METHOD_O: ret=comp_strstr(&msg->first_line.u.request.method, e->r.param, e->op, e->subtype); break; case URI_O: if(msg->new_uri.s){ if (e->subtype==MYSELF_ST){ if (parse_sip_msg_uri(msg)<0) ret=-1; else	ret=check_self_op(e->op, &msg->parsed_uri.host, msg->parsed_uri.port_no? msg->parsed_uri.port_no:SIP_PORT); }else{ ret=comp_strstr(&msg->new_uri, e->r.param, e->op, e->subtype); } }else{ if (e->subtype==MYSELF_ST){ if (parse_sip_msg_uri(msg)<0) ret=-1; else	ret=check_self_op(e->op, &msg->parsed_uri.host, msg->parsed_uri.port_no? msg->parsed_uri.port_no:SIP_PORT); }else{ ret=comp_strstr(&msg->first_line.u.request.uri, e->r.param, e->op, e->subtype); } } break; case FROM_URI_O: if (parse_from_header(msg)!=0){ LOG(L_ERR, "ERROR: eval_elem: bad or missing" " From: header\n"); goto error; } if (e->subtype==MYSELF_ST){ if (parse_uri(get_from(msg)->uri.s, get_from(msg)->uri.len, &uri) < 0){ LOG(L_ERR, "ERROR: eval_elem: bad uri in From:\n"); goto error; } ret=check_self_op(e->op, &uri.host, uri.port_no?uri.port_no:SIP_PORT); }else{ ret=comp_strstr(&get_from(msg)->uri, e->r.param, e->op, e->subtype); } break; case TO_URI_O: if ((msg->to==0) && ((parse_headers(msg, HDR_TO_F, 0)==-1) || (msg->to==0))){ LOG(L_ERR, "ERROR: eval_elem: bad or missing" " To: header\n"); goto error; }  if (e->subtype==MYSELF_ST){ if (parse_uri(get_to(msg)->uri.s, get_to(msg)->uri.len, &uri) < 0){ LOG(L_ERR, "ERROR: eval_elem: bad uri in To:\n"); goto error; } ret=check_self_op(e->op, &uri.host, uri.port_no?uri.port_no:SIP_PORT); }else{ ret=comp_strstr(&get_to(msg)->uri, e->r.param, e->op, e->subtype); } break; case SRCIP_O: ret=comp_ip(&msg->rcv.src_ip, e->r.param, e->op, e->subtype); break; case DSTIP_O: ret=comp_ip(&msg->rcv.dst_ip, e->r.param, e->op, e->subtype); break; case NUMBER_O: ret=!(!e->r.intval);  break; case ACTION_O: ret=run_actions( (struct action*)e->r.param, msg); if (ret<=0) ret=(ret==0)?EXPR_DROP:0; else ret=1; break; case SRCPORT_O: ret=comp_no(msg->rcv.src_port, e->r.param,  e->op,  e->subtype ); break; case DSTPORT_O: ret=comp_no(msg->rcv.dst_port, e->r.param, e->op, e->subtype); break; case PROTO_O: ret=comp_no(msg->rcv.proto, e->r.param, e->op, e->subtype); break; case AF_O: ret=comp_no(msg->rcv.src_ip.af, e->r.param, e->op, e->subtype); break; case MSGLEN_O: ret=comp_no(msg->len, e->r.param, e->op, e->subtype); break; default: LOG(L_CRIT, "BUG: eval_elem: invalid operand %d\n", e->l.operand);
add: switch(e->l_type){ case METHOD_O: ret=comp_str(e->op, &msg->first_line.u.request.method, e->r_type, &e->r); break; case URI_O: if(msg->new_uri.s) { if (e->r_type==MYSELF_ST){ if (parse_sip_msg_uri(msg)<0) ret=-1; else ret=check_self_op(e->op, &msg->parsed_uri.host, msg->parsed_uri.port_no? msg->parsed_uri.port_no:SIP_PORT); }else{ ret=comp_str(e->op, &msg->new_uri, e->r_type, &e->r); } }else{ if (e->r_type==MYSELF_ST){ if (parse_sip_msg_uri(msg)<0) ret=-1; else ret=check_self_op(e->op, &msg->parsed_uri.host, msg->parsed_uri.port_no? msg->parsed_uri.port_no:SIP_PORT); }else{ ret=comp_str(e->op, &msg->first_line.u.request.uri, e->r_type, &e->r); } } break;  case FROM_URI_O: if (parse_from_header(msg)!=0){ LOG(L_ERR, "ERROR: eval_elem: bad or missing" " From: header\n"); goto error; } if (e->r_type==MYSELF_ST){ if (parse_uri(get_from(msg)->uri.s, get_from(msg)->uri.len, &uri) < 0){ LOG(L_ERR, "ERROR: eval_elem: bad uri in From:\n"); goto error; } ret=check_self_op(e->op, &uri.host, uri.port_no?uri.port_no:SIP_PORT); }else{ ret=comp_str(e->op, &get_from(msg)->uri, e->r_type, &e->r); } break;  case TO_URI_O: if ((msg->to==0) && ((parse_headers(msg, HDR_TO_F, 0)==-1) || (msg->to==0))){ LOG(L_ERR, "ERROR: eval_elem: bad or missing" " To: header\n"); goto error; }  if (e->r_type==MYSELF_ST){ if (parse_uri(get_to(msg)->uri.s, get_to(msg)->uri.len, &uri) < 0){ LOG(L_ERR, "ERROR: eval_elem: bad uri in To:\n"); goto error; } ret=check_self_op(e->op, &uri.host, uri.port_no?uri.port_no:SIP_PORT); }else{ ret=comp_str(e->op, &get_to(msg)->uri, e->r_type, &e->r); } break;  case SRCIP_O: ret=comp_ip(e->op, &msg->rcv.src_ip, e->r_type, &e->r); break;  case DSTIP_O: ret=comp_ip(e->op, &msg->rcv.dst_ip, e->r_type, &e->r); break;  case NUMBER_O: ret=!(!e->r.intval);  break;  case ACTION_O: ret=run_actions( (struct action*)e->r.param, msg); if (ret<=0) ret=(ret==0)?EXPR_DROP:0; else ret=1; break;  case SRCPORT_O: ret=comp_num(e->op, (int)msg->rcv.src_port, e->r_type, &e->r); break;  case DSTPORT_O: ret=comp_num(e->op, (int)msg->rcv.dst_port, e->r_type, &e->r); break;  case PROTO_O: ret=comp_num(e->op, msg->rcv.proto, e->r_type, &e->r); break;  case AF_O: ret=comp_num(e->op, (int)msg->rcv.src_ip.af, e->r_type, &e->r); break;  case MSGLEN_O: ret=comp_num(e->op, (int)msg->len, e->r_type, &e->r); break;  case AVP_ST: ret = comp_avp(e->op, e->l.attr, e->r_type, &e->r); break;  default: LOG(L_CRIT, "BUG: eval_elem: invalid operand %d\n", e->l_type);
context: static int eval_elem(struct expr* e, struct sip_msg* msg){	struct sip_uri uri;	int ret;	ret=E_BUG;		if (e->type!=ELEM_T){		LOG(L_CRIT," BUG: eval_elem: invalid type\n");		goto error;	}	switch(e->l.operand){		case METHOD_O:				ret=comp_strstr(&msg->first_line.u.request.method, e->r.param,								e->op, e->subtype);				break;		case URI_O:				if(msg->new_uri.s){					if (e->subtype==MYSELF_ST){						if (parse_sip_msg_uri(msg)<0) ret=-1;						else	ret=check_self_op(e->op, &msg->parsed_uri.host,									msg->parsed_uri.port_no?									msg->parsed_uri.port_no:SIP_PORT);					}else{						ret=comp_strstr(&msg->new_uri, e->r.param,										e->op, e->subtype);					}				}else{					if (e->subtype==MYSELF_ST){						if (parse_sip_msg_uri(msg)<0) ret=-1;						else	ret=check_self_op(e->op, &msg->parsed_uri.host,									msg->parsed_uri.port_no?									msg->parsed_uri.port_no:SIP_PORT);					}else{						ret=comp_strstr(&msg->first_line.u.request.uri,										 e->r.param, e->op, e->subtype);					}				}				break;		case FROM_URI_O:				if (parse_from_header(msg)!=0){					LOG(L_ERR, "ERROR: eval_elem: bad or missing"								" From: header\n");					goto error;				}				if (e->subtype==MYSELF_ST){					if (parse_uri(get_from(msg)->uri.s, get_from(msg)->uri.len,									&uri) < 0){						LOG(L_ERR, "ERROR: eval_elem: bad uri in From:\n");						goto error;					}					ret=check_self_op(e->op, &uri.host,										uri.port_no?uri.port_no:SIP_PORT);				}else{					ret=comp_strstr(&get_from(msg)->uri,							e->r.param, e->op, e->subtype);				}				break;		case TO_URI_O:				if ((msg->to==0) && ((parse_headers(msg, HDR_TO_F, 0)==-1) ||							(msg->to==0))){					LOG(L_ERR, "ERROR: eval_elem: bad or missing"								" To: header\n");					goto error;				}				/* to content is parsed automatically */				if (e->subtype==MYSELF_ST){					if (parse_uri(get_to(msg)->uri.s, get_to(msg)->uri.len,									&uri) < 0){						LOG(L_ERR, "ERROR: eval_elem: bad uri in To:\n");						goto error;					}					ret=check_self_op(e->op, &uri.host,										uri.port_no?uri.port_no:SIP_PORT);				}else{					ret=comp_strstr(&get_to(msg)->uri,										e->r.param, e->op, e->subtype);				}				break;		case SRCIP_O:				ret=comp_ip(&msg->rcv.src_ip, e->r.param, e->op, e->subtype);				break;		case DSTIP_O:				ret=comp_ip(&msg->rcv.dst_ip, e->r.param, e->op, e->subtype);				break;		case NUMBER_O:				ret=!(!e->r.intval); /* !! to transform it in {0,1} */				break;		case ACTION_O:				ret=run_actions( (struct action*)e->r.param, msg);				if (ret<=0) ret=(ret==0)?EXPR_DROP:0;				else ret=1;				break;		case SRCPORT_O:				ret=comp_no(msg->rcv.src_port, 					e->r.param, /* e.g., 5060 */					e->op, /* e.g. == */					e->subtype /* 5060 is number */);				break;		case DSTPORT_O:				ret=comp_no(msg->rcv.dst_port, e->r.param, e->op, 							e->subtype);				break;		case PROTO_O:				ret=comp_no(msg->rcv.proto, e->r.param, e->op, e->subtype);				break;		case AF_O:				ret=comp_no(msg->rcv.src_ip.af, e->r.param, e->op, e->subtype);				break;		case MSGLEN_O:				ret=comp_no(msg->len, e->r.param, e->op, e->subtype);				break;		default:				LOG(L_CRIT, "BUG: eval_elem: invalid operand %d\n",							e->l.operand);	}	return ret;error:	return -1;}