浏览代码

dmq: Set send_socket to the correct address

Documentation says the server_address is the address used to send messages
from. Make the code actually do this.

UDP is hardcoded for now because DMQ doesn't work with other protocols (yet).
Alex Hermann 11 年之前
父节点
当前提交
3e53527030
共有 3 个文件被更改,包括 43 次插入0 次删除
  1. 40 0
      modules/dmq/dmq.c
  2. 1 0
      modules/dmq/dmq.h
  3. 2 0
      modules/dmq/dmq_funcs.c

+ 40 - 0
modules/dmq/dmq.c

@@ -60,6 +60,7 @@ int pid = 0;
 /* module parameters */
 int num_workers = DEFAULT_NUM_WORKERS;
 str dmq_server_address = {0, 0};
+str dmq_server_socket = {0, 0};
 struct sip_uri dmq_server_uri;
 
 str dmq_notification_address = {0, 0};
@@ -127,6 +128,36 @@ struct module_exports exports = {
 	child_init                  	/* per-child init function */
 };
 
+
+static int make_socket_str_from_uri(struct sip_uri *uri, str *socket) {
+	if(!uri->host.s || !uri->host.len) {
+		LM_ERR("no host in uri\n");
+		return -1;
+	}
+
+	socket->len = uri->host.len + uri->port.len + 6;
+	socket->s = pkg_malloc(socket->len);
+	if(socket->s==NULL) {
+		LM_ERR("no more pkg\n");
+		return -1;
+	}
+	memcpy(socket->s, "udp:", 4);
+	socket->len = 4;
+
+	memcpy(socket->s + socket->len, uri->host.s, uri->host.len);
+	socket->len += uri->host.len;
+
+	if(uri->port.s && uri->port.len) {
+		socket->s[socket->len++] = ':';
+		memcpy(socket->s + socket->len, uri->port.s, uri->port.len);
+		socket->len += uri->port.len;
+	}
+	socket->s[socket->len] = '\0';
+
+	return 0;
+}
+
+
 /**
  * init module function
  */
@@ -178,6 +209,12 @@ static int mod_init(void)
 		return -1;
 	}
 
+	/* create socket string out of the server_uri */
+	if(make_socket_str_from_uri(&dmq_server_uri, &dmq_server_socket) < 0) {
+		LM_ERR("failed to create socket out of server_uri\n");
+		return -1;
+	}
+
 	/* allocate workers array */
 	workers = shm_malloc(num_workers * sizeof(*workers));
 	if(workers == NULL) {
@@ -268,6 +305,9 @@ static void destroy(void) {
 		self_node->status = DMQ_NODE_DISABLED;
 		request_nodelist(notification_node, 1);
 	}
+	if (dmq_server_socket.s) {
+		pkg_free(dmq_server_socket.s);
+	}
 }
 
 static int handle_dmq_fixup(void** param, int param_no)

+ 1 - 0
modules/dmq/dmq.h

@@ -44,6 +44,7 @@ extern dmq_peer_t* dmq_notification_peer;
 extern str dmq_server_address;
 extern dmq_peer_list_t* peer_list;
 extern str dmq_request_method;
+extern str dmq_server_socket;
 extern struct sip_uri dmq_server_uri;
 extern str dmq_notification_address;
 extern struct sip_uri dmq_notification_uri;

+ 2 - 0
modules/dmq/dmq_funcs.c

@@ -202,6 +202,8 @@ int dmq_send_message(dmq_peer_t* peer, str* body, dmq_node_t* node,
 	
 	set_uac_req(&uac_r, &dmq_request_method, &str_hdr, body, NULL,
 			TMCB_LOCAL_COMPLETED, dmq_tm_callback, (void*)cb_param);
+	uac_r.ssock = &dmq_server_socket;
+
 	result = tmb.t_request(&uac_r, &to,
 			       &to, &from,
 			       NULL);