3dc3cb
From 469cf426bc292b6d23770ce930577c1997654229 Mon Sep 17 00:00:00 2001
3dc3cb
From: Xin Long <lucien.xin@gmail.com>
3dc3cb
Date: Wed, 4 Aug 2021 07:29:14 -0400
3dc3cb
Subject: [PATCH 2/4] sctp_xconnect: replace use of deprecated gethostbyname
3dc3cb
 with getaddrinfo
3dc3cb
3dc3cb
This patch is to replace use of deprecated gethostbyname with
3dc3cb
getaddrinfo in the file src/apps/sctp_xconnect.c.
3dc3cb
3dc3cb
Signed-off-by: Xin Long <lucien.xin@gmail.com>
3dc3cb
Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
3dc3cb
---
3dc3cb
 src/apps/sctp_xconnect.c | 72 +++++++++++++++++-----------------------
3dc3cb
 1 file changed, 31 insertions(+), 41 deletions(-)
3dc3cb
3dc3cb
diff --git a/src/apps/sctp_xconnect.c b/src/apps/sctp_xconnect.c
3dc3cb
index 6759c0e..5cd1049 100644
3dc3cb
--- a/src/apps/sctp_xconnect.c
3dc3cb
+++ b/src/apps/sctp_xconnect.c
3dc3cb
@@ -63,13 +63,13 @@ int TST_CNT = 0;
3dc3cb
 
3dc3cb
 int mode = NOT_DEFINED;
3dc3cb
 
3dc3cb
-int	assoc_num,
3dc3cb
-	remote_port,
3dc3cb
-	local_port;
3dc3cb
+int assoc_num;
3dc3cb
 int active = 0;
3dc3cb
 
3dc3cb
-char *local_host = NULL;
3dc3cb
-char *remote_host = NULL;
3dc3cb
+char *local_host;
3dc3cb
+char *remote_host;
3dc3cb
+char *local_port;
3dc3cb
+char *remote_port;
3dc3cb
 sockaddr_storage_t client_loop,
3dc3cb
 		server_loop;
3dc3cb
 struct hostent *hst;
3dc3cb
@@ -102,6 +102,7 @@ void usage(char *argv0)
3dc3cb
 
3dc3cb
 /* Parse command line options */
3dc3cb
 void parse_arguments(int argc, char*argv[]) {
3dc3cb
+	struct addrinfo hints, *rp;
3dc3cb
 	int c;
3dc3cb
 
3dc3cb
 	while ((c = getopt(argc, argv, ":H:P:ach:ln:p:")) >= 0) {
3dc3cb
@@ -110,7 +111,7 @@ void parse_arguments(int argc, char*argv[]) {
3dc3cb
 				local_host = optarg;
3dc3cb
 				break;
3dc3cb
 			case 'P':
3dc3cb
-				local_port = atoi(optarg);
3dc3cb
+				local_port = optarg;
3dc3cb
 				break;
3dc3cb
 			case 'c':
3dc3cb
 			    if (mode == NOT_DEFINED)
3dc3cb
@@ -138,7 +139,7 @@ void parse_arguments(int argc, char*argv[]) {
3dc3cb
 				assoc_num = atoi(optarg);
3dc3cb
 				break;
3dc3cb
 			case 'p':
3dc3cb
-				remote_port = atoi(optarg);
3dc3cb
+				remote_port = optarg;
3dc3cb
 				break;
3dc3cb
 			default:
3dc3cb
 				usage(argv[0]);
3dc3cb
@@ -146,6 +147,9 @@ void parse_arguments(int argc, char*argv[]) {
3dc3cb
 		}
3dc3cb
 	} /* while() */
3dc3cb
 
3dc3cb
+	memset(&hints, 0, sizeof(struct addrinfo));
3dc3cb
+	hints.ai_family = AF_INET;
3dc3cb
+	hints.ai_protocol = IPPROTO_SCTP;
3dc3cb
 	if (mode == CLIENT) {
3dc3cb
 		if (assoc_num) {
3dc3cb
 			if (assoc_num > MAXCLIENTNUM) {
3dc3cb
@@ -160,13 +164,13 @@ void parse_arguments(int argc, char*argv[]) {
3dc3cb
 			assoc_num = 1;
3dc3cb
 
3dc3cb
 		if (remote_host && remote_port) {
3dc3cb
-			hst = gethostbyname(remote_host);
3dc3cb
-
3dc3cb
-			memcpy(&server_loop.v4.sin_addr, hst->h_addr_list[0],
3dc3cb
-				   sizeof(server_loop.v4.sin_addr));
3dc3cb
-
3dc3cb
-			server_loop.v4.sin_family = AF_INET;
3dc3cb
-server_loop.v4.sin_port = htons(remote_port);
3dc3cb
+			if (getaddrinfo(remote_host, remote_port, &hints, &rp) != 0) {
3dc3cb
+				printf("%s: bad remote hostname or port: %s, %s\n",
3dc3cb
+				       argv[0], remote_host, remote_port);
3dc3cb
+				usage(argv[0]);
3dc3cb
+				exit(0);
3dc3cb
+			}
3dc3cb
+			memcpy(&server_loop, rp->ai_addr, rp->ai_addrlen);
3dc3cb
 		} else {
3dc3cb
 			printf("Remote host and remote port must be defined "
3dc3cb
 				"in client mode\n");
3dc3cb
@@ -174,20 +178,12 @@ server_loop.v4.sin_port = htons(remote_port);
3dc3cb
 			exit(0);
3dc3cb
 		}
3dc3cb
 
3dc3cb
-		if (local_host) {
3dc3cb
-			hst = gethostbyname(local_host);
3dc3cb
-
3dc3cb
-			memcpy(&client_loop.v4.sin_addr, hst->h_addr_list[0],
3dc3cb
-				   sizeof(client_loop.v4.sin_addr));
3dc3cb
-		} else
3dc3cb
-			client_loop.v4.sin_addr.s_addr = INADDR_ANY;
3dc3cb
-
3dc3cb
-		if (local_port)
3dc3cb
-			client_loop.v4.sin_port = htons(local_port);
3dc3cb
-		else
3dc3cb
-			client_loop.v4.sin_port = 0;
3dc3cb
-
3dc3cb
-		client_loop.v4.sin_family = AF_INET;
3dc3cb
+		if (getaddrinfo(local_host, local_port, &hints, &rp) != 0) {
3dc3cb
+			printf("%s: bad local hostname or port: %s, %s\n",
3dc3cb
+			       argv[0], local_host, local_port);
3dc3cb
+			exit(0);
3dc3cb
+		}
3dc3cb
+		memcpy(&client_loop, rp->ai_addr, rp->ai_addrlen);
3dc3cb
 	} else if (mode == SERVER) {
3dc3cb
 		if (active) {
3dc3cb
 			printf("This option if for client use only");
3dc3cb
@@ -201,23 +197,17 @@ server_loop.v4.sin_port = htons(remote_port);
3dc3cb
 			exit(0);
3dc3cb
 		}
3dc3cb
 
3dc3cb
-		if (local_host) {
3dc3cb
-			hst = gethostbyname(local_host);
3dc3cb
-
3dc3cb
-			memcpy(&server_loop.v4.sin_addr, hst->h_addr_list[0],
3dc3cb
-				   sizeof(server_loop.v4.sin_addr));
3dc3cb
-		} else
3dc3cb
-			server_loop.v4.sin_addr.s_addr = INADDR_ANY;
3dc3cb
-
3dc3cb
-		if (local_port)
3dc3cb
-			server_loop.v4.sin_port = htons(local_port);
3dc3cb
-		else {
3dc3cb
+		if (!local_port) {
3dc3cb
 			printf("Specify a local port in server mode.\n");
3dc3cb
 			usage(argv[0]);
3dc3cb
 			exit(0);
3dc3cb
 		}
3dc3cb
-
3dc3cb
-		server_loop.v4.sin_family = AF_INET;
3dc3cb
+		if (getaddrinfo(local_host, local_port, &hints, &rp) != 0) {
3dc3cb
+			printf("%s: bad local hostname or port: %s, %s\n",
3dc3cb
+			       argv[0], local_host, local_port);
3dc3cb
+			exit(0);
3dc3cb
+		}
3dc3cb
+		memcpy(&server_loop, rp->ai_addr, rp->ai_addrlen);
3dc3cb
 	} else {
3dc3cb
 		printf("Must assisgn a client or server mode.\n");
3dc3cb
 		usage(argv[0]);
3dc3cb
-- 
3dc3cb
2.27.0
3dc3cb