/* fixes an attribute containing xl formatted string to pure string runtime */ static int xlfix_attr(struct sip_msg* msg, char* p1, char* p2) { avp_t* avp; avp_ident_t* avpid; avp_value_t val; xl_elog_t* format=NULL; int ret=-1; avpid = &((fparam_t*)p1)->v.avp; /* search the AVP */ avp = search_avp(*avpid, &val, 0); if (!avp) { DBG("xlfix_attr: AVP does not exist\n"); goto error; } if ((avp->flags & AVP_VAL_STR) == 0) { DBG("xlfix_attr: Not a string AVP\n"); goto error; } /* parse the xl syntax -- AVP values are always zero-terminated */ if (xl_parse(val.s.s, &format)<0) { LOG(L_ERR, "ERROR: xlfix_attr: wrong format[%s]\n", val.s.s); goto error; } if (xl_printstr(msg, format, &val.s.s, &val.s.len) > 0) { /* we must delete and re-add the AVP again */ destroy_avp(avp); if (add_avp(avpid->flags | AVP_VAL_STR, avpid->name, val)) { ERR("xlfix_attr:Error adding new AVP\n"); goto error; } /* everything went OK */ ret = 1; } error: /* free the parsed xl expression */ if (format) xl_free(format); return ret; }
static int parse_xlstr(struct xlstr* s) { if (!s->s) return 0; if (!strchr(s->s, '%')) return 0; /* probably xl_log formatting */ if (!xl_print) { xl_print=(xl_print_log_f*)find_export("xprint", NO_SCRIPT, 0); if (!xl_print) { ERR(MODULE_NAME": cannot find \"xprint\", is module xprint loaded?\n"); return E_UNSPEC; } } if (!xl_parse) { xl_parse=(xl_parse_format_f*)find_export("xparse", NO_SCRIPT, 0); if (!xl_parse) { ERR(MODULE_NAME": cannot find \"xparse\", is module xprint loaded?\n"); return E_UNSPEC; } } if (!xl_nul) { xl_getnul=(xl_get_nulstr_f*)find_export("xnulstr", NO_SCRIPT, 0); if (xl_getnul) xl_nul=xl_getnul(); if (!xl_nul){ ERR(MODULE_NAME": cannot find \"xnulstr\", is module xprint loaded?\n"); return E_UNSPEC; } else INFO(MODULE_NAME": xprint null is \"%.*s\"\n", xl_nul->len, xl_nul->s); } if(xl_parse(s->s, &s->xlfmt) < 0) { ERR(MODULE_NAME": wrong format '%s'\n", s->s); return E_UNSPEC; } return 0; }
/* * Convert xl format string to xl format description */ static int fixup_xl_1(void** param, int param_no) { xl_elog_t* model; if (get_xl_functions()) return -1; if (param_no == 1) { if(*param) { if(xl_parse((char*)(*param), &model)<0) { LOG(L_ERR, "ERROR: xl_fixup: wrong format[%s]\n", (char*)(*param)); return E_UNSPEC; } *param = (void*)model; return 0; } else { LOG(L_ERR, "ERROR: xl_fixup: null format\n"); return E_UNSPEC; } } return 0; }