Ejemplo n.º 1
0
Archivo: avp.c Proyecto: 2pac/kamailio
/* 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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
Archivo: avp.c Proyecto: 2pac/kamailio
/*
 * 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;
}