/** * @brief config file function for sending dmq message */ int cfg_dmq_send_message(struct sip_msg* msg, char* peer, char* to, char* body, char* content_type) { str peer_str; str to_str; str body_str; str ct_str; if(get_str_fparam(&peer_str, msg, (fparam_t*)peer)<0) { LM_ERR("cannot get peer value\n"); return -1; } if(get_str_fparam(&to_str, msg, (fparam_t*)to)<0) { LM_ERR("cannot get dst value\n"); return -1; } if(get_str_fparam(&body_str, msg, (fparam_t*)body)<0) { LM_ERR("cannot get body value\n"); return -1; } if(get_str_fparam(&ct_str, msg, (fparam_t*)content_type)<0) { LM_ERR("cannot get content-type value\n"); return -1; } LM_DBG("cfg_dmq_send_message: %.*s - %.*s - %.*s - %.*s\n", peer_str.len, peer_str.s, to_str.len, to_str.s, body_str.len, body_str.s, ct_str.len, ct_str.s); dmq_peer_t* destination_peer = find_peer(peer_str); if(!destination_peer) { LM_INFO("cannot find peer %.*s\n", peer_str.len, peer_str.s); dmq_peer_t new_peer; new_peer.callback = empty_peer_callback; new_peer.description.s = ""; new_peer.description.len = 0; new_peer.peer_id = peer_str; destination_peer = register_dmq_peer(&new_peer); if(!destination_peer) { LM_ERR("error in register_dmq_peer\n"); goto error; } } dmq_node_t* to_dmq_node = find_dmq_node_uri(node_list, &to_str); if(!to_dmq_node) { LM_ERR("cannot find dmq_node: %.*s\n", to_str.len, to_str.s); goto error; } if(dmq_send_message(destination_peer, &body_str, to_dmq_node, ¬ification_callback, 1, &ct_str) < 0) { LM_ERR("cannot send dmq message\n"); goto error; } return 1; error: return -1; }
/** * extract the node list from the body of a notification request SIP message * the SIP request will look something like: * KDMQ sip:10.0.0.0:5062 * To: ... * From: ... * Max-Forwards: ... * Content-Length: 22 * * sip:host1:port1;param1=value1 * sip:host2:port2;param2=value2 * ... */ int extract_node_list(dmq_node_list_t* update_list, struct sip_msg* msg) { int content_length, total_nodes = 0; str body; str tmp_uri; dmq_node_t *cur = NULL; char *tmp, *end, *match; if(!msg->content_length) { LM_ERR("no content length header found\n"); return -1; } content_length = get_content_length(msg); if(!content_length) { LM_DBG("content length is 0\n"); return total_nodes; } body.s = get_body(msg); body.len = content_length; tmp = body.s; end = body.s + body.len; /* acquire big list lock */ lock_get(&update_list->lock); while(tmp < end) { match = q_memchr(tmp, '\n', end - tmp); if(match) { match++; } else { /* for the last line - take all of it */ match = end; } /* create the orig_uri from the parsed uri line and trim it */ tmp_uri.s = tmp; tmp_uri.len = match - tmp - 1; tmp = match; /* trim the \r, \n and \0's */ trim_r(tmp_uri); if(!find_dmq_node_uri(update_list, &tmp_uri)) { LM_DBG("found new node %.*s\n", STR_FMT(&tmp_uri)); cur = build_dmq_node(&tmp_uri, 1); if(!cur) { LM_ERR("error creating new dmq node\n"); goto error; } cur->next = update_list->nodes; update_list->nodes = cur; update_list->count++; total_nodes++; } } /* release big list lock */ lock_release(&update_list->lock); return total_nodes; error: lock_release(&update_list->lock); return -1; }
/** * @brief kemi function for sending dmq message */ int ki_dmq_send_message(sip_msg_t *msg, str *peer_str, str *to_str, str *body_str, str *ct_str) { LM_DBG("cfg_dmq_send_message: %.*s - %.*s - %.*s - %.*s\n", peer_str->len, peer_str->s, to_str->len, to_str->s, body_str->len, body_str->s, ct_str->len, ct_str->s); dmq_peer_t *destination_peer = find_peer(*peer_str); if(!destination_peer) { LM_INFO("cannot find peer %.*s\n", peer_str->len, peer_str->s); dmq_peer_t new_peer; new_peer.callback = empty_peer_callback; new_peer.description.s = ""; new_peer.description.len = 0; new_peer.peer_id = *peer_str; destination_peer = register_dmq_peer(&new_peer); if(!destination_peer) { LM_ERR("error in register_dmq_peer\n"); goto error; } } dmq_node_t *to_dmq_node = find_dmq_node_uri(node_list, to_str); if(!to_dmq_node) { LM_ERR("cannot find dmq_node: %.*s\n", to_str->len, to_str->s); goto error; } if(dmq_send_message(destination_peer, body_str, to_dmq_node, ¬ification_callback, 1, ct_str) < 0) { LM_ERR("cannot send dmq message\n"); goto error; } return 1; error: return -1; }
dmq_node_t *find_dmq_node_uri2(str *uri) { return find_dmq_node_uri(node_list, uri); }