2 * Copyright (C) 2008 Daniel-Constantin Mierla (asipto.com)
4 * This file is part of Kamailio, a free SIP server.
6 * Kamailio is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version
11 * Kamailio is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "../../core/sr_module.h"
26 #include "../../core/pvar.h"
27 #include "../../core/pvapi.h"
28 #include "../../core/lvalue.h"
29 #include "../../core/mod_fix.h"
30 #include "../../core/xavp.h"
31 #include "../../core/kemi.h"
32 #include "../../core/rpc.h"
33 #include "../../core/rpc_lookup.h"
36 #include "pv_branch.h"
42 #include "pv_select.h"
48 static tr_export_t mod_trans[] = {
49 { {"s", sizeof("s")-1}, /* string class */
51 { {"nameaddr", sizeof("nameaddr")-1}, /* nameaddr class */
53 { {"uri", sizeof("uri")-1}, /* uri class */
55 { {"param", sizeof("param")-1}, /* param class */
57 { {"tobody", sizeof("tobody")-1}, /* param class */
59 { {"line", sizeof("line")-1}, /* line class */
65 static pv_export_t mod_pvs[] = {
66 { {"_s", (sizeof("_s")-1)}, PVT_OTHER, pv_get__s, 0,
67 pv_parse__s_name, 0, 0, 0 },
68 { {"af", (sizeof("af")-1)}, PVT_OTHER, pv_get_af, 0,
69 pv_parse_af_name, 0, 0, 0 },
70 { {"branch", sizeof("branch")-1}, /* branch attributes */
71 PVT_CONTEXT, pv_get_branchx, pv_set_branchx,
72 pv_parse_branchx_name, pv_parse_index, 0, 0 },
73 { {"sbranch", sizeof("sbranch")-1}, /* static branch attributes */
74 PVT_CONTEXT, pv_get_sbranch, pv_set_sbranch,
75 pv_parse_branchx_name, 0, 0, 0 },
76 { {"mi", (sizeof("mi")-1)}, /* message id */
77 PVT_OTHER, pv_get_msgid, 0,
79 { {"stat", sizeof("stat")-1}, /* statistics */
80 PVT_OTHER, pv_get_stat, 0,
81 pv_parse_stat_name, 0, 0, 0 },
82 { {"sel", sizeof("sel")-1}, /* select */
83 PVT_OTHER, pv_get_select, 0,
84 pv_parse_select_name, 0, 0, 0 },
85 { {"snd", (sizeof("snd")-1)}, PVT_OTHER, pv_get_sndto, 0,
86 pv_parse_snd_name, 0, 0, 0 },
87 { {"sndto", (sizeof("sndto")-1)}, PVT_OTHER, pv_get_sndto, 0,
88 pv_parse_snd_name, 0, 0, 0 },
89 { {"sndfrom", (sizeof("sndfrom")-1)}, PVT_OTHER, pv_get_sndfrom, 0,
90 pv_parse_snd_name, 0, 0, 0 },
91 { {"rcv", (sizeof("rcv")-1)}, PVT_OTHER, pv_get_rcv, 0,
92 pv_parse_rcv_name, 0, 0, 0 },
93 { {"xavp", sizeof("xavp")-1}, /* xavp */
94 PVT_XAVP, pv_get_xavp, pv_set_xavp,
95 pv_parse_xavp_name, 0, 0, 0 },
96 { {"xavu", sizeof("xavu")-1}, /* xavu */
97 PVT_XAVU, pv_get_xavu, pv_set_xavu,
98 pv_parse_xavp_name, 0, 0, 0 },
99 {{"avp", (sizeof("avp")-1)}, PVT_AVP, pv_get_avp, pv_set_avp,
100 pv_parse_avp_name, pv_parse_index, 0, 0},
101 {{"hdr", (sizeof("hdr")-1)}, PVT_HDR, pv_get_hdr, 0, pv_parse_hdr_name,
102 pv_parse_index, 0, 0},
103 {{"hdrc", (sizeof("hdrc")-1)}, PVT_HDRC, pv_get_hdrc, 0, pv_parse_hdr_name,
105 {{"var", (sizeof("var")-1)}, PVT_SCRIPTVAR, pv_get_scriptvar,
106 pv_set_scriptvar, pv_parse_scriptvar_name, 0, 0, 0},
107 {{"vz", (sizeof("vz")-1)}, PVT_SCRIPTVAR, pv_get_scriptvar,
108 pv_set_scriptvar, pv_parse_scriptvar_name, 0, 0, 0},
109 {{"vn", (sizeof("vn")-1)}, PVT_SCRIPTVAR, pv_get_scriptvar,
110 pv_set_scriptvar, pv_parse_scriptvarnull_name, 0, 0, 0},
111 {{"ai", (sizeof("ai")-1)}, /* */
112 PVT_OTHER, pv_get_pai, 0,
113 0, pv_parse_index, 0, 0},
114 {{"adu", (sizeof("adu")-1)}, /* auth digest uri */
115 PVT_OTHER, pv_get_authattr, 0,
116 0, 0, pv_init_iname, 3},
117 {{"ar", (sizeof("ar")-1)}, /* auth realm */
118 PVT_OTHER, pv_get_authattr, 0,
119 0, 0, pv_init_iname, 2},
120 {{"au", (sizeof("au")-1)}, /* */
121 PVT_OTHER, pv_get_authattr, 0,
122 0, 0, pv_init_iname, 1},
123 {{"ad", (sizeof("ad")-1)}, /* */
124 PVT_OTHER, pv_get_authattr, 0,
125 0, 0, pv_init_iname, 4},
126 {{"aU", (sizeof("aU")-1)}, /* */
127 PVT_OTHER, pv_get_authattr, 0,
128 0, 0, pv_init_iname, 5},
129 {{"aa", (sizeof("aa")-1)}, /* auth algorithm */
130 PVT_OTHER, pv_get_authattr, 0,
131 0, 0, pv_init_iname, 6},
132 {{"adn", (sizeof("adn")-1)}, /* auth nonce */
133 PVT_OTHER, pv_get_authattr, 0,
134 0, 0, pv_init_iname, 7},
135 {{"adc", (sizeof("adc")-1)}, /* auth cnonce */
136 PVT_OTHER, pv_get_authattr, 0,
137 0, 0, pv_init_iname, 8},
138 {{"adr", (sizeof("adr")-1)}, /* auth response */
139 PVT_OTHER, pv_get_authattr, 0,
140 0, 0, pv_init_iname, 9},
141 {{"ado", (sizeof("ado")-1)}, /* auth opaque */
142 PVT_OTHER, pv_get_authattr, 0,
143 0, 0, pv_init_iname, 10},
144 {{"Au", (sizeof("Au")-1)}, /* */
145 PVT_OTHER, pv_get_acc_username, 0,
146 0, 0, pv_init_iname, 1},
147 {{"AU", (sizeof("AU")-1)}, /* */
148 PVT_OTHER, pv_get_acc_user, 0,
149 0, 0, pv_init_iname, 1},
150 {{"bf", (sizeof("bf")-1)}, /* */
151 PVT_CONTEXT, pv_get_bflags, pv_set_bflags,
153 {{"bF", (sizeof("bF")-1)}, /* */
154 PVT_CONTEXT, pv_get_hexbflags, pv_set_bflags,
156 {{"Bf", (sizeof("Bf")-1)}, /* */
157 PVT_CONTEXT, pv_get_bflag, pv_set_bflag,
158 pv_parse_flag_param, 0, 0, 0},
159 {{"br", (sizeof("br")-1)}, /* */
160 PVT_BRANCH, pv_get_branch, pv_set_branch,
162 {{"bR", (sizeof("bR")-1)}, /* */
163 PVT_CONTEXT, pv_get_branches, 0,
165 {{"bs", (sizeof("bs")-1)}, /* */
166 PVT_OTHER, pv_get_body_size, 0,
168 {{"ci", (sizeof("ci")-1)}, /* */
169 PVT_OTHER, pv_get_callid, 0,
171 {{"cl", (sizeof("cl")-1)}, /* */
172 PVT_OTHER, pv_get_content_length, 0,
174 {{"cnt", sizeof("cnt")-1},
175 PVT_OTHER, pv_get_cnt, 0,
176 pv_parse_cnt_name, 0, 0, 0 },
177 {{"conid", (sizeof("conid")-1)}, /* */
178 PVT_OTHER, pv_get_tcpconn_id, 0,
180 {{"cs", (sizeof("cs")-1)}, /* */
181 PVT_OTHER, pv_get_cseq, 0,
183 {{"csb", (sizeof("csb")-1)}, /* */
184 PVT_OTHER, pv_get_cseq_body, 0,
186 {{"ct", (sizeof("ct")-1)}, /* */
187 PVT_OTHER, pv_get_contact, 0,
189 {{"cT", (sizeof("cT")-1)}, /* */
190 PVT_OTHER, pv_get_content_type, 0,
192 {{"dd", (sizeof("dd")-1)}, /* */
193 PVT_OTHER, pv_get_dsturi_attr, 0,
194 0, 0, pv_init_iname, 1},
195 {{"def", (sizeof("env")-1)}, PVT_OTHER, pv_get_def, 0,
196 pv_parse_def_name, 0, 0, 0},
197 {{"di", (sizeof("di")-1)}, /* */
198 PVT_OTHER, pv_get_diversion, 0,
199 0, 0, pv_init_iname, 1},
200 {{"dir", (sizeof("dir")-1)}, /* */
201 PVT_OTHER, pv_get_diversion, 0,
202 0, 0, pv_init_iname, 2},
203 {{"dip", (sizeof("dis")-1)}, /* */
204 PVT_OTHER, pv_get_diversion, 0,
205 0, 0, pv_init_iname, 3},
206 {{"dic", (sizeof("dic")-1)}, /* */
207 PVT_OTHER, pv_get_diversion, 0,
208 0, 0, pv_init_iname, 4},
209 {{"dp", (sizeof("dp")-1)}, /* */
210 PVT_OTHER, pv_get_dsturi_attr, 0,
211 0, 0, pv_init_iname, 2},
212 {{"dP", (sizeof("dP")-1)}, /* */
213 PVT_OTHER, pv_get_dsturi_attr, 0,
214 0, 0, pv_init_iname, 3},
215 {{"ds", (sizeof("ds")-1)}, /* */
216 PVT_CONTEXT, pv_get_dset, 0,
218 {{"du", (sizeof("du")-1)}, /* */
219 PVT_DSTURI, pv_get_dsturi, pv_set_dsturi,
221 {{"duri", (sizeof("duri")-1)}, /* */
222 PVT_DSTURI, pv_get_dsturi, pv_set_dsturi,
224 {{"env", (sizeof("env")-1)}, PVT_OTHER, pv_get_env, 0,
225 pv_parse_env_name, 0, 0, 0},
226 {{"err.class", (sizeof("err.class")-1)}, /* */
227 PVT_OTHER, pv_get_errinfo_attr, 0,
229 {{"err.level", (sizeof("err.level")-1)}, /* */
230 PVT_OTHER, pv_get_errinfo_attr, 0,
231 0, 0, pv_init_iname, 1},
232 {{"err.info", (sizeof("err.info")-1)}, /* */
233 PVT_OTHER, pv_get_errinfo_attr, 0,
234 0, 0, pv_init_iname, 2},
235 {{"err.rcode", (sizeof("err.rcode")-1)}, /* */
236 PVT_OTHER, pv_get_errinfo_attr, 0,
237 0, 0, pv_init_iname, 3},
238 {{"err.rreason", (sizeof("err.rreason")-1)}, /* */
239 PVT_OTHER, pv_get_errinfo_attr, 0,
240 0, 0, pv_init_iname, 4},
241 {{"fd", (sizeof("fd")-1)}, /* */
242 PVT_OTHER, pv_get_from_attr, pv_set_from_domain,
243 0, 0, pv_init_iname, 3},
244 {{"from.domain", (sizeof("from.domain")-1)}, /* */
245 PVT_OTHER, pv_get_from_attr, pv_set_from_domain,
246 0, 0, pv_init_iname, 3},
247 {{"fn", (sizeof("fn")-1)}, /* */
248 PVT_OTHER, pv_get_from_attr, pv_set_from_display,
249 0, 0, pv_init_iname, 5},
250 {{"fs", (sizeof("fs")-1)}, /* */
251 PVT_OTHER, pv_get_force_sock, pv_set_force_sock,
253 {{"fsn", (sizeof("fsn")-1)}, /* */
254 PVT_OTHER, pv_get_force_sock_name, pv_set_force_sock_name,
256 {{"ft", (sizeof("ft")-1)}, /* */
257 PVT_OTHER, pv_get_from_attr, 0,
258 0, 0, pv_init_iname, 4},
259 {{"fu", (sizeof("fu")-1)}, /* */
260 PVT_FROM, pv_get_from_attr, pv_set_from_uri,
261 0, 0, pv_init_iname, 1},
262 {{"from", (sizeof("from")-1)}, /* */
263 PVT_FROM, pv_get_from_attr, pv_set_from_uri,
264 0, 0, pv_init_iname, 1},
265 {{"fU", (sizeof("fU")-1)}, /* */
266 PVT_OTHER, pv_get_from_attr, pv_set_from_username,
267 0, 0, pv_init_iname, 2},
268 {{"from.user", (sizeof("from.user")-1)}, /* */
269 PVT_OTHER, pv_get_from_attr, pv_set_from_username,
270 0, 0, pv_init_iname, 2},
271 {{"mb", (sizeof("mb")-1)}, /* */
272 PVT_OTHER, pv_get_msg_buf, 0,
274 {{"mbu", (sizeof("mbu")-1)}, /* */
275 PVT_OTHER, pv_get_msg_buf_updated, 0,
277 {{"mf", (sizeof("mf")-1)}, /* */
278 PVT_OTHER, pv_get_flags, pv_set_mflags,
280 {{"mF", (sizeof("mF")-1)}, /* */
281 PVT_OTHER, pv_get_hexflags, pv_set_mflags,
283 {{"Mf", (sizeof("mf")-1)}, /* */
284 PVT_OTHER, pv_get_flag, pv_set_mflag,
285 pv_parse_flag_param, 0, 0, 0},
286 {{"ml", (sizeof("ml")-1)}, /* */
287 PVT_OTHER, pv_get_msg_len, 0,
289 {{"mt", (sizeof("mt")-1)}, /* */
290 PVT_OTHER, pv_get_msgtype, 0,
292 {{"od", (sizeof("od")-1)}, /* */
293 PVT_OTHER, pv_get_ouri_attr, 0,
294 0, 0, pv_init_iname, 2},
295 {{"op", (sizeof("op")-1)}, /* */
296 PVT_OTHER, pv_get_ouri_attr, 0,
297 0, 0, pv_init_iname, 3},
298 {{"oP", (sizeof("oP")-1)}, /* */
299 PVT_OTHER, pv_get_ouri_attr, 0,
300 0, 0, pv_init_iname, 4},
301 {{"ou", (sizeof("ou")-1)}, /* */
302 PVT_OURI, pv_get_ouri, 0,
304 {{"ouri", (sizeof("ouri")-1)}, /* */
305 PVT_OURI, pv_get_ouri, 0,
307 {{"oU", (sizeof("oU")-1)}, /* */
308 PVT_OTHER, pv_get_ouri_attr, 0,
309 0, 0, pv_init_iname, 1},
310 {{"pd", (sizeof("pd")-1)}, /* */
311 PVT_OTHER, pv_get_ppi_attr, 0,
312 0, pv_parse_index, pv_init_iname, 3},
313 {{"pn", (sizeof("pn")-1)}, /* */
314 PVT_OTHER, pv_get_ppi_attr, 0,
315 0, pv_parse_index, pv_init_iname, 4},
316 {{"pp", (sizeof("pp")-1)}, /* */
317 PVT_OTHER, pv_get_pid, 0,
319 {{"pr", (sizeof("pr")-1)}, /* */
320 PVT_OTHER, pv_get_proto, 0,
322 {{"prid", (sizeof("prid")-1)}, /* */
323 PVT_OTHER, pv_get_protoid, 0,
325 {{"proto", (sizeof("proto")-1)}, /* */
326 PVT_OTHER, pv_get_proto, 0,
328 {{"pu", (sizeof("pu")-1)}, /* */
329 PVT_OTHER, pv_get_ppi_attr, 0,
330 0, pv_parse_index, pv_init_iname, 1},
331 {{"pU", (sizeof("pU")-1)}, /* */
332 PVT_OTHER, pv_get_ppi_attr, 0,
333 0, pv_parse_index, pv_init_iname, 2},
334 {{"rb", (sizeof("rb")-1)}, /* */
335 PVT_MSG_BODY, pv_get_msg_body, 0,
337 /* {{"rc", (sizeof("rc")-1)},
338 PVT_OTHER, pv_get_return_code, 0,
340 {{"retcode", (sizeof("retcode")-1)},
341 PVT_OTHER, pv_get_return_code, 0,
343 {{"rd", (sizeof("rd")-1)}, /* */
344 PVT_RURI_DOMAIN, pv_get_ruri_attr, pv_set_ruri_host,
345 0, 0, pv_init_iname, 2},
346 {{"ruri.domain", (sizeof("ruri.domain")-1)}, /* */
347 PVT_RURI_DOMAIN, pv_get_ruri_attr, pv_set_ruri_host,
348 0, 0, pv_init_iname, 2},
349 {{"re", (sizeof("re")-1)}, /* */
350 PVT_OTHER, pv_get_rpid, 0,
352 {{"rm", (sizeof("rm")-1)}, /* */
353 PVT_OTHER, pv_get_method, 0,
355 {{"rmid", (sizeof("rmid")-1)}, /* */
356 PVT_OTHER, pv_get_methodid, 0,
358 {{"rp", (sizeof("rp")-1)}, /* */
359 PVT_OTHER, pv_get_ruri_attr, pv_set_ruri_port,
360 0, 0, pv_init_iname, 3},
361 {{"rP", (sizeof("rP")-1)}, /* */
362 PVT_OTHER, pv_get_ruri_attr, 0,
363 0, 0, pv_init_iname, 4},
364 {{"rr", (sizeof("rr")-1)}, /* */
365 PVT_OTHER, pv_get_reason, 0,
367 {{"rs", (sizeof("rs")-1)}, /* */
368 PVT_OTHER, pv_get_status, 0,
370 {{"rt", (sizeof("rt")-1)}, /* */
371 PVT_OTHER, pv_get_refer_to, 0,
373 {{"ru", (sizeof("ru")-1)}, /* */
374 PVT_RURI, pv_get_ruri, pv_set_ruri,
376 {{"ruri", (sizeof("ruri")-1)}, /* */
377 PVT_RURI, pv_get_ruri, pv_set_ruri,
379 {{"rU", (sizeof("rU")-1)}, /* */
380 PVT_RURI_USERNAME, pv_get_ruri_attr, pv_set_ruri_user,
381 0, 0, pv_init_iname, 1},
382 {{"ruri.user", (sizeof("ruri.user")-1)}, /* */
383 PVT_RURI_USERNAME, pv_get_ruri_attr, pv_set_ruri_user,
384 0, 0, pv_init_iname, 1},
385 {{"rv", (sizeof("rv")-1)}, /* */
386 PVT_OTHER, pv_get_version, 0,
388 {{"rz", (sizeof("rz")-1)}, /* */
389 PVT_OTHER, pv_get_ruri_attr, 0,
390 0, 0, pv_init_iname, 5},
391 {{"Ri", (sizeof("Ri")-1)}, /* */
392 PVT_OTHER, pv_get_rcvip, 0,
394 {{"Rp", (sizeof("Rp")-1)}, /* */
395 PVT_OTHER, pv_get_rcvport, 0,
397 {{"Ru", (sizeof("Ru")-1)}, /* */
398 PVT_OTHER, pv_get_rcvaddr_uri, 0,
400 {{"Rut", (sizeof("Rut")-1)}, /* */
401 PVT_OTHER, pv_get_rcvaddr_uri_full, 0,
403 {{"RAi", (sizeof("RAi")-1)}, /* */
404 PVT_OTHER, pv_get_rcv_advertised_ip, 0,
406 {{"RAp", (sizeof("RAp")-1)}, /* */
407 PVT_OTHER, pv_get_rcv_advertised_port, 0,
409 {{"RAu", (sizeof("RAu")-1)}, /* */
410 PVT_OTHER, pv_get_rcvadv_uri, 0,
412 {{"RAut", (sizeof("RAut")-1)}, /* */
413 PVT_OTHER, pv_get_rcvadv_uri_full, 0,
415 {{"sas", (sizeof("sas")-1)}, /* */
416 PVT_OTHER, pv_get_srcaddr_socket, 0,
418 {{"sf", (sizeof("sf")-1)}, /* */
419 PVT_OTHER, pv_get_sflags, pv_set_sflags,
421 {{"sF", (sizeof("sF")-1)}, /* */
422 PVT_OTHER, pv_get_hexsflags, pv_set_sflags,
424 {{"Sf", (sizeof("sf")-1)}, /* */
425 PVT_OTHER, pv_get_sflag, pv_set_sflag,
426 pv_parse_flag_param, 0, 0, 0},
427 {{"src_ip", (sizeof("src_ip")-1)}, /* */
428 PVT_OTHER, pv_get_srcip, 0,
430 {{"si", (sizeof("si")-1)}, /* */
431 PVT_OTHER, pv_get_srcip, 0,
433 {{"siz", (sizeof("siz")-1)}, /* */
434 PVT_OTHER, pv_get_srcipz, 0,
436 { {"sid", (sizeof("sid")-1)}, /* server id */
437 PVT_OTHER, pv_get_server_id, 0,
439 {{"sp", (sizeof("sp")-1)}, /* */
440 PVT_OTHER, pv_get_srcport, 0,
442 {{"su", (sizeof("su")-1)}, /* */
443 PVT_OTHER, pv_get_srcaddr_uri, 0,
445 {{"sut", (sizeof("sut")-1)}, /* */
446 PVT_OTHER, pv_get_srcaddr_uri_full, 0,
448 {{"td", (sizeof("td")-1)}, /* */
449 PVT_OTHER, pv_get_to_attr, pv_set_to_domain,
450 0, 0, pv_init_iname, 3},
451 {{"to.domain", (sizeof("to.domain")-1)}, /* */
452 PVT_OTHER, pv_get_to_attr, pv_set_to_domain,
453 0, 0, pv_init_iname, 3},
454 {{"tn", (sizeof("tn")-1)}, /* */
455 PVT_OTHER, pv_get_to_attr, pv_set_to_display,
456 0, 0, pv_init_iname, 5},
457 {{"tt", (sizeof("tt")-1)}, /* */
458 PVT_OTHER, pv_get_to_attr, 0,
459 0, 0, pv_init_iname, 4},
460 {{"tu", (sizeof("tu")-1)}, /* */
461 PVT_TO, pv_get_to_attr, pv_set_to_uri,
462 0, 0, pv_init_iname, 1},
463 {{"to", (sizeof("to")-1)}, /* */
464 PVT_TO, pv_get_to_attr, pv_set_to_uri,
465 0, 0, pv_init_iname, 1},
466 {{"tU", (sizeof("tU")-1)}, /* */
467 PVT_OTHER, pv_get_to_attr, pv_set_to_username,
468 0, 0, pv_init_iname, 2},
469 {{"to.user", (sizeof("to.user")-1)}, /* */
470 PVT_OTHER, pv_get_to_attr, pv_set_to_username,
471 0, 0, pv_init_iname, 2},
472 {{"true", (sizeof("true")-1)}, /* */
473 PVT_OTHER, pv_get_true, 0,
475 {{"Tb", (sizeof("Tb")-1)}, /* */
476 PVT_OTHER, pv_get_timeb, 0,
478 {{"Tf", (sizeof("Tf")-1)}, /* */
479 PVT_CONTEXT, pv_get_timef, 0,
481 {{"TF", (sizeof("TF")-1)}, /* */
482 PVT_OTHER, pv_get_timenowf, 0,
484 {{"Ts", (sizeof("Ts")-1)}, /* */
485 PVT_CONTEXT, pv_get_times, 0,
487 {{"TS", (sizeof("TS")-1)}, /* */
488 PVT_OTHER, pv_get_timenows, 0,
490 {{"ua", (sizeof("ua")-1)}, /* */
491 PVT_OTHER, pv_get_useragent, 0,
493 {{"ruid", (sizeof("ruid")-1)}, /* */
494 PVT_OTHER, pv_get_ruid, 0,
496 {{"location_ua", (sizeof("location_ua")-1)}, /* */
497 PVT_OTHER, pv_get_location_ua, 0,
500 { {"shv", (sizeof("shv")-1)}, PVT_OTHER, pv_get_shvar,
501 pv_set_shvar, pv_parse_shvar_name, 0, 0, 0},
502 { {"time", (sizeof("time")-1)}, PVT_CONTEXT, pv_get_local_time,
503 0, pv_parse_time_name, 0, 0, 0},
504 { {"timef", (sizeof("timef")-1)}, PVT_CONTEXT, pv_get_local_strftime,
505 0, pv_parse_strftime_name, 0, 0, 0},
506 { {"utime", (sizeof("utime")-1)}, PVT_CONTEXT, pv_get_utc_time,
507 0, pv_parse_time_name, 0, 0, 0},
508 { {"utimef", (sizeof("utimef")-1)}, PVT_CONTEXT, pv_get_utc_strftime,
509 0, pv_parse_strftime_name, 0, 0, 0},
510 { {"TV", (sizeof("TV")-1)}, PVT_OTHER, pv_get_timeval,
511 0, pv_parse_timeval_name, 0, 0, 0},
512 { {"nh", (sizeof("nh")-1)}, PVT_OTHER, pv_get_nh,
513 0, pv_parse_nh_name, 0, 0, 0},
514 { {"version", (sizeof("version")-1)}, PVT_OTHER, pv_get_sr_version,
515 0, pv_parse_sr_version_name, 0, 0, 0},
516 { {"K", (sizeof("K")-1)}, PVT_OTHER, pv_get_K, 0,
517 pv_parse_K_name, 0, 0, 0 },
518 { {"expires", (sizeof("expires")-1)}, PVT_OTHER, pv_get_expires, 0,
519 pv_parse_expires_name, 0, 0, 0 },
520 { {"msg", (sizeof("msg")-1)}, PVT_OTHER, pv_get_msg_attrs, 0,
521 pv_parse_msg_attrs_name, 0, 0, 0 },
522 { {"ksr", (sizeof("ksr")-1)}, PVT_OTHER, pv_get_ksr_attrs, 0,
523 pv_parse_ksr_attrs_name, 0, 0, 0 },
525 { {0, 0}, 0, 0, 0, 0, 0, 0, 0 }
528 static int add_avp_aliases(modparam_t type, void* val);
530 static param_export_t params[]={
531 {"shvset", PARAM_STRING|USE_FUNC_PARAM, (void*)param_set_shvar },
532 {"varset", PARAM_STRING|USE_FUNC_PARAM, (void*)param_set_var },
533 {"avp_aliases", PARAM_STRING|USE_FUNC_PARAM, (void*)add_avp_aliases },
537 static int mod_init(void);
538 static void mod_destroy(void);
539 static int pv_isset(struct sip_msg* msg, char* pvid, char *foo);
540 static int pv_unset(struct sip_msg* msg, char* pvid, char *foo);
541 static int is_int(struct sip_msg* msg, char* pvar, char* s2);
542 static int pv_typeof(sip_msg_t *msg, char *pv, char *t);
543 static int pv_not_empty(sip_msg_t *msg, char *pv, char *s2);
544 static int w_xavp_copy(sip_msg_t *msg, char *src_name, char *src_idx, char *dst_name);
545 static int w_xavp_copy_dst(sip_msg_t *msg, char *src_name, char *src_idx,
546 char *dst_name, char *dst_idx);
547 static int w_xavp_params_explode(sip_msg_t *msg, char *pparams, char *pxname);
548 static int w_xavp_params_implode(sip_msg_t *msg, char *pxname, char *pvname);
549 static int w_xavp_child_seti(sip_msg_t *msg, char *prname, char *pcname,
551 static int w_xavp_child_sets(sip_msg_t *msg, char *prname, char *pcname,
553 static int w_xavp_rm(sip_msg_t *msg, char *prname, char *p2);
554 static int w_xavp_child_rm(sip_msg_t *msg, char *prname, char *pcname);
555 static int w_sbranch_set_ruri(sip_msg_t *msg, char p1, char *p2);
556 static int w_sbranch_append(sip_msg_t *msg, char p1, char *p2);
557 static int w_sbranch_reset(sip_msg_t *msg, char p1, char *p2);
558 static int w_var_to_xavp(sip_msg_t *msg, char *p1, char *p2);
559 static int w_xavp_to_var(sip_msg_t *msg, char *p1);
561 int pv_xavp_copy_fixup(void** param, int param_no);
562 int pv_evalx_fixup(void** param, int param_no);
563 int w_pv_evalx(struct sip_msg *msg, char *dst, str *fmt);
565 static int fixup_xavp_child_seti(void** param, int param_no);
566 static int fixup_free_xavp_child_seti(void** param, int param_no);
568 static int pv_init_rpc(void);
569 int pv_register_api(pv_api_t*);
571 static cmd_export_t cmds[]={
572 {"pv_isset", (cmd_function)pv_isset, 1, fixup_pvar_null, 0,
574 {"pv_unset", (cmd_function)pv_unset, 1, fixup_pvar_null, 0,
576 {"pv_xavp_print", (cmd_function)pv_xavp_print, 0, 0, 0,
578 {"pv_xavu_print", (cmd_function)pv_xavu_print, 0, 0, 0,
580 {"pv_var_to_xavp", (cmd_function)w_var_to_xavp, 2, fixup_spve_spve,
581 fixup_free_spve_spve, ANY_ROUTE },
582 {"pv_xavp_to_var", (cmd_function)w_xavp_to_var, 1, fixup_spve_null,
583 fixup_free_spve_null, ANY_ROUTE },
584 {"is_int", (cmd_function)is_int, 1, fixup_pvar_null, fixup_free_pvar_null,
586 {"typeof", (cmd_function)pv_typeof, 2, fixup_pvar_none,
587 fixup_free_pvar_none,
589 {"not_empty", (cmd_function)pv_not_empty, 1, fixup_pvar_null,
590 fixup_free_pvar_null,
592 {"xavp_params_explode", (cmd_function)w_xavp_params_explode,
593 2, fixup_spve_spve, fixup_free_spve_spve,
595 {"xavp_copy", (cmd_function)w_xavp_copy, 3, pv_xavp_copy_fixup, 0,
597 {"xavp_copy", (cmd_function)w_xavp_copy_dst, 4, pv_xavp_copy_fixup, 0,
599 {"xavp_params_implode", (cmd_function)w_xavp_params_implode,
600 2, fixup_spve_str, fixup_free_spve_str,
602 {"xavp_child_seti", (cmd_function)w_xavp_child_seti,
603 3, fixup_xavp_child_seti, fixup_free_xavp_child_seti,
605 {"xavp_child_sets", (cmd_function)w_xavp_child_sets,
606 3, fixup_spve_all, fixup_free_spve_all,
608 {"xavp_rm", (cmd_function)w_xavp_rm,
609 1, fixup_spve_null, fixup_free_spve_null,
611 {"xavp_child_rm", (cmd_function)w_xavp_child_rm,
612 2, fixup_spve_spve, fixup_free_spve_spve,
614 {"sbranch_set_ruri", (cmd_function)w_sbranch_set_ruri, 0, 0, 0,
616 {"sbranch_append", (cmd_function)w_sbranch_append, 0, 0, 0,
618 {"sbranch_reset", (cmd_function)w_sbranch_reset, 0, 0, 0,
620 {"pv_evalx", (cmd_function)w_pv_evalx, 2, pv_evalx_fixup,
623 {"pv_register_api", (cmd_function)pv_register_api, NO_SCRIPT, 0, 0},
629 /** module exports */
630 struct module_exports exports= {
631 "pv", /* module name */
632 DEFAULT_DLFLAGS, /* dlopen flags */
633 cmds, /* cmd (cfg function) exports */
634 params, /* param exports */
635 0, /* RPC method exports */
636 mod_pvs, /* pv exports */
637 0, /* response handling function */
638 mod_init, /* module init function */
639 0, /* per-child init function */
640 mod_destroy /* module destroy function */
643 static int mod_init(void)
647 LM_ERR("failed to register RPC commands\n");
655 static void mod_destroy(void)
657 shvar_destroy_locks();
661 static int pv_isset(struct sip_msg* msg, char* pvid, char *foo)
667 sp = (pv_spec_t*)pvid;
668 if(pv_get_spec_value(msg, sp, &value)!=0)
671 if(value.flags & (PV_VAL_EMPTY|PV_VAL_NULL))
673 pv_value_destroy(&value);
677 static int pv_unset(struct sip_msg* msg, char* pvid, char *foo)
681 sp = (pv_spec_t*)pvid;
682 if(pv_set_spec_value(msg, sp, 0, NULL)<0) {
683 LM_ERR("faile to unset variable\n");
690 static int add_avp_aliases(modparam_t type, void* val)
692 if (val!=0 && ((char*)val)[0]!=0)
694 if ( add_avp_galias_str((char*)val)!=0 )
702 * match the type of the variable value
704 static int pv_typeof(sip_msg_t *msg, char *pv, char *t)
708 if (pv==NULL || t==NULL)
710 if(pv_get_spec_value(msg, (pv_spec_t*)pv, &val) != 0)
716 if(val.flags & PV_TYPE_INT)
721 if(val.flags & PV_VAL_NULL)
726 if(!(val.flags & PV_VAL_STR))
728 if(val.flags & PV_TYPE_INT)
737 * return true if the type is string and value not empty
739 static int pv_not_empty(sip_msg_t *msg, char *pv, char *s2)
746 if(pv_get_spec_value(msg, (pv_spec_t*)pv, &val) != 0)
749 if(!(val.flags & PV_VAL_STR))
751 if(val.flags & PV_TYPE_INT)
761 * Copyright (C) 2011 Juha Heinanen
763 * Checks if pvar argument contains int value
765 static int is_int(struct sip_msg* msg, char* pvar, char* s2)
770 pvar_sp = (pv_spec_t *)pvar;
772 if (pvar_sp && (pv_get_spec_value(msg, pvar_sp, &pv_val) == 0)) {
773 return (pv_val.flags & PV_VAL_INT)?1:-1;
780 * script variable to xavp
782 static int w_var_to_xavp(sip_msg_t *msg, char *s1, char *s2)
784 str xname = STR_NULL;
785 str varname = STR_NULL;
787 if(fixup_get_svalue(msg, (gparam_t*)s1, &varname)<0) {
788 LM_ERR("failed to get the var name\n");
791 if(fixup_get_svalue(msg, (gparam_t*)s2, &xname)<0) {
792 LM_ERR("failed to get the xavp name\n");
796 return pv_var_to_xavp(&varname, &xname);
799 static int ki_var_to_xavp(sip_msg_t *msg, str *varname, str *xname)
801 return pv_var_to_xavp(varname, xname);
805 * xavp to script variable
807 static int w_xavp_to_var(sip_msg_t *msg, char *s1)
809 str xname = STR_NULL;
811 if(fixup_get_svalue(msg, (gparam_t*)s1, &xname)<0) {
812 LM_ERR("failed to get the xavp name\n");
816 return pv_xavp_to_var(&xname);
819 static int ki_xavp_to_var(sip_msg_t *msg, str *xname)
821 return pv_xavp_to_var(xname);
824 static int ki_xavp_print(sip_msg_t* msg)
826 xavp_print_list(NULL);
830 static int ki_xavu_print(sip_msg_t* msg)
832 xavu_print_list(NULL);
839 static int ki_xavp_copy_dst_mode(str *src_name, int src_idx, str *dst_name,
840 int dst_idx, int dimode)
842 sr_xavp_t *src_xavp = NULL;
843 sr_xavp_t *dst_xavp = NULL;
844 sr_xavp_t *new_xavp = NULL;
845 sr_xavp_t *prev_xavp = NULL;
847 src_xavp = xavp_get_by_index(src_name, src_idx, NULL);
849 LM_ERR("missing can not find source xavp [%.*s]\n",
850 src_name->len, src_name->s);
854 LM_DBG("dst_name xavp [%.*s]\n", dst_name->len, dst_name->s);
855 new_xavp = xavp_clone_level_nodata_with_new_name(src_xavp, dst_name);
857 LM_ERR("error cloning xavp\n");
862 dst_xavp = xavp_get_by_index(dst_name, dst_idx, NULL);
864 LM_ERR("xavp_copy: missing can not find destination xavp [%.*s]\n",
865 dst_name->len, dst_name->s);
866 xavp_destroy_list(&new_xavp);
870 LM_DBG("xavp_copy(replace): $xavp(%.*s[%d]) >> $xavp(%.*s[%d])\n",
871 src_name->len, src_name->s, src_idx,
872 dst_name->len, dst_name->s, dst_idx);
874 if(xavp_add(new_xavp, NULL)<0) {
875 LM_ERR("error adding new xavp\n");
876 xavp_destroy_list(&new_xavp);
880 prev_xavp = xavp_get_by_index(dst_name, dst_idx-1, NULL);
882 LM_ERR("error inserting xavp, parent not found $xavp(%.*s[%d])\n",
883 dst_name->len, dst_name->s, dst_idx);
884 xavp_destroy_list(&new_xavp);
887 xavp_add_after(new_xavp, prev_xavp);
889 if(xavp_rm(dst_xavp, NULL)<0) {
890 LM_ERR("can not remove the exiting index $xavp(%.*s[%d])\n",
891 dst_name->len, dst_name->s, dst_idx);
895 /* check if destination exists,
896 * if it does we will append, similar to XAVP assigment */
897 dst_xavp = xavp_get(dst_name, NULL);
899 LM_DBG("xavp_copy(new): $xavp(%.*s[%d]) >> $xavp(%.*s)\n",
900 src_name->len, src_name->s, src_idx, dst_name->len,
902 if(xavp_add(new_xavp, NULL)<0) {
903 LM_ERR("error adding new xavp\n");
904 xavp_destroy_list(&dst_xavp);
908 LM_DBG("xavp_copy(append): $xavp(%.*s[%d]) >> $xavp(%.*s)\n",
909 src_name->len, src_name->s, src_idx,
910 dst_name->len, dst_name->s);
911 if(xavp_add_last(new_xavp, &dst_xavp)<0) {
912 LM_ERR("error appending new xavp\n");
913 xavp_destroy_list(&dst_xavp);
924 static int ki_xavp_copy(sip_msg_t *msg, str *src_name, int src_idx, str *dst_name)
926 return ki_xavp_copy_dst_mode(src_name, src_idx, dst_name, 0, 0);
932 static int ki_xavp_copy_dst(sip_msg_t *msg, str *src_name, int src_idx,
933 str *dst_name, int dst_idx)
935 return ki_xavp_copy_dst_mode(src_name, src_idx, dst_name, dst_idx, 0);
941 static int w_xavp_copy(sip_msg_t *msg, char *_src_name, char *_src_idx, char *_dst_name)
943 return w_xavp_copy_dst(msg, _src_name, _src_idx, _dst_name, NULL);
949 static int w_xavp_copy_dst(sip_msg_t *msg, char *_src_name, char *_src_idx,
950 char *_dst_name, char *_dst_idx)
958 if(get_str_fparam(&src_name, msg, (gparam_p)_src_name) != 0) {
959 LM_ERR("xavp_copy: missing source\n");
962 if(get_str_fparam(&dst_name, msg, (gparam_p)_dst_name) != 0) {
963 LM_ERR("xavp_copy: missing destination\n");
966 if(get_int_fparam(&src_idx, msg, (gparam_t*)_src_idx)<0) {
967 LM_ERR("failed to get the src_idx value\n");
972 if(get_int_fparam(&dst_idx, msg, (gparam_t*)_dst_idx)<0) {
973 LM_ERR("failed to get the dst_idx value\n");
980 return ki_xavp_copy_dst_mode(&src_name, src_idx, &dst_name, dst_idx, dimode);
986 static int w_xavp_params_explode(sip_msg_t *msg, char *pparams, char *pxname)
991 if(fixup_get_svalue(msg, (gparam_t*)pparams, &sparams)!=0) {
992 LM_ERR("cannot get the params\n");
995 if(fixup_get_svalue(msg, (gparam_t*)pxname, &sxname)!=0) {
996 LM_ERR("cannot get the xavp name\n");
1000 if(xavp_params_explode(&sparams, &sxname)<0)
1009 static int ki_xavp_params_explode(sip_msg_t *msg, str *sparams, str *sxname)
1011 if(xavp_params_explode(sparams, sxname)<0)
1020 static int ki_xavp_params_implode(sip_msg_t *msg, str *sxname, str *svname)
1022 pv_spec_t *vspec=NULL;
1025 if(sxname==NULL || sxname->s==NULL || sxname->len<=0) {
1026 LM_ERR("invalid xavp name\n");
1029 if(svname==NULL || svname->s==NULL || svname->len<=0) {
1030 LM_ERR("invalid output var name\n");
1034 vspec = pv_cache_get(svname);
1036 LM_ERR("cannot get pv spec for [%.*s]\n", svname->len, svname->s);
1039 if(vspec->setf==NULL) {
1040 LM_ERR("read only output variable [%.*s]\n", svname->len, svname->s);
1044 val.rs.s = pv_get_buffer();
1045 val.rs.len = xavp_serialize_fields(sxname, val.rs.s, pv_get_buffer_size());
1050 val.flags = PV_VAL_STR;
1051 if(vspec->setf(msg, &vspec->pvp, EQ_T, &val)<0) {
1052 LM_ERR("setting PV failed [%.*s]\n", svname->len, svname->s);
1062 static int w_xavp_params_implode(sip_msg_t *msg, char *pxname, char *pvname)
1066 if(fixup_get_svalue(msg, (gparam_t*)pxname, &sxname)!=0) {
1067 LM_ERR("cannot get the xavp name\n");
1071 return ki_xavp_params_implode(msg, &sxname, (str*)pvname);
1077 static int ki_xavp_seti(sip_msg_t *msg, str *rname, int ival)
1079 sr_xavp_t *xavp = NULL;
1082 memset(&xval, 0, sizeof(sr_xval_t));
1083 xval.type = SR_XTYPE_INT;
1086 xavp = xavp_add_value(rname, &xval, NULL);
1088 return (xavp!=NULL)?1:-1;
1094 static int ki_xavp_sets(sip_msg_t *msg, str *rname, str *sval)
1096 sr_xavp_t *xavp = NULL;
1099 memset(&xval, 0, sizeof(sr_xval_t));
1100 xval.type = SR_XTYPE_STR;
1103 xavp = xavp_add_value(rname, &xval, NULL);
1105 return (xavp!=NULL)?1:-1;
1111 static int ki_xavp_child_seti(sip_msg_t *msg, str *rname, str *cname,
1116 ret = xavp_set_child_ival(rname, cname, ival);
1118 return (ret<0)?ret:1;
1124 static int w_xavp_child_seti(sip_msg_t *msg, char *prname, char *pcname,
1127 str rname = STR_NULL;
1128 str cname = STR_NULL;
1131 if(fixup_get_svalue(msg, (gparam_t*)prname, &rname)<0) {
1132 LM_ERR("failed to get root xavp name\n");
1135 if(fixup_get_svalue(msg, (gparam_t*)pcname, &cname)<0) {
1136 LM_ERR("failed to get child xavp name\n");
1139 if(fixup_get_ivalue(msg, (gparam_t*)pval, &ival)<0) {
1140 LM_ERR("failed to get the value\n");
1144 return ki_xavp_child_seti(msg, &rname, &cname, ival);
1150 static int ki_xavp_child_sets(sip_msg_t *msg, str *rname, str *cname,
1155 ret = xavp_set_child_sval(rname, cname, sval);
1157 return (ret<0)?ret:1;
1163 static int w_xavp_child_sets(sip_msg_t *msg, char *prname, char *pcname,
1170 if(fixup_get_svalue(msg, (gparam_t*)prname, &rname)<0) {
1171 LM_ERR("failed to get root xavp name\n");
1174 if(fixup_get_svalue(msg, (gparam_t*)pcname, &cname)<0) {
1175 LM_ERR("failed to get child xavp name\n");
1178 if(fixup_get_svalue(msg, (gparam_t*)pval, &sval)<0) {
1179 LM_ERR("failed to get the value\n");
1183 return ki_xavp_child_sets(msg, &rname, &cname, &sval);
1189 static int fixup_xavp_child_seti(void** param, int param_no)
1191 if(param_no==1 || param_no==2)
1192 return fixup_spve_all(param, param_no);
1194 return fixup_igp_all(param, param_no);
1201 static int fixup_free_xavp_child_seti(void** param, int param_no)
1203 if(param_no==1 || param_no==2)
1204 return fixup_free_spve_all(param, param_no);
1206 return fixup_free_igp_all(param, param_no);
1214 static int ki_xavp_rm(sip_msg_t *msg, str *rname)
1218 ret = xavp_rm_by_index(rname, 0, NULL);
1220 return (ret==0)?1:ret;
1226 static int w_xavp_rm(sip_msg_t *msg, char *prname, char *p2)
1230 if(fixup_get_svalue(msg, (gparam_t*)prname, &rname)<0) {
1231 LM_ERR("failed to get root xavp name\n");
1235 return ki_xavp_rm(msg, &rname);
1241 static int ki_xavp_child_rm(sip_msg_t *msg, str *rname, str *cname)
1245 ret = xavp_rm_child_by_index(rname, cname, 0);
1247 return (ret==0)?1:ret;
1253 static int w_xavp_child_rm(sip_msg_t *msg, char *prname, char *pcname)
1258 if(fixup_get_svalue(msg, (gparam_t*)prname, &rname)<0) {
1259 LM_ERR("failed to get root xavp name\n");
1262 if(fixup_get_svalue(msg, (gparam_t*)pcname, &cname)<0) {
1263 LM_ERR("failed to get child xavp name\n");
1267 return ki_xavp_child_rm(msg, &rname, &cname);
1273 static int ki_xavp_is_null(sip_msg_t *msg, str *rname)
1275 sr_xavp_t *xavp=NULL;
1277 xavp = xavp_get_by_index(rname, 0, NULL);
1281 if(xavp->val.type == SR_XTYPE_NULL) {
1290 static sr_kemi_xval_t _sr_kemi_pv_xval = {0};
1295 static sr_kemi_xval_t* ki_xavp_get_xval(sr_xavp_t *xavp, int rmode)
1297 static char _pv_ki_xavp_buf[128];
1299 switch(xavp->val.type) {
1301 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1302 return &_sr_kemi_pv_xval;
1305 _sr_kemi_pv_xval.vtype = SR_KEMIP_INT;
1306 _sr_kemi_pv_xval.v.n = xavp->val.v.i;
1307 return &_sr_kemi_pv_xval;
1310 _sr_kemi_pv_xval.vtype = SR_KEMIP_STR;
1311 _sr_kemi_pv_xval.v.s = xavp->val.v.s;
1312 return &_sr_kemi_pv_xval;
1315 if(snprintf(_pv_ki_xavp_buf, 128, "%lu", (long unsigned)xavp->val.v.t)<0) {
1316 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1317 return &_sr_kemi_pv_xval;
1321 if(snprintf(_pv_ki_xavp_buf, 128, "%ld", (long unsigned)xavp->val.v.l)<0) {
1322 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1323 return &_sr_kemi_pv_xval;
1326 case SR_XTYPE_LLONG:
1327 if(snprintf(_pv_ki_xavp_buf, 128, "%lld", xavp->val.v.ll)<0) {
1328 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1329 return &_sr_kemi_pv_xval;
1333 if(snprintf(_pv_ki_xavp_buf, 128, "<<xavp:%p>>", xavp->val.v.xavp)<0) {
1334 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1335 return &_sr_kemi_pv_xval;
1339 if(snprintf(_pv_ki_xavp_buf, 128, "<<data:%p>>", xavp->val.v.data)<0) {
1340 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1341 return &_sr_kemi_pv_xval;
1345 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1346 return &_sr_kemi_pv_xval;
1349 _sr_kemi_pv_xval.vtype = SR_KEMIP_STR;
1350 _sr_kemi_pv_xval.v.s.s = _pv_ki_xavp_buf;
1351 _sr_kemi_pv_xval.v.s.len = strlen(_pv_ki_xavp_buf);
1352 return &_sr_kemi_pv_xval;
1358 static sr_kemi_xval_t* ki_xavp_get_mode(sip_msg_t *msg, str *rname, int rmode)
1360 sr_xavp_t *xavp=NULL;
1362 memset(&_sr_kemi_pv_xval, 0, sizeof(sr_kemi_xval_t));
1364 xavp = xavp_get_by_index(rname, 0, NULL);
1366 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1367 return &_sr_kemi_pv_xval;
1370 return ki_xavp_get_xval(xavp, rmode);
1376 static sr_kemi_xval_t* ki_xavp_get(sip_msg_t *msg, str *rname)
1378 return ki_xavp_get_mode(msg, rname, SR_KEMI_XVAL_NULL_NONE);
1384 static sr_kemi_xval_t* ki_xavp_gete(sip_msg_t *msg, str *rname)
1386 return ki_xavp_get_mode(msg, rname, SR_KEMI_XVAL_NULL_EMPTY);
1392 static sr_kemi_xval_t* ki_xavp_getw(sip_msg_t *msg, str *rname)
1394 return ki_xavp_get_mode(msg, rname, SR_KEMI_XVAL_NULL_PRINT);
1397 sr_kemi_dict_item_t* ki_xavp_dict(sr_xavp_t *xavp);
1399 * SR_KEMIP_ARRAY with values of xavp=>name
1401 sr_kemi_dict_item_t* ki_xavp_dict_name(sr_xavp_t *xavp, str name)
1403 sr_kemi_dict_item_t *ini = NULL;
1404 sr_kemi_dict_item_t *val;
1405 sr_kemi_dict_item_t *last = NULL;
1406 sr_xavp_t *avp = xavp;
1408 ini = (sr_kemi_dict_item_t*)pkg_malloc(sizeof(sr_kemi_dict_item_t));
1413 memset(ini, 0, sizeof(sr_kemi_xval_t));
1414 ini->vtype = SR_KEMIP_ARRAY;
1415 while(avp!=NULL&&!STR_EQ(avp->name,name))
1421 switch(avp->val.type) {
1425 val = (sr_kemi_dict_item_t*)pkg_malloc(sizeof(sr_kemi_dict_item_t));
1430 memset(val, 0, sizeof(sr_kemi_xval_t));
1433 switch(avp->val.type) {
1435 val->vtype = SR_KEMIP_NULL;
1438 val->vtype = SR_KEMIP_INT;
1439 val->v.n = avp->val.v.i;
1442 val->vtype = SR_KEMIP_STR;
1443 val->v.s.s = avp->val.v.s.s;
1444 val->v.s.len = avp->val.v.s.len;
1448 case SR_XTYPE_LLONG:
1450 val->vtype = SR_KEMIP_NULL;
1451 LM_WARN("XAVP type:%d value not supported\n", avp->val.type);
1454 val = ki_xavp_dict(avp->val.v.xavp);
1457 val->vtype = SR_KEMIP_NULL;
1458 LM_ERR("xavp:%.*s unknown type: %d\n",
1459 avp->name.len, avp->name.s, avp->val.type);
1468 avp = xavp_get_next(avp);
1481 * SR_KEMIP_DICT of xavp
1483 sr_kemi_dict_item_t* ki_xavp_dict(sr_xavp_t *xavp) {
1484 sr_xavp_t *avp = NULL;
1485 struct str_list *keys;
1487 sr_kemi_dict_item_t *val;
1488 sr_kemi_dict_item_t *ini = NULL;
1489 sr_kemi_dict_item_t *last = NULL;
1491 if(xavp->val.type!=SR_XTYPE_XAVP) {
1492 LM_ERR("%s not xavp?\n", xavp->name.s);
1495 avp = xavp->val.v.xavp;
1496 if((keys = xavp_get_list_key_names(xavp)) != NULL) {
1498 val = (sr_kemi_dict_item_t*)pkg_malloc(sizeof(sr_kemi_dict_item_t));
1503 memset(val, 0, sizeof(sr_kemi_xval_t));
1504 val->vtype = SR_KEMIP_DICT;
1505 val->name.s = keys->s.s;
1506 val->name.len = keys->s.len;
1507 val->v.dict = ki_xavp_dict_name(avp, keys->s);
1517 } while(keys!=NULL);
1537 static sr_kemi_xval_t*
1538 ki_xavp_getd_helper(sip_msg_t *msg, str *rname, int *_indx)
1540 sr_xavp_t *xavp=NULL;
1543 sr_kemi_dict_item_t *val;
1544 sr_kemi_dict_item_t *last = NULL;
1546 memset(&_sr_kemi_pv_xval, 0, sizeof(sr_kemi_xval_t));
1549 /* we're going to retrive just one */
1550 _sr_kemi_pv_xval.vtype = SR_KEMIP_DICT;
1552 /* we're going to retrive all */
1553 _sr_kemi_pv_xval.vtype = SR_KEMIP_ARRAY;
1555 xavp_size = xavp_count(rname, NULL);
1558 if((indx*-1)>xavp_size)
1560 sr_kemi_xval_null(&_sr_kemi_pv_xval, SR_KEMI_XVAL_NULL_NONE);
1561 return &_sr_kemi_pv_xval;
1563 indx = xavp_size + indx;
1566 xavp = xavp_get_by_index(rname, indx, NULL);
1568 sr_kemi_xval_null(&_sr_kemi_pv_xval, SR_KEMI_XVAL_NULL_NONE);
1569 return &_sr_kemi_pv_xval;
1572 val = ki_xavp_dict(xavp);
1576 _sr_kemi_pv_xval.v.dict = val;
1583 xavp = xavp_get_by_index(rname, indx, NULL);
1585 } while(xavp!=NULL);
1586 return &_sr_kemi_pv_xval;
1592 static sr_kemi_xval_t*
1593 ki_xavp_getd(sip_msg_t *msg, str *rname)
1595 return ki_xavp_getd_helper(msg, rname, NULL);
1601 static sr_kemi_xval_t*
1602 ki_xavp_getd_p1(sip_msg_t *msg, str *rname, int indx)
1604 return ki_xavp_getd_helper(msg, rname, &indx);
1610 static sr_kemi_xval_t*
1611 ki_xavp_get_keys(sip_msg_t *msg, str *rname, int indx) {
1612 sr_xavp_t *xavp=NULL;
1613 struct str_list *keys, *k;
1614 sr_kemi_dict_item_t *val;
1615 sr_kemi_dict_item_t *last = NULL;
1617 memset(&_sr_kemi_pv_xval, 0, sizeof(sr_kemi_xval_t));
1619 xavp = xavp_get_by_index(rname, indx, NULL);
1621 sr_kemi_xval_null(&_sr_kemi_pv_xval, SR_KEMI_XVAL_NULL_NONE);
1622 return &_sr_kemi_pv_xval;
1624 keys = xavp_get_list_key_names(xavp);
1625 _sr_kemi_pv_xval.vtype = SR_KEMIP_ARRAY;
1628 val = (sr_kemi_dict_item_t*)pkg_malloc(sizeof(sr_kemi_dict_item_t));
1633 memset(val, 0, sizeof(sr_kemi_xval_t));
1634 val->vtype = SR_KEMIP_STR;
1635 val->v.s.len = k->s.len;
1636 val->v.s.s = k->s.s;
1642 _sr_kemi_pv_xval.v.dict = val;
1646 return &_sr_kemi_pv_xval;
1653 last = _sr_kemi_pv_xval.v.dict;
1659 sr_kemi_xval_null(&_sr_kemi_pv_xval, SR_KEMI_XVAL_NULL_NONE);
1660 return &_sr_kemi_pv_xval;
1666 static int ki_xavp_child_is_null(sip_msg_t *msg, str *rname, str *cname)
1668 sr_xavp_t *xavp=NULL;
1670 xavp = xavp_get_by_index(rname, 0, NULL);
1674 if(xavp->val.type != SR_XTYPE_XAVP) {
1677 xavp = xavp_get_by_index(cname, 0, &xavp->val.v.xavp);
1681 if(xavp->val.type == SR_XTYPE_NULL) {
1690 static sr_kemi_xval_t* ki_xavp_child_get_mode(sip_msg_t *msg, str *rname,
1691 str *cname, int rmode)
1693 sr_xavp_t *xavp=NULL;
1695 memset(&_sr_kemi_pv_xval, 0, sizeof(sr_kemi_xval_t));
1697 xavp = xavp_get_by_index(rname, 0, NULL);
1699 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1700 return &_sr_kemi_pv_xval;
1703 if(xavp->val.type != SR_XTYPE_XAVP) {
1704 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1705 return &_sr_kemi_pv_xval;
1708 xavp = xavp_get_by_index(cname, 0, &xavp->val.v.xavp);
1710 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1711 return &_sr_kemi_pv_xval;
1714 return ki_xavp_get_xval(xavp, rmode);
1720 static sr_kemi_xval_t* ki_xavp_child_get(sip_msg_t *msg, str *rname, str *cname)
1722 return ki_xavp_child_get_mode(msg, rname, cname, SR_KEMI_XVAL_NULL_NONE);
1729 static sr_kemi_xval_t* ki_xavp_child_gete(sip_msg_t *msg, str *rname, str *cname)
1731 return ki_xavp_child_get_mode(msg, rname, cname, SR_KEMI_XVAL_NULL_EMPTY);
1738 static sr_kemi_xval_t* ki_xavp_child_getw(sip_msg_t *msg, str *rname, str *cname)
1740 return ki_xavp_child_get_mode(msg, rname, cname, SR_KEMI_XVAL_NULL_PRINT);
1746 static int ki_xavu_is_null(sip_msg_t *msg, str *rname)
1748 sr_xavp_t *xavu=NULL;
1750 xavu = xavu_lookup(rname, NULL);
1754 if(xavu->val.type == SR_XTYPE_NULL) {
1763 static int ki_xavu_rm(sip_msg_t *msg, str *rname)
1767 ret = xavu_rm_by_name(rname, NULL);
1769 return (ret==0)?1:ret;
1775 static int ki_xavu_child_rm(sip_msg_t *msg, str *rname, str *cname)
1779 ret = xavu_rm_child_by_name(rname, cname);
1781 return (ret==0)?1:ret;
1787 static int ki_xavu_seti(sip_msg_t *msg, str *rname, int ival)
1789 sr_xavp_t *xavp = NULL;
1791 xavp = xavu_set_ival(rname, ival);
1793 return (xavp!=NULL)?1:-1;
1799 static int ki_xavu_sets(sip_msg_t *msg, str *rname, str *sval)
1801 sr_xavp_t *xavp = NULL;
1803 xavp = xavu_set_sval(rname, sval);
1805 return (xavp!=NULL)?1:-1;
1811 static int ki_xavu_child_seti(sip_msg_t *msg, str *rname, str *cname,
1814 sr_xavp_t *xavu = NULL;
1816 xavu = xavu_set_child_ival(rname, cname, ival);
1818 return (xavu!=NULL)?1:-1;
1824 static int ki_xavu_child_sets(sip_msg_t *msg, str *rname, str *cname,
1827 sr_xavp_t *xavu = NULL;
1829 xavu = xavu_set_child_sval(rname, cname, sval);
1831 return (xavu!=NULL)?1:-1;
1837 static sr_kemi_xval_t* ki_xavu_get_mode(sip_msg_t *msg, str *rname, int rmode)
1839 sr_xavp_t *xavu=NULL;
1841 memset(&_sr_kemi_pv_xval, 0, sizeof(sr_kemi_xval_t));
1843 xavu = xavu_lookup(rname, NULL);
1845 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1846 return &_sr_kemi_pv_xval;
1849 return ki_xavp_get_xval(xavu, rmode);
1855 static sr_kemi_xval_t* ki_xavu_get(sip_msg_t *msg, str *rname)
1857 return ki_xavu_get_mode(msg, rname, SR_KEMI_XVAL_NULL_NONE);
1863 static sr_kemi_xval_t* ki_xavu_gete(sip_msg_t *msg, str *rname)
1865 return ki_xavu_get_mode(msg, rname, SR_KEMI_XVAL_NULL_EMPTY);
1871 static sr_kemi_xval_t* ki_xavu_getw(sip_msg_t *msg, str *rname)
1873 return ki_xavu_get_mode(msg, rname, SR_KEMI_XVAL_NULL_PRINT);
1879 static int ki_xavu_child_is_null(sip_msg_t *msg, str *rname, str *cname)
1881 sr_xavp_t *xavu=NULL;
1883 xavu = xavp_get_by_index(rname, 0, NULL);
1887 if(xavu->val.type != SR_XTYPE_XAVP) {
1890 xavu = xavp_get_by_index(cname, 0, &xavu->val.v.xavp);
1894 if(xavu->val.type == SR_XTYPE_NULL) {
1903 static sr_kemi_xval_t* ki_xavu_child_get_mode(sip_msg_t *msg, str *rname,
1904 str *cname, int rmode)
1906 sr_xavp_t *xavu=NULL;
1908 memset(&_sr_kemi_pv_xval, 0, sizeof(sr_kemi_xval_t));
1910 xavu = xavu_lookup(rname, NULL);
1912 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1913 return &_sr_kemi_pv_xval;
1916 if(xavu->val.type != SR_XTYPE_XAVP) {
1917 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1918 return &_sr_kemi_pv_xval;
1921 xavu = xavp_get_by_index(cname, 0, &xavu->val.v.xavp);
1923 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
1924 return &_sr_kemi_pv_xval;
1927 return ki_xavp_get_xval(xavu, rmode);
1933 static sr_kemi_xval_t* ki_xavu_child_get(sip_msg_t *msg, str *rname, str *cname)
1935 return ki_xavu_child_get_mode(msg, rname, cname, SR_KEMI_XVAL_NULL_NONE);
1942 static sr_kemi_xval_t* ki_xavu_child_gete(sip_msg_t *msg, str *rname, str *cname)
1944 return ki_xavu_child_get_mode(msg, rname, cname, SR_KEMI_XVAL_NULL_EMPTY);
1951 static sr_kemi_xval_t* ki_xavu_child_getw(sip_msg_t *msg, str *rname, str *cname)
1953 return ki_xavu_child_get_mode(msg, rname, cname, SR_KEMI_XVAL_NULL_PRINT);
1959 static int w_sbranch_set_ruri(sip_msg_t *msg, char p1, char *p2)
1961 if(sbranch_set_ruri(msg)<0)
1969 static int w_sbranch_append(sip_msg_t *msg, char p1, char *p2)
1971 if(sbranch_append(msg)<0)
1979 static int w_sbranch_reset(sip_msg_t *msg, char p1, char *p2)
1981 if(sbranch_reset()<0)
1989 static int ki_sbranch_set_ruri(sip_msg_t *msg)
1991 if(sbranch_set_ruri(msg)<0)
1999 static int ki_sbranch_append(sip_msg_t *msg)
2001 if(sbranch_append(msg)<0)
2009 static int ki_sbranch_reset(sip_msg_t *msg)
2011 if(sbranch_reset()<0)
2016 int pv_xavp_copy_fixup(void **param, int param_no)
2018 if(param_no == 1 || param_no == 3)
2019 return fixup_var_str_12(param, param_no);
2020 if (param_no == 2 || param_no == 4)
2021 return fixup_var_int_12(param, param_no);
2022 LM_ERR("invalid parameter count [%d]\n", param_no);
2026 int pv_evalx_fixup(void** param, int param_no)
2028 pv_spec_t *spec=NULL;
2029 pv_elem_t *pvmodel=NULL;
2033 spec = (pv_spec_t*)pkg_malloc(sizeof(pv_spec_t));
2035 LM_ERR("out of pkg\n");
2038 memset(spec, 0, sizeof(pv_spec_t));
2039 tstr.s = (char*)(*param);
2040 tstr.len = strlen(tstr.s);
2041 if(pv_parse_spec(&tstr, spec)==NULL) {
2042 LM_ERR("unknown script variable in first parameter\n");
2046 if(!pv_is_w(spec)) {
2047 LM_ERR("read-only script variable in first parameter\n");
2052 } else if(param_no==2) {
2054 tstr.s = (char*)(*param);
2055 tstr.len = strlen(tstr.s);
2056 if(pv_parse_format(&tstr, &pvmodel)<0) {
2057 LM_ERR("error in second parameter\n");
2068 int w_pv_evalx(struct sip_msg *msg, char *dst, str *fmt)
2070 pv_spec_t *ispec=NULL;
2071 pv_elem_t *imodel=NULL;
2075 ispec = (pv_spec_t*)dst;
2077 imodel = (pv_elem_t*)fmt;
2079 memset(&val, 0, sizeof(pv_value_t));
2081 if(pv_printf_s(msg, imodel, &tstr)!=0) {
2082 LM_ERR("cannot eval second parameter\n");
2086 LM_DBG("preparing to evaluate: [%.*s]\n", tstr.len, tstr.s);
2087 if(pv_eval_str(msg, &val.rs, &tstr)<0){
2088 LM_ERR("cannot eval reparsed value of second parameter\n");
2092 val.flags = PV_VAL_STR;
2093 if(ispec->setf(msg, &ispec->pvp, EQ_T, &val)<0) {
2094 LM_ERR("setting PV failed\n");
2106 int ki_pv_evalx(sip_msg_t *msg, str *dst, str *fmt)
2109 pv_spec_t *ispec=NULL;
2111 if(dst==NULL || dst->s==NULL || dst->len<=0) {
2112 LM_ERR("invalid destination var name\n");
2115 ispec = pv_cache_get(dst);
2117 LM_ERR("cannot get pv spec for [%.*s]\n", dst->len, dst->s);
2121 memset(&val, 0, sizeof(pv_value_t));
2122 if(pv_eval_str(msg, &val.rs, fmt)<0) {
2123 LM_ERR("cannot eval reparsed value of second parameter\n");
2127 val.flags = PV_VAL_STR;
2128 if(ispec->setf(msg, &ispec->pvp, EQ_T, &val)<0) {
2129 LM_ERR("setting PV failed\n");
2141 static int ki_avp_seti(sip_msg_t *msg, str *xname, int vn)
2143 unsigned short atype;
2147 memset(&aname, 0, sizeof(int_str));
2149 atype = AVP_NAME_STR;
2154 if (add_avp(atype, aname, avalue)<0) {
2155 LM_ERR("error - cannot add AVP\n");
2165 static int ki_avp_sets(sip_msg_t *msg, str *xname, str *vs)
2167 unsigned short atype;
2171 memset(&aname, 0, sizeof(int_str));
2173 atype = AVP_NAME_STR;
2177 atype |= AVP_VAL_STR;
2179 if (add_avp(atype, aname, avalue)<0) {
2180 LM_ERR("error - cannot add AVP\n");
2190 static int ki_avp_rm(sip_msg_t *msg, str *xname)
2192 unsigned short atype;
2195 memset(&aname, 0, sizeof(int_str));
2197 atype = AVP_NAME_STR;
2200 destroy_avps(atype, aname, 0);
2208 static int ki_avp_is_null(sip_msg_t *msg, str *xname)
2210 unsigned short atype;
2213 avp_search_state_t astate;
2215 memset(&astate, 0, sizeof(avp_search_state_t));
2216 memset(&aname, 0, sizeof(int_str));
2218 atype = AVP_NAME_STR;
2221 destroy_avps(atype, aname, 0);
2223 if (search_first_avp(atype, aname, &avalue, &astate)==0) {
2233 static sr_kemi_xval_t* ki_avp_get_mode(sip_msg_t *msg, str *xname, int rmode)
2236 avp_search_state_t astate;
2237 unsigned short atype;
2241 memset(&_sr_kemi_pv_xval, 0, sizeof(sr_kemi_xval_t));
2242 memset(&astate, 0, sizeof(avp_search_state_t));
2243 memset(&aname, 0, sizeof(int_str));
2245 atype = AVP_NAME_STR;
2248 if ((avp=search_first_avp(atype, aname, &avalue, &astate))==0) {
2249 sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
2250 return &_sr_kemi_pv_xval;
2252 if(avp->flags & AVP_VAL_STR) {
2253 _sr_kemi_pv_xval.vtype = SR_KEMIP_STR;
2254 _sr_kemi_pv_xval.v.s = avalue.s;
2255 return &_sr_kemi_pv_xval;
2257 _sr_kemi_pv_xval.vtype = SR_KEMIP_INT;
2258 _sr_kemi_pv_xval.v.n = avalue.n;
2259 return &_sr_kemi_pv_xval;
2266 static sr_kemi_xval_t* ki_avp_get(sip_msg_t *msg, str *xname)
2268 return ki_avp_get_mode(msg, xname, SR_KEMI_XVAL_NULL_NONE);
2274 static sr_kemi_xval_t* ki_avp_gete(sip_msg_t *msg, str *xname)
2276 return ki_avp_get_mode(msg, xname, SR_KEMI_XVAL_NULL_EMPTY);
2282 static sr_kemi_xval_t* ki_avp_getw(sip_msg_t *msg, str *xname)
2284 return ki_avp_get_mode(msg, xname, SR_KEMI_XVAL_NULL_PRINT);
2290 /* clang-format off */
2291 static sr_kemi_t sr_kemi_pvx_exports[] = {
2292 { str_init("pvx"), str_init("sbranch_set_ruri"),
2293 SR_KEMIP_INT, ki_sbranch_set_ruri,
2294 { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
2295 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2297 { str_init("pvx"), str_init("sbranch_append"),
2298 SR_KEMIP_INT, ki_sbranch_append,
2299 { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
2300 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2302 { str_init("pvx"), str_init("sbranch_reset"),
2303 SR_KEMIP_INT, ki_sbranch_reset,
2304 { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
2305 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2307 { str_init("pvx"), str_init("var_seti"),
2308 SR_KEMIP_INT, ki_var_seti,
2309 { SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE,
2310 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2312 { str_init("pvx"), str_init("var_sets"),
2313 SR_KEMIP_INT, ki_var_sets,
2314 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2315 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2317 { str_init("pvx"), str_init("var_get"),
2318 SR_KEMIP_XVAL, ki_var_get,
2319 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2320 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2322 { str_init("pvx"), str_init("shv_seti"),
2323 SR_KEMIP_INT, ki_shv_seti,
2324 { SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE,
2325 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2327 { str_init("pvx"), str_init("shv_sets"),
2328 SR_KEMIP_INT, ki_shv_sets,
2329 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2330 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2332 { str_init("pvx"), str_init("shv_get"),
2333 SR_KEMIP_XVAL, ki_shv_get,
2334 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2335 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2337 { str_init("pvx"), str_init("pv_var_to_xavp"),
2338 SR_KEMIP_INT, ki_var_to_xavp,
2339 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2340 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2342 { str_init("pvx"), str_init("pv_xavp_to_var"),
2343 SR_KEMIP_INT, ki_xavp_to_var,
2344 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2345 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2347 { str_init("pvx"), str_init("pv_xavp_print"),
2348 SR_KEMIP_INT, ki_xavp_print,
2349 { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
2350 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2352 { str_init("pvx"), str_init("pv_xavu_print"),
2353 SR_KEMIP_INT, ki_xavu_print,
2354 { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
2355 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2357 { str_init("pvx"), str_init("xavp_params_explode"),
2358 SR_KEMIP_INT, ki_xavp_params_explode,
2359 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2360 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2362 { str_init("pvx"), str_init("xavp_params_implode"),
2363 SR_KEMIP_INT, ki_xavp_params_implode,
2364 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2365 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2367 { str_init("pvx"), str_init("xavp_seti"),
2368 SR_KEMIP_INT, ki_xavp_seti,
2369 { SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE,
2370 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2372 { str_init("pvx"), str_init("xavp_sets"),
2373 SR_KEMIP_INT, ki_xavp_sets,
2374 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2375 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2377 { str_init("pvx"), str_init("xavp_get"),
2378 SR_KEMIP_XVAL, ki_xavp_get,
2379 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2380 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2382 { str_init("pvx"), str_init("xavp_gete"),
2383 SR_KEMIP_XVAL, ki_xavp_gete,
2384 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2385 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2387 { str_init("pvx"), str_init("xavp_getw"),
2388 SR_KEMIP_XVAL, ki_xavp_getw,
2389 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2390 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2392 { str_init("pvx"), str_init("xavp_getd"),
2393 SR_KEMIP_XVAL, ki_xavp_getd,
2394 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2395 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2397 { str_init("pvx"), str_init("xavp_getd_p1"),
2398 SR_KEMIP_XVAL, ki_xavp_getd_p1,
2399 { SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE,
2400 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2402 { str_init("pvx"), str_init("xavp_get_keys"),
2403 SR_KEMIP_XVAL, ki_xavp_get_keys,
2404 { SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE,
2405 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2407 { str_init("pvx"), str_init("xavp_rm"),
2408 SR_KEMIP_INT, ki_xavp_rm,
2409 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2410 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2412 { str_init("pvx"), str_init("xavp_is_null"),
2413 SR_KEMIP_INT, ki_xavp_is_null,
2414 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2415 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2417 { str_init("pvx"), str_init("xavp_child_seti"),
2418 SR_KEMIP_INT, ki_xavp_child_seti,
2419 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_INT,
2420 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2422 { str_init("pvx"), str_init("xavp_child_sets"),
2423 SR_KEMIP_INT, ki_xavp_child_sets,
2424 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR,
2425 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2427 { str_init("pvx"), str_init("xavp_child_rm"),
2428 SR_KEMIP_INT, ki_xavp_child_rm,
2429 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2430 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2432 { str_init("pvx"), str_init("xavp_child_is_null"),
2433 SR_KEMIP_INT, ki_xavp_child_is_null,
2434 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2435 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2437 { str_init("pvx"), str_init("xavp_child_get"),
2438 SR_KEMIP_XVAL, ki_xavp_child_get,
2439 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2440 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2442 { str_init("pvx"), str_init("xavp_child_gete"),
2443 SR_KEMIP_XVAL, ki_xavp_child_gete,
2444 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2445 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2447 { str_init("pvx"), str_init("xavp_child_getw"),
2448 SR_KEMIP_XVAL, ki_xavp_child_getw,
2449 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2450 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2452 { str_init("pvx"), str_init("xavu_seti"),
2453 SR_KEMIP_INT, ki_xavu_seti,
2454 { SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE,
2455 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2457 { str_init("pvx"), str_init("xavu_sets"),
2458 SR_KEMIP_INT, ki_xavu_sets,
2459 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2460 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2462 { str_init("pvx"), str_init("xavu_get"),
2463 SR_KEMIP_XVAL, ki_xavu_get,
2464 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2465 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2467 { str_init("pvx"), str_init("xavu_gete"),
2468 SR_KEMIP_XVAL, ki_xavu_gete,
2469 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2470 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2472 { str_init("pvx"), str_init("xavu_getw"),
2473 SR_KEMIP_XVAL, ki_xavu_getw,
2474 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2475 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2477 { str_init("pvx"), str_init("xavu_rm"),
2478 SR_KEMIP_INT, ki_xavu_rm,
2479 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2480 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2482 { str_init("pvx"), str_init("xavu_is_null"),
2483 SR_KEMIP_INT, ki_xavu_is_null,
2484 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2485 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2487 { str_init("pvx"), str_init("xavu_child_seti"),
2488 SR_KEMIP_INT, ki_xavu_child_seti,
2489 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_INT,
2490 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2492 { str_init("pvx"), str_init("xavu_child_sets"),
2493 SR_KEMIP_INT, ki_xavu_child_sets,
2494 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR,
2495 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2497 { str_init("pvx"), str_init("xavu_child_rm"),
2498 SR_KEMIP_INT, ki_xavu_child_rm,
2499 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2500 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2502 { str_init("pvx"), str_init("xavu_child_is_null"),
2503 SR_KEMIP_INT, ki_xavu_child_is_null,
2504 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2505 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2507 { str_init("pvx"), str_init("xavu_child_get"),
2508 SR_KEMIP_XVAL, ki_xavu_child_get,
2509 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2510 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2512 { str_init("pvx"), str_init("xavu_child_gete"),
2513 SR_KEMIP_XVAL, ki_xavu_child_gete,
2514 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2515 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2517 { str_init("pvx"), str_init("xavu_child_getw"),
2518 SR_KEMIP_XVAL, ki_xavu_child_getw,
2519 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2520 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2522 { str_init("pvx"), str_init("evalx"),
2523 SR_KEMIP_INT, ki_pv_evalx,
2524 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2525 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2527 { str_init("pvx"), str_init("avp_seti"),
2528 SR_KEMIP_INT, ki_avp_seti,
2529 { SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_NONE,
2530 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2532 { str_init("pvx"), str_init("avp_sets"),
2533 SR_KEMIP_INT, ki_avp_sets,
2534 { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
2535 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2537 { str_init("pvx"), str_init("avp_get"),
2538 SR_KEMIP_XVAL, ki_avp_get,
2539 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2540 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2542 { str_init("pvx"), str_init("avp_gete"),
2543 SR_KEMIP_XVAL, ki_avp_gete,
2544 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2545 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2547 { str_init("pvx"), str_init("avp_getw"),
2548 SR_KEMIP_XVAL, ki_avp_getw,
2549 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2550 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2552 { str_init("pvx"), str_init("avp_rm"),
2553 SR_KEMIP_INT, ki_avp_rm,
2554 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2555 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2557 { str_init("pvx"), str_init("avp_is_null"),
2558 SR_KEMIP_INT, ki_avp_is_null,
2559 { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
2560 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2562 { str_init("pvx"), str_init("xavp_copy"),
2563 SR_KEMIP_INT, ki_xavp_copy,
2564 { SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_STR,
2565 SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
2567 { str_init("pvx"), str_init("xavp_copy_dst"),
2568 SR_KEMIP_INT, ki_xavp_copy_dst,
2569 { SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_STR,
2570 SR_KEMIP_INT, SR_KEMIP_NONE, SR_KEMIP_NONE }
2573 { {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } }
2575 /* clang-format on */
2580 static const char* rpc_shv_set_doc[2] = {
2581 "Set a shared variable (args: name type value)",
2585 static const char* rpc_shv_get_doc[2] = {
2586 "Get the value of a shared variable. If no argument, dumps all",
2590 rpc_export_t pv_rpc[] = {
2591 {"pv.shvSet", rpc_shv_set, rpc_shv_set_doc, 0},
2592 {"pv.shvGet", rpc_shv_get, rpc_shv_get_doc, 0},
2596 static int pv_init_rpc(void)
2598 if (rpc_register_array(pv_rpc)!=0)
2600 LM_ERR("failed to register RPC commands\n");
2609 int mod_register(char *path, int *dlflags, void *p1, void *p2)
2611 sr_kemi_modules_add(sr_kemi_pvx_exports);
2612 if(tr_init_buffers()<0)
2614 LM_ERR("failed to initialize transformations buffers\n");
2617 return register_trans_mod(path, mod_trans);