static int w_get_profile_size(struct sip_msg *msg, char *profile, char *value, char *result) { pv_elem_t *pve; str val_s; pv_spec_t *sp_dest; unsigned int size; int_str res; int avp_name; unsigned short avp_type; script_var_t * sc_var; pve = (pv_elem_t *)value; sp_dest = (pv_spec_t *)result; if ( pve!=NULL && ((struct dlg_profile_table*)profile)->has_value) { if ( pv_printf_s(msg, pve, &val_s)!=0 || val_s.len == 0 || val_s.s == NULL) { LM_WARN("cannot get string for value\n"); return -1; } size = get_profile_size( (struct dlg_profile_table*)profile ,&val_s ); } else { size = get_profile_size( (struct dlg_profile_table*)profile, NULL ); } switch (sp_dest->type) { case PVT_AVP: if (pv_get_avp_name( msg, &(sp_dest->pvp), &avp_name, &avp_type)!=0){ LM_CRIT("BUG in getting AVP name\n"); return -1; } res.n = size; if (add_avp(avp_type, avp_name, res)<0){ LM_ERR("cannot add AVP\n"); return -1; } break; case PVT_SCRIPTVAR: if(sp_dest->pvp.pvn.u.dname == 0){ LM_ERR("cannot find svar name\n"); return -1; } res.n = size; sc_var = (script_var_t *)sp_dest->pvp.pvn.u.dname; if(!set_var_value(sc_var, &res, 0)){ LM_ERR("cannot set svar\n"); return -1; } break; default: LM_CRIT("BUG: invalid pvar type\n"); return -1; } return 1; }
/*! * \brief Helper function that outputs the size of a given profile via the RPC interface * \see rpc_profile_get_size * \see rpc_profile_w_value_get_size * \param rpc RPC node that should be filled * \param c RPC void pointer * \param profile_name the given profile * \param value the given profile value */ static void internal_rpc_profile_get_size(rpc_t *rpc, void *c, str *profile_name, str *value) { unsigned int size; dlg_profile_table_t *profile; profile = search_dlg_profile( profile_name ); if (!profile) { rpc->printf(c, "Non existing profile:%.*s", profile_name->len, profile_name->s); return; } size = get_profile_size(profile, value); if (value) { rpc->printf(c, "Profile:%.*s => profile:%.*s value:%.*s count:%u", profile_name->len, profile_name->s, profile->name.len, profile->name.s, value->len, value->s, size); return; } else { rpc->printf(c, "Profile:%.*s => profile:%.*s value: count:%u", profile_name->len, profile_name->s, profile->name.len, profile->name.s, size); return; } return; }
/** * get dynamic name profile size */ static int w_get_profile_size3(struct sip_msg *msg, char *profile, char *value, char *result) { pv_elem_t *pve; str val_s; pv_spec_t *sp_dest; unsigned int size; pv_value_t val; if(result!=NULL) { pve = (pv_elem_t *)value; sp_dest = (pv_spec_t *)result; } else { pve = NULL; sp_dest = (pv_spec_t *)value; } if ( pve!=NULL && ((struct dlg_profile_table*)profile)->has_value) { if ( pv_printf_s(msg, pve, &val_s)!=0 || val_s.len == 0 || val_s.s == NULL) { LM_WARN("cannot get string for value\n"); return -1; } size = get_profile_size( (struct dlg_profile_table*)profile, &val_s ); } else { size = get_profile_size( (struct dlg_profile_table*)profile, NULL ); } memset(&val, 0, sizeof(pv_value_t)); val.flags = PV_VAL_INT|PV_TYPE_INT; val.ri = (int)size; if(sp_dest->setf(msg, &sp_dest->pvp, (int)EQ_T, &val)<0) { LM_ERR("setting profile PV failed\n"); return -1; } return 1; }
/*! * \brief Helper function that outputs the size of a given profile via the RPC interface * \see rpc_profile_get_size * \see rpc_profile_w_value_get_size * \param rpc RPC node that should be filled * \param c RPC void pointer * \param profile_name the given profile * \param value the given profile value */ static void internal_rpc_profile_get_size(rpc_t *rpc, void *c, str *profile_name, str *value) { unsigned int size; dlg_profile_table_t *profile; profile = search_dlg_profile( profile_name ); if (!profile) { rpc->fault(c, 404, "Profile not found: %.*s", profile_name->len, profile_name->s); return; } size = get_profile_size(profile, value); rpc->add(c, "d", size); return; }
/*! * \brief Output a profile via MI interface * \param cmd_tree MI command tree * \param param unused * \return MI root output on success, NULL on failure */ struct mi_root * mi_get_profile(struct mi_root *cmd_tree, void *param) { struct mi_node* node; struct mi_root* rpl_tree= NULL; struct mi_node* rpl = NULL; struct mi_attr* attr; struct dlg_profile_table *profile; str *value; str *profile_name; unsigned int size; int len; char *p; node = cmd_tree->node.kids; if (node==NULL || !node->value.s || !node->value.len) return init_mi_tree( 400, MI_SSTR(MI_MISSING_PARM)); profile_name = &node->value; if (node->next) { node = node->next; if (!node->value.s || !node->value.len) return init_mi_tree( 400, MI_SSTR(MI_BAD_PARM)); if (node->next) return init_mi_tree( 400, MI_SSTR(MI_MISSING_PARM)); value = &node->value; } else { value = NULL; } /* search for the profile */ profile = search_dlg_profile( profile_name ); if (profile==NULL) return init_mi_tree( 404, MI_SSTR("Profile not found")); size = get_profile_size( profile , value ); rpl_tree = init_mi_tree( 200, MI_SSTR(MI_OK)); if (rpl_tree==0) return 0; rpl = &rpl_tree->node; node = add_mi_node_child(rpl, MI_DUP_VALUE, "profile", 7, NULL, 0); if (node==0) { free_mi_tree(rpl_tree); return NULL; } attr = add_mi_attr(node, MI_DUP_VALUE, "name", 4, profile->name.s, profile->name.len); if(attr == NULL) { goto error; } if (value) { attr = add_mi_attr(node, MI_DUP_VALUE, "value", 5, value->s, value->len); } else { attr = add_mi_attr(node, MI_DUP_VALUE, "value", 5, NULL, 0); } if(attr == NULL) { goto error; } p= int2str((unsigned long)size, &len); attr = add_mi_attr(node, MI_DUP_VALUE, "count", 5, p, len); if(attr == NULL) { goto error; } return rpl_tree; error: free_mi_tree(rpl_tree); return NULL; }