00001
00023 #include <stdio.h>
00024 #include <string.h>
00025 #include <stdlib.h>
00026
00027 #include "../../sr_module.h"
00028 #include "../../pvar.h"
00029 #include "../../mod_fix.h"
00030 #include "../../lib/kmi/mi.h"
00031
00032 #include "pv_branch.h"
00033 #include "pv_core.h"
00034 #include "pv_stats.h"
00035 #include "pv_shv.h"
00036 #include "pv_time.h"
00037 #include "pv_trans.h"
00038 #include "pv_select.h"
00039 #ifdef WITH_XAVP
00040 #include "pv_xavp.h"
00041 #endif
00042
00043 MODULE_VERSION
00044
00045 static tr_export_t mod_trans[] = {
00046 { {"s", sizeof("s")-1},
00047 tr_parse_string },
00048 { {"nameaddr", sizeof("nameaddr")-1},
00049 tr_parse_nameaddr },
00050 { {"uri", sizeof("uri")-1},
00051 tr_parse_uri },
00052 { {"param", sizeof("param")-1},
00053 tr_parse_paramlist },
00054 { {"tobody", sizeof("tobody")-1},
00055 tr_parse_tobody },
00056 { {"line", sizeof("line")-1},
00057 tr_parse_line },
00058
00059 { { 0, 0 }, 0 }
00060 };
00061
00062 static pv_export_t mod_pvs[] = {
00063 { {"branch", sizeof("branch")-1},
00064 PVT_CONTEXT, pv_get_branchx, pv_set_branchx,
00065 pv_parse_branchx_name, pv_parse_index, 0, 0 },
00066 { {"mi", (sizeof("mi")-1)},
00067 PVT_OTHER, pv_get_msgid, 0,
00068 0, 0, 0, 0},
00069 { {"stat", sizeof("stat")-1},
00070 PVT_OTHER, pv_get_stat, 0,
00071 pv_parse_stat_name, 0, 0, 0 },
00072 { {"sel", sizeof("sel")-1},
00073 PVT_OTHER, pv_get_select, 0,
00074 pv_parse_select_name, 0, 0, 0 },
00075 { {"snd", (sizeof("snd")-1)}, PVT_OTHER, pv_get_sndto, 0,
00076 pv_parse_snd_name, 0, 0, 0 },
00077 { {"sndto", (sizeof("sndto")-1)}, PVT_OTHER, pv_get_sndto, 0,
00078 pv_parse_snd_name, 0, 0, 0 },
00079 { {"sndfrom", (sizeof("sndfrom")-1)}, PVT_OTHER, pv_get_sndfrom, 0,
00080 pv_parse_snd_name, 0, 0, 0 },
00081 #ifdef WITH_XAVP
00082 { {"xavp", sizeof("xavp")-1},
00083 PVT_OTHER, pv_get_xavp, pv_set_xavp,
00084 pv_parse_xavp_name, 0, 0, 0 },
00085 #endif
00086
00087 {{"avp", (sizeof("avp")-1)}, PVT_AVP, pv_get_avp, pv_set_avp,
00088 pv_parse_avp_name, pv_parse_index, 0, 0},
00089 {{"hdr", (sizeof("hdr")-1)}, PVT_HDR, pv_get_hdr, 0, pv_parse_hdr_name,
00090 pv_parse_index, 0, 0},
00091 {{"var", (sizeof("var")-1)}, PVT_SCRIPTVAR, pv_get_scriptvar,
00092 pv_set_scriptvar, pv_parse_scriptvar_name, 0, 0, 0},
00093 {{"ai", (sizeof("ai")-1)},
00094 PVT_OTHER, pv_get_pai, 0,
00095 0, 0, 0, 0},
00096 {{"adu", (sizeof("adu")-1)},
00097 PVT_OTHER, pv_get_authattr, 0,
00098 0, 0, pv_init_iname, 3},
00099 {{"ar", (sizeof("ar")-1)},
00100 PVT_OTHER, pv_get_authattr, 0,
00101 0, 0, pv_init_iname, 2},
00102 {{"au", (sizeof("au")-1)},
00103 PVT_OTHER, pv_get_authattr, 0,
00104 0, 0, pv_init_iname, 1},
00105 {{"ad", (sizeof("ad")-1)},
00106 PVT_OTHER, pv_get_authattr, 0,
00107 0, 0, pv_init_iname, 4},
00108 {{"aU", (sizeof("aU")-1)},
00109 PVT_OTHER, pv_get_authattr, 0,
00110 0, 0, pv_init_iname, 5},
00111 {{"Au", (sizeof("Au")-1)},
00112 PVT_OTHER, pv_get_acc_username, 0,
00113 0, 0, pv_init_iname, 1},
00114 {{"bf", (sizeof("bf")-1)},
00115 PVT_CONTEXT, pv_get_bflags, pv_set_bflags,
00116 0, 0, 0, 0},
00117 {{"bF", (sizeof("bF")-1)},
00118 PVT_CONTEXT, pv_get_hexbflags, pv_set_bflags,
00119 0, 0, 0, 0},
00120 {{"br", (sizeof("br")-1)},
00121 PVT_BRANCH, pv_get_branch, pv_set_branch,
00122 0, 0, 0, 0},
00123 {{"bR", (sizeof("bR")-1)},
00124 PVT_CONTEXT, pv_get_branches, 0,
00125 0, 0, 0, 0},
00126 {{"bs", (sizeof("bs")-1)},
00127 PVT_OTHER, pv_get_body_size, 0,
00128 0, 0, 0, 0},
00129 {{"ci", (sizeof("ci")-1)},
00130 PVT_OTHER, pv_get_callid, 0,
00131 0, 0, 0, 0},
00132 {{"cl", (sizeof("cl")-1)},
00133 PVT_OTHER, pv_get_content_length, 0,
00134 0, 0, 0, 0},
00135 {{"cs", (sizeof("cs")-1)},
00136 PVT_OTHER, pv_get_cseq, 0,
00137 0, 0, 0, 0},
00138 {{"ct", (sizeof("ct")-1)},
00139 PVT_OTHER, pv_get_contact, 0,
00140 0, 0, 0, 0},
00141 {{"cT", (sizeof("cT")-1)},
00142 PVT_OTHER, pv_get_content_type, 0,
00143 0, 0, 0, 0},
00144 {{"dd", (sizeof("dd")-1)},
00145 PVT_OTHER, pv_get_dsturi_attr, 0,
00146 0, 0, pv_init_iname, 1},
00147 {{"di", (sizeof("di")-1)},
00148 PVT_OTHER, pv_get_diversion, 0,
00149 0, 0, pv_init_iname, 1},
00150 {{"dir", (sizeof("dir")-1)},
00151 PVT_OTHER, pv_get_diversion, 0,
00152 0, 0, pv_init_iname, 2},
00153 {{"dip", (sizeof("dis")-1)},
00154 PVT_OTHER, pv_get_diversion, 0,
00155 0, 0, pv_init_iname, 3},
00156 {{"dic", (sizeof("dic")-1)},
00157 PVT_OTHER, pv_get_diversion, 0,
00158 0, 0, pv_init_iname, 4},
00159 {{"dp", (sizeof("dp")-1)},
00160 PVT_OTHER, pv_get_dsturi_attr, 0,
00161 0, 0, pv_init_iname, 2},
00162 {{"dP", (sizeof("dP")-1)},
00163 PVT_OTHER, pv_get_dsturi_attr, 0,
00164 0, 0, pv_init_iname, 3},
00165 {{"ds", (sizeof("ds")-1)},
00166 PVT_CONTEXT, pv_get_dset, 0,
00167 0, 0, 0, 0},
00168 {{"du", (sizeof("du")-1)},
00169 PVT_DSTURI, pv_get_dsturi, pv_set_dsturi,
00170 0, 0, 0, 0},
00171 {{"duri", (sizeof("duri")-1)},
00172 PVT_DSTURI, pv_get_dsturi, pv_set_dsturi,
00173 0, 0, 0, 0},
00174 {{"err.class", (sizeof("err.class")-1)},
00175 PVT_OTHER, pv_get_errinfo_attr, 0,
00176 0, 0, 0, 0},
00177 {{"err.level", (sizeof("err.level")-1)},
00178 PVT_OTHER, pv_get_errinfo_attr, 0,
00179 0, 0, pv_init_iname, 1},
00180 {{"err.info", (sizeof("err.info")-1)},
00181 PVT_OTHER, pv_get_errinfo_attr, 0,
00182 0, 0, pv_init_iname, 2},
00183 {{"err.rcode", (sizeof("err.rcode")-1)},
00184 PVT_OTHER, pv_get_errinfo_attr, 0,
00185 0, 0, pv_init_iname, 3},
00186 {{"err.rreason", (sizeof("err.rreason")-1)},
00187 PVT_OTHER, pv_get_errinfo_attr, 0,
00188 0, 0, pv_init_iname, 4},
00189 {{"fd", (sizeof("fd")-1)},
00190 PVT_OTHER, pv_get_from_attr, pv_set_from_domain,
00191 0, 0, pv_init_iname, 3},
00192 {{"from.domain", (sizeof("from.domain")-1)},
00193 PVT_OTHER, pv_get_from_attr, pv_set_from_domain,
00194 0, 0, pv_init_iname, 3},
00195 {{"fn", (sizeof("fn")-1)},
00196 PVT_OTHER, pv_get_from_attr, pv_set_from_display,
00197 0, 0, pv_init_iname, 5},
00198 {{"fs", (sizeof("fs")-1)},
00199 PVT_OTHER, pv_get_force_sock, pv_set_force_sock,
00200 0, 0, 0, 0},
00201 {{"ft", (sizeof("ft")-1)},
00202 PVT_OTHER, pv_get_from_attr, 0,
00203 0, 0, pv_init_iname, 4},
00204 {{"fu", (sizeof("fu")-1)},
00205 PVT_FROM, pv_get_from_attr, pv_set_from_uri,
00206 0, 0, pv_init_iname, 1},
00207 {{"from", (sizeof("from")-1)},
00208 PVT_FROM, pv_get_from_attr, pv_set_from_uri,
00209 0, 0, pv_init_iname, 1},
00210 {{"fU", (sizeof("fU")-1)},
00211 PVT_OTHER, pv_get_from_attr, pv_set_from_username,
00212 0, 0, pv_init_iname, 2},
00213 {{"from.user", (sizeof("from.user")-1)},
00214 PVT_OTHER, pv_get_from_attr, pv_set_from_username,
00215 0, 0, pv_init_iname, 2},
00216 {{"mb", (sizeof("mb")-1)},
00217 PVT_OTHER, pv_get_msg_buf, 0,
00218 0, 0, 0, 0},
00219 {{"mf", (sizeof("mf")-1)},
00220 PVT_OTHER, pv_get_flags, pv_set_mflags,
00221 0, 0, 0, 0},
00222 {{"mF", (sizeof("mF")-1)},
00223 PVT_OTHER, pv_get_hexflags, pv_set_mflags,
00224 0, 0, 0, 0},
00225 {{"ml", (sizeof("ml")-1)},
00226 PVT_OTHER, pv_get_msg_len, 0,
00227 0, 0, 0, 0},
00228 {{"mt", (sizeof("mt")-1)},
00229 PVT_OTHER, pv_get_msgtype, 0,
00230 0, 0, 0, 0},
00231 {{"od", (sizeof("od")-1)},
00232 PVT_OTHER, pv_get_ouri_attr, 0,
00233 0, 0, pv_init_iname, 2},
00234 {{"op", (sizeof("op")-1)},
00235 PVT_OTHER, pv_get_ouri_attr, 0,
00236 0, 0, pv_init_iname, 3},
00237 {{"oP", (sizeof("oP")-1)},
00238 PVT_OTHER, pv_get_ouri_attr, 0,
00239 0, 0, pv_init_iname, 4},
00240 {{"ou", (sizeof("ou")-1)},
00241 PVT_OURI, pv_get_ouri, 0,
00242 0, 0, 0, 0},
00243 {{"ouri", (sizeof("ouri")-1)},
00244 PVT_OURI, pv_get_ouri, 0,
00245 0, 0, 0, 0},
00246 {{"oU", (sizeof("oU")-1)},
00247 PVT_OTHER, pv_get_ouri_attr, 0,
00248 0, 0, pv_init_iname, 1},
00249 {{"pd", (sizeof("pd")-1)},
00250 PVT_OTHER, pv_get_ppi_attr, 0,
00251 0, 0, pv_init_iname, 3},
00252 {{"pn", (sizeof("pn")-1)},
00253 PVT_OTHER, pv_get_ppi_attr, 0,
00254 0, 0, pv_init_iname, 4},
00255 {{"pp", (sizeof("pp")-1)},
00256 PVT_OTHER, pv_get_pid, 0,
00257 0, 0, 0, 0},
00258 {{"pr", (sizeof("pr")-1)},
00259 PVT_OTHER, pv_get_proto, 0,
00260 0, 0, 0, 0},
00261 {{"proto", (sizeof("proto")-1)},
00262 PVT_OTHER, pv_get_proto, 0,
00263 0, 0, 0, 0},
00264 {{"pu", (sizeof("pu")-1)},
00265 PVT_OTHER, pv_get_ppi_attr, 0,
00266 0, 0, pv_init_iname, 1},
00267 {{"pU", (sizeof("pU")-1)},
00268 PVT_OTHER, pv_get_ppi_attr, 0,
00269 0, 0, pv_init_iname, 2},
00270 {{"rb", (sizeof("rb")-1)},
00271 PVT_MSG_BODY, pv_get_msg_body, 0,
00272 0, 0, 0, 0},
00273
00274
00275
00276
00277
00278
00279 {{"rd", (sizeof("rd")-1)},
00280 PVT_RURI_DOMAIN, pv_get_ruri_attr, pv_set_ruri_host,
00281 0, 0, pv_init_iname, 2},
00282 {{"ruri.domain", (sizeof("ruri.domain")-1)},
00283 PVT_RURI_DOMAIN, pv_get_ruri_attr, pv_set_ruri_host,
00284 0, 0, pv_init_iname, 2},
00285 {{"re", (sizeof("re")-1)},
00286 PVT_OTHER, pv_get_rpid, 0,
00287 0, 0, 0, 0},
00288 {{"rm", (sizeof("rm")-1)},
00289 PVT_OTHER, pv_get_method, 0,
00290 0, 0, 0, 0},
00291 {{"rmid", (sizeof("rmid")-1)},
00292 PVT_OTHER, pv_get_methodid, 0,
00293 0, 0, 0, 0},
00294 {{"rp", (sizeof("rp")-1)},
00295 PVT_OTHER, pv_get_ruri_attr, pv_set_ruri_port,
00296 0, 0, pv_init_iname, 3},
00297 {{"rP", (sizeof("rP")-1)},
00298 PVT_OTHER, pv_get_ruri_attr, 0,
00299 0, 0, pv_init_iname, 4},
00300 {{"rr", (sizeof("rr")-1)},
00301 PVT_OTHER, pv_get_reason, 0,
00302 0, 0, 0, 0},
00303 {{"rs", (sizeof("rs")-1)},
00304 PVT_OTHER, pv_get_status, 0,
00305 0, 0, 0, 0},
00306 {{"rt", (sizeof("rt")-1)},
00307 PVT_OTHER, pv_get_refer_to, 0,
00308 0, 0, 0, 0},
00309 {{"ru", (sizeof("ru")-1)},
00310 PVT_RURI, pv_get_ruri, pv_set_ruri,
00311 0, 0, 0, 0},
00312 {{"ruri", (sizeof("ruri")-1)},
00313 PVT_RURI, pv_get_ruri, pv_set_ruri,
00314 0, 0, 0, 0},
00315 {{"rU", (sizeof("rU")-1)},
00316 PVT_RURI_USERNAME, pv_get_ruri_attr, pv_set_ruri_user,
00317 0, 0, pv_init_iname, 1},
00318 {{"ruri.user", (sizeof("ruri.user")-1)},
00319 PVT_RURI_USERNAME, pv_get_ruri_attr, pv_set_ruri_user,
00320 0, 0, pv_init_iname, 1},
00321 {{"rv", (sizeof("rv")-1)},
00322 PVT_OTHER, pv_get_version, 0,
00323 0, 0, 0, 0},
00324 {{"rz", (sizeof("rz")-1)},
00325 PVT_OTHER, pv_get_ruri_attr, 0,
00326 0, 0, pv_init_iname, 5},
00327 {{"Ri", (sizeof("Ri")-1)},
00328 PVT_OTHER, pv_get_rcvip, 0,
00329 0, 0, 0, 0},
00330 {{"Rp", (sizeof("Rp")-1)},
00331 PVT_OTHER, pv_get_rcvport, 0,
00332 0, 0, 0, 0},
00333 {{"sf", (sizeof("sf")-1)},
00334 PVT_OTHER, pv_get_sflags, pv_set_sflags,
00335 0, 0, 0, 0},
00336 {{"sF", (sizeof("sF")-1)},
00337 PVT_OTHER, pv_get_hexsflags, pv_set_sflags,
00338 0, 0, 0, 0},
00339 {{"src_ip", (sizeof("src_ip")-1)},
00340 PVT_OTHER, pv_get_srcip, 0,
00341 0, 0, 0, 0},
00342 {{"si", (sizeof("si")-1)},
00343 PVT_OTHER, pv_get_srcip, 0,
00344 0, 0, 0, 0},
00345 { {"sid", (sizeof("sid")-1)},
00346 PVT_OTHER, pv_get_server_id, 0,
00347 0, 0, 0, 0},
00348 {{"sp", (sizeof("sp")-1)},
00349 PVT_OTHER, pv_get_srcport, 0,
00350 0, 0, 0, 0},
00351 {{"td", (sizeof("td")-1)},
00352 PVT_OTHER, pv_get_to_attr, pv_set_to_domain,
00353 0, 0, pv_init_iname, 3},
00354 {{"to.domain", (sizeof("to.domain")-1)},
00355 PVT_OTHER, pv_get_to_attr, pv_set_to_domain,
00356 0, 0, pv_init_iname, 3},
00357 {{"tn", (sizeof("tn")-1)},
00358 PVT_OTHER, pv_get_to_attr, pv_set_to_display,
00359 0, 0, pv_init_iname, 5},
00360 {{"tt", (sizeof("tt")-1)},
00361 PVT_OTHER, pv_get_to_attr, 0,
00362 0, 0, pv_init_iname, 4},
00363 {{"tu", (sizeof("tu")-1)},
00364 PVT_TO, pv_get_to_attr, pv_set_to_uri,
00365 0, 0, pv_init_iname, 1},
00366 {{"to", (sizeof("to")-1)},
00367 PVT_TO, pv_get_to_attr, pv_set_to_uri,
00368 0, 0, pv_init_iname, 1},
00369 {{"tU", (sizeof("tU")-1)},
00370 PVT_OTHER, pv_get_to_attr, pv_set_to_username,
00371 0, 0, pv_init_iname, 2},
00372 {{"to.user", (sizeof("to.user")-1)},
00373 PVT_OTHER, pv_get_to_attr, pv_set_to_username,
00374 0, 0, pv_init_iname, 2},
00375 {{"true", (sizeof("true")-1)},
00376 PVT_OTHER, pv_get_true, 0,
00377 0, 0, 0, 0},
00378 {{"Tb", (sizeof("Tb")-1)},
00379 PVT_OTHER, pv_get_timeb, 0,
00380 0, 0, 0, 0},
00381 {{"Tf", (sizeof("Tf")-1)},
00382 PVT_CONTEXT, pv_get_timef, 0,
00383 0, 0, 0, 0},
00384 {{"TF", (sizeof("TF")-1)},
00385 PVT_OTHER, pv_get_timenowf, 0,
00386 0, 0, 0, 0},
00387 {{"Ts", (sizeof("Ts")-1)},
00388 PVT_CONTEXT, pv_get_times, 0,
00389 0, 0, 0, 0},
00390 {{"TS", (sizeof("TS")-1)},
00391 PVT_OTHER, pv_get_timenows, 0,
00392 0, 0, 0, 0},
00393 {{"ua", (sizeof("ua")-1)},
00394 PVT_OTHER, pv_get_useragent, 0,
00395 0, 0, 0, 0},
00396
00397 { {"shv", (sizeof("shv")-1)}, PVT_OTHER, pv_get_shvar,
00398 pv_set_shvar, pv_parse_shvar_name, 0, 0, 0},
00399 { {"time", (sizeof("time")-1)}, PVT_CONTEXT, pv_get_time,
00400 0, pv_parse_time_name, 0, 0, 0},
00401 { {"timef", (sizeof("timef")-1)}, PVT_CONTEXT, pv_get_strftime,
00402 0, pv_parse_strftime_name, 0, 0, 0},
00403 { {"TV", (sizeof("TV")-1)}, PVT_OTHER, pv_get_timeval,
00404 0, pv_parse_timeval_name, 0, 0, 0},
00405 { {"nh", (sizeof("nh")-1)}, PVT_OTHER, pv_get_nh,
00406 0, pv_parse_nh_name, 0, 0, 0},
00407
00408 { {0, 0}, 0, 0, 0, 0, 0, 0, 0 }
00409 };
00410
00411 static int add_avp_aliases(modparam_t type, void* val);
00412
00413 static param_export_t params[]={
00414 {"shvset", STR_PARAM|USE_FUNC_PARAM, (void*)param_set_shvar },
00415 {"varset", STR_PARAM|USE_FUNC_PARAM, (void*)param_set_var },
00416 {"avp_aliases", STR_PARAM|USE_FUNC_PARAM, (void*)add_avp_aliases },
00417 {0,0,0}
00418 };
00419
00420 static mi_export_t mi_cmds[] = {
00421 { "shv_get", mi_shvar_get, 0, 0, 0 },
00422 { "shv_set" , mi_shvar_set, 0, 0, 0 },
00423 { 0, 0, 0, 0, 0}
00424 };
00425
00426 static int mod_init(void);
00427 static void mod_destroy(void);
00428 static int pv_isset(struct sip_msg* msg, char* pvid, char *foo);
00429 static int pv_unset(struct sip_msg* msg, char* pvid, char *foo);
00430 static int is_int(struct sip_msg* msg, char* pvar, char* s2);
00431
00432 static cmd_export_t cmds[]={
00433 {"pv_isset", (cmd_function)pv_isset, 1, fixup_pvar_null, 0,
00434 ANY_ROUTE },
00435 {"pv_unset", (cmd_function)pv_unset, 1, fixup_pvar_null, 0,
00436 ANY_ROUTE },
00437 #ifdef WITH_XAVP
00438 {"pv_xavp_print", (cmd_function)pv_xavp_print, 0, 0, 0,
00439 ANY_ROUTE },
00440 #endif
00441 {"is_int", (cmd_function)is_int, 1, fixup_pvar_null, fixup_free_pvar_null,
00442 ANY_ROUTE},
00443
00444 {0,0,0,0,0,0}
00445 };
00446
00447
00448
00450 struct module_exports exports= {
00451 "pv",
00452 DEFAULT_DLFLAGS,
00453 cmds,
00454 params,
00455 0,
00456 mi_cmds,
00457 mod_pvs,
00458 0,
00459 mod_init,
00460 0,
00461 mod_destroy,
00462 0
00463 };
00464
00465 static int mod_init(void)
00466 {
00467 if(register_mi_mod(exports.name, mi_cmds)!=0)
00468 {
00469 LM_ERR("failed to register MI commands\n");
00470 return -1;
00471 }
00472
00473 return 0;
00474 }
00475
00476 static void mod_destroy(void)
00477 {
00478 shvar_destroy_locks();
00479 destroy_shvars();
00480 }
00481
00482 int mod_register(char *path, int *dlflags, void *p1, void *p2)
00483 {
00484 if(tr_init_buffers()<0)
00485 {
00486 LM_ERR("failed to initialize transformations buffers\n");
00487 return -1;
00488 }
00489 return register_trans_mod(path, mod_trans);
00490 }
00491
00492 static int pv_isset(struct sip_msg* msg, char* pvid, char *foo)
00493 {
00494 pv_spec_t *sp;
00495 pv_value_t value;
00496 int ret;
00497
00498 sp = (pv_spec_t*)pvid;
00499 if(pv_get_spec_value(msg, sp, &value)!=0)
00500 return -1;
00501 ret =1;
00502 if(value.flags & (PV_VAL_EMPTY|PV_VAL_NULL))
00503 ret = -1;
00504 pv_value_destroy(&value);
00505 return ret;
00506 }
00507
00508 static int pv_unset(struct sip_msg* msg, char* pvid, char *foo)
00509 {
00510 pv_spec_t *sp;
00511
00512 sp = (pv_spec_t*)pvid;
00513 pv_set_spec_value(msg, sp, 0, NULL);
00514
00515 return 1;
00516 }
00517
00518 static int add_avp_aliases(modparam_t type, void* val)
00519 {
00520 if (val!=0 && ((char*)val)[0]!=0)
00521 {
00522 if ( add_avp_galias_str((char*)val)!=0 )
00523 return -1;
00524 }
00525
00526 return 0;
00527 }
00528
00534 static int is_int(struct sip_msg* msg, char* pvar, char* s2)
00535 {
00536 pv_spec_t *pvar_sp;
00537 pv_value_t pv_val;
00538
00539 pvar_sp = (pv_spec_t *)pvar;
00540
00541 if (pvar_sp && (pv_get_spec_value(msg, pvar_sp, &pv_val) == 0)) {
00542 return (pv_val.flags & PV_VAL_INT)?1:-1;
00543 }
00544
00545 return -1;
00546 }