Explorar o código

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 %!s(int64=11) %!d(string=hai) anos
pai
achega
3e53527030
Modificáronse 3 ficheiros con 43 adicións e 0 borrados
  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);