Hello,
this topic was last discussed here: http://lists.iptel.org/pipermail/serusers/2005-May/019551.html
last few days i was trying to apply juha's move() function with almost no success to 0.9.3 stable branch.
i added such code to my ser.cfg:
onreply_route[1] { xlog("L_NOTICE", "Reply status %rs: Reason %rr\n"); if (t_check_status("30[12]")) { xlog("L_NOTICE", "We got a 30[12]!!!!!\n"); t_move(); # custom function by juha #t_reply(); }; }
and modified move() code like this:
inline static int move(struct sip_msg* _m, char *_foo, char *_bar) { //struct sip_msg* reply; regmatch_t pmatch[2]; struct hdr_field hf; contact_t* first; regex_t contact_re;
// What is it? didn't find anywere. //reply = _m->final_reply; // MOD HERE if (!_m) { LOG(L_ERR, "move(): No reply found\n"); return -1; }
LOG(L_ERR, "move(): unparsed part of reply: %s\n", _m->unparsed); // FIXME: where to put this? initialisation? // MOD HERE regcomp(&contact_re, "^Contact:(.*)$", REG_EXTENDED|REG_NEWLINE); if ( ( regexec(&contact_re, _m->unparsed, 2, &(pmatch[0]), 0) != 0) || (pmatch[1].rm_so == -1)) { LOG(L_ERR, "move(): No Contact header found\n"); return -1; }
hf.type = HDR_CONTACT; hf.name.len = 0; hf.body.len = pmatch[1].rm_eo - pmatch[1].rm_so - 1; hf.body.s = &(_m->unparsed[pmatch[1].rm_so]); hf.len = hf.body.len + 2; hf.parsed = NULL; hf.next = NULL;
// this prints out redirected contact LOG(L_ERR, "hf.body: '%.*s'\n", hf.body.len, hf.body.s);
if (parse_contact(&hf) < 0) { LOG(L_ERR, "move(): Error while parsing Contact\n"); goto failure; }
if (((contact_body_t*)hf.parsed)->star == 1) { LOG(L_ERR, "move(): Contact is *\n"); goto failure; } first = ((contact_body_t*)hf.parsed)->contacts; if (first) { // MOD HERE if (append_branch(_m, first->uri.s, first->uri.len, 0, 0, Q_UNSPECIFIED) == 1) { goto success; } else { LOG(L_ERR, "move(): Appending branch failed\n"); } } else { LOG(L_ERR, "move(): No contacts in Contact header\n"); }
failure: if (hf.parsed) { free_contact((contact_body_t**)(&(hf.parsed))); } return -1;
success: free_contact((contact_body_t**)(&(hf.parsed))); return 1; }
it seems that t_move succeeds(), contact gets parsed and append_branch() gets execuded. But then, nothing happens. 302 is replied back to call originator. It is function build_res_buf_from_sip_res is called() which builds 302 message back to call originator.. It seems that after getting contact from 302 message, INVITE sould be generatated somehow. I suspect that i am passing wrong message to append_branch, but i didn't found how to access INVITE from tm module while in onreply_route[].
Can anybody with deeper ser knowledge help?
Antanas