[sr-dev] git:master:cc098ecd: evapi: use getaddrinfo() instead of gethostbyname()

Daniel-Constantin Mierla miconda at gmail.com
Wed May 20 13:41:14 CEST 2020


Module: kamailio
Branch: master
Commit: cc098ecdfb556bf5efaab72fa767c773000f9fb6
URL: https://github.com/kamailio/kamailio/commit/cc098ecdfb556bf5efaab72fa767c773000f9fb6

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2020-05-20T13:35:32+02:00

evapi: use getaddrinfo() instead of gethostbyname()

- the later is marked as deprecated
- GH #1714

---

Modified: src/modules/evapi/evapi_dispatch.c

---

Diff:  https://github.com/kamailio/kamailio/commit/cc098ecdfb556bf5efaab72fa767c773000f9fb6.diff
Patch: https://github.com/kamailio/kamailio/commit/cc098ecdfb556bf5efaab72fa767c773000f9fb6.patch

---

diff --git a/src/modules/evapi/evapi_dispatch.c b/src/modules/evapi/evapi_dispatch.c
index e16d4c5ad2..4d253865e9 100644
--- a/src/modules/evapi/evapi_dispatch.c
+++ b/src/modules/evapi/evapi_dispatch.c
@@ -618,9 +618,10 @@ void evapi_recv_notify(struct ev_loop *loop, struct ev_io *watcher, int revents)
 int evapi_run_dispatcher(char *laddr, int lport)
 {
 	int evapi_srv_sock;
-	struct sockaddr_in evapi_srv_addr;
 	struct ev_loop *loop;
-	struct hostent *h = NULL;
+	struct addrinfo ai_hints;
+	struct addrinfo *ai_res = NULL;
+	int ai_ret = 0;
 	struct ev_io io_server;
 	struct ev_io io_notify;
 	int yes_true = 1;
@@ -646,39 +647,37 @@ int evapi_run_dispatcher(char *laddr, int lport)
 		return -1;
 	}
 
-	h = gethostbyname(laddr);
-	if (h == NULL || (h->h_addrtype != AF_INET && h->h_addrtype != AF_INET6)) {
-		LM_ERR("cannot resolve local server address [%s]\n", laddr);
+	memset(&ai_hints, 0, sizeof(struct addrinfo));
+	ai_hints.ai_family = AF_UNSPEC;		/* allow IPv4 or IPv6 */
+	ai_hints.ai_socktype = SOCK_STREAM;	/* stream socket */
+	ai_ret = getaddrinfo(laddr, NULL, &ai_hints, &ai_res);
+	if (ai_ret != 0) {
+		LM_ERR("getaddrinfo failed: %d %s\n", ai_ret, gai_strerror(ai_ret));
 		return -1;
 	}
-	if(h->h_addrtype == AF_INET) {
-		evapi_srv_sock = socket(PF_INET, SOCK_STREAM, 0);
-	} else {
-		evapi_srv_sock = socket(PF_INET6, SOCK_STREAM, 0);
-	}
-	if( evapi_srv_sock < 0 )
-	{
-		LM_ERR("cannot create server socket (family %d)\n", h->h_addrtype);
+	evapi_srv_sock = socket(ai_res->ai_family, ai_res->ai_socktype,
+			ai_res->ai_protocol);
+	if( evapi_srv_sock < 0 ) {
+		LM_ERR("cannot create server socket (family %d)\n", ai_res->ai_family);
+		freeaddrinfo(ai_res);
 		return -1;
 	}
+
 	/* set non-blocking flag */
 	fflags = fcntl(evapi_srv_sock, F_GETFL);
 	if(fflags<0) {
 		LM_ERR("failed to get the srv socket flags\n");
 		close(evapi_srv_sock);
+		freeaddrinfo(ai_res);
 		return -1;
 	}
 	if (fcntl(evapi_srv_sock, F_SETFL, fflags | O_NONBLOCK)<0) {
 		LM_ERR("failed to set srv socket flags\n");
 		close(evapi_srv_sock);
+		freeaddrinfo(ai_res);
 		return -1;
 	}
 
-	bzero(&evapi_srv_addr, sizeof(evapi_srv_addr));
-	evapi_srv_addr.sin_family = h->h_addrtype;
-	evapi_srv_addr.sin_port   = htons(lport);
-	evapi_srv_addr.sin_addr  = *(struct in_addr*)h->h_addr;
-
 	/* Set SO_REUSEADDR option on listening socket so that we don't
 	 * have to wait for connections in TIME_WAIT to go away before
 	 * re-binding.
@@ -688,15 +687,16 @@ int evapi_run_dispatcher(char *laddr, int lport)
 		&yes_true, sizeof(int)) < 0) {
 		LM_ERR("cannot set SO_REUSEADDR option on descriptor\n");
 		close(evapi_srv_sock);
+		freeaddrinfo(ai_res);
 		return -1;
 	}
 
-	if (bind(evapi_srv_sock, (struct sockaddr*)&evapi_srv_addr,
-				sizeof(evapi_srv_addr)) < 0) {
+	if (bind(evapi_srv_sock, ai_res->ai_addr, ai_res->ai_addrlen) < 0) {
 		LM_ERR("cannot bind to local address and port [%s:%d]\n", laddr, lport);
 		close(evapi_srv_sock);
 		return -1;
 	}
+	freeaddrinfo(ai_res);
 	if (listen(evapi_srv_sock, 4) < 0) {
 		LM_ERR("listen error\n");
 		close(evapi_srv_sock);




More information about the sr-dev mailing list