static inline struct sip_msg* buf_to_sip_msg(char *buf, unsigned int len, dlg_t *dialog) { static struct sip_msg req; memset( &req, 0, sizeof(req) ); req.id = get_next_msg_no(); req.buf = buf; req.len = len; if (parse_msg(buf, len, &req)!=0) { LM_CRIT("BUG - buffer parsing failed!"); return NULL; } /* populate some special fields in sip_msg */ req.set_global_address=default_global_address; req.set_global_port=default_global_port; req.force_send_socket = dialog->send_sock; if (set_dst_uri(&req, dialog->hooks.next_hop)) { LM_ERR("failed to set dst_uri"); free_sip_msg(&req); return NULL; } req.rcv.proto = dialog->send_sock->proto; req.rcv.src_ip = req.rcv.dst_ip = dialog->send_sock->address; req.rcv.src_port = req.rcv.dst_port = dialog->send_sock->port_no; req.rcv.bind_address = dialog->send_sock; return &req; }
static inline int fake_req(struct sip_msg *faked_req, struct sip_msg *shm_msg, struct ua_server *uas, struct ua_client *uac) { /* on_negative_reply faked msg now copied from shmem msg (as opposed * to zero-ing) -- more "read-only" actions (exec in particular) will * work from reply_route as they will see msg->from, etc.; caution, * rw actions may append some pkg stuff to msg, which will possibly be * never released (shmem is released in a single block) */ memcpy( faked_req, shm_msg, sizeof(struct sip_msg)); /* if we set msg_id to something different from current's message * id, the first t_fork will properly clean new branch URIs */ faked_req->id = get_next_msg_no(); /* msg->parsed_uri_ok must be reset since msg_parsed_uri is * not cloned (and cannot be cloned) */ faked_req->parsed_uri_ok = 0; /* new_uri can change -- make a private copy */ faked_req->new_uri.s=pkg_malloc( uac->uri.len+1 ); if (!faked_req->new_uri.s) { LM_ERR("no uri/pkg mem\n"); goto error; } faked_req->new_uri.len = uac->uri.len; memcpy( faked_req->new_uri.s, uac->uri.s, uac->uri.len); faked_req->new_uri.s[faked_req->new_uri.len]=0; faked_req->parsed_uri_ok = 0; /* we could also restore dst_uri, but will be confusing from script, * so let it set to NULL */ /* set as flags the global flags and the branch flags from the * elected branch */ faked_req->flags = uas->request->flags; setb0flags( uac->br_flags); return 1; error: return 0; }