MCPcopy Create free account
hub / github.com/OpenSIPS/opensips / pv_get_route

Function pv_get_route

pvar.c:279–399  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

277}
278
279static int pv_get_route(struct sip_msg *msg, pv_param_t *param,
280 pv_value_t *res)
281{
282 static str rn_buf;
283
284 str s;
285 int i, idx, idx_flags, len, rlen, has_name, route_stack_size_ctx;
286
287 if (pv_get_spec_index(msg, param, &idx, &idx_flags) != 0) {
288 LM_ERR("invalid index\n");
289 return -1;
290 }
291
292 if (idx_flags == PV_IDX_ALL) {
293 get_top_route_type(&s, &has_name);
294 if (!has_name)
295 goto unnamed_route;
296
297 len = strlen(route_stack[route_stack_start]);
298 if (pkg_str_extend(&rn_buf, s.len + 2 + len + 1) != 0) {
299 LM_ERR("oom\n");
300 return pv_get_null(msg, param, res);
301 }
302
303 len = sprintf(rn_buf.s, "%.*s[%s]", s.len, s.s, route_stack[route_stack_start]);
304 goto print_remaining;
305
306 unnamed_route:
307 if (pkg_str_extend(&rn_buf, s.len + 1) != 0) {
308 LM_ERR("oom\n");
309 return pv_get_null(msg, param, res);
310 }
311
312 len = sprintf(rn_buf.s, "%.*s", s.len, s.s);
313
314 print_remaining:
315 s = str_route;
316
317 for (i = route_stack_start+1; i < route_stack_size; i++) {
318 if (!route_stack[i]) {
319 if (pkg_str_extend(&rn_buf, len + 3 + s.len + 1) != 0) {
320 LM_ERR("oom\n");
321 return pv_get_null(msg, param, res);
322 }
323
324 len += sprintf(rn_buf.s + len, " > %.*s", s.len, s.s);
325 } else if (route_stack[i][0] != '!') {
326 rlen = strlen(route_stack[i]);
327
328 if (pkg_str_extend(&rn_buf, len + s.len + 5 + rlen + 1) != 0) {
329 LM_ERR("oom\n");
330 return pv_get_null(msg, param, res);
331 }
332
333 len += sprintf(rn_buf.s + len, " > %.*s[%s]",
334 s.len, s.s, route_stack[i]);
335 } else {
336 rlen = strlen(route_stack[i]);

Callers

nothing calls this directly

Calls 5

pv_get_spec_indexFunction · 0.85
get_top_route_typeFunction · 0.85
pkg_str_extendFunction · 0.85
pv_get_nullFunction · 0.85
pv_get_strvalFunction · 0.85

Tested by

no test coverage detected