Blob Blame History Raw
From 166c26dca2a5004f83c5dbc1cb9870667fa8e301 Mon Sep 17 00:00:00 2001
From: Xin Long <lucien.xin@gmail.com>
Date: Wed, 4 Aug 2021 07:29:13 -0400
Subject: [PATCH 1/4] myftp: replace use of deprecated gethostbyname with
 getaddrinfo

This patch is to replace use of deprecated gethostbyname with
getaddrinfo in the file src/apps/myftp.c.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
---
 configure.ac     |  2 +-
 src/apps/myftp.c | 40 ++++++++++++++++++----------------------
 2 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/configure.ac b/configure.ac
index 4e2f7b4..8345dab 100644
--- a/configure.ac
+++ b/configure.ac
@@ -75,7 +75,7 @@ AC_FUNC_REALLOC
 AC_FUNC_SELECT_ARGTYPES
 AC_FUNC_SETVBUF_REVERSED
 AC_FUNC_VPRINTF
-AC_CHECK_FUNCS([bzero gethostbyname gettimeofday memmove memset select socket \
+AC_CHECK_FUNCS([bzero getaddrinfo gethostbyname gettimeofday memmove memset select socket \
 		strchr strerror strtol strtoul])
 
 # Support for stream reset even, added on v4.11, 35ea82d611da
diff --git a/src/apps/myftp.c b/src/apps/myftp.c
index 64fa3f2..473fa03 100644
--- a/src/apps/myftp.c
+++ b/src/apps/myftp.c
@@ -64,11 +64,11 @@ typedef enum { COMMAND_NONE, COMMAND_RECV, COMMAND_SEND } command_t;
 #define MAX_NUM_HOST	5
 static char *local_host[MAX_NUM_HOST];
 static int num_local_host = 0;
-static int local_port = 4444;
+static char *local_port = "4444";
 
 static int buffer_size = BUFSIZE;
 static char *remote_host = NULL;
-static int remote_port = 4444;
+static char *remote_port = "4444";
 static command_t command = COMMAND_NONE;
 static char *filename = NULL;
 static int interactive = 0;
@@ -133,7 +133,7 @@ static int parse_arguments(int argc, char *argv[])
 			break;
 		case 2:		/* local port */
 		case 'P':
-			local_port = atoi(optarg);
+			local_port = optarg;
 			break;
 		case 3:		/* remote host */
 		case 'h':
@@ -141,7 +141,7 @@ static int parse_arguments(int argc, char *argv[])
 			break;
 		case 4:		/* remote port */
 		case 'p':
-			remote_port = atoi(optarg);
+			remote_port = optarg;
 			break;
 		case 5:
 		case 'f':
@@ -236,6 +236,7 @@ emsg(char *prog,char *s)
 
 static int build_endpoint(char *argv0)
 {
+	struct addrinfo hints, *rp;
 	int retval,i;
 
 	/* Create the local endpoint.  */
@@ -245,22 +246,19 @@ static int build_endpoint(char *argv0)
 	}
 
 	for ( i = 0;i < num_local_host;i++ ) {
-		struct hostent *hst;
-		struct sockaddr_in laddr;
-
-		memset(&laddr, 0, sizeof(laddr));
 		/* Get the transport address for the local host name.  */
 		fprintf(stderr,"Hostname %d is %s\n",i+1,local_host[i]);
-		if ( (hst = gethostbyname(local_host[i])) == NULL ) {
+
+		memset(&hints, 0, sizeof(struct addrinfo));
+		hints.ai_family = AF_INET;
+		hints.ai_protocol = IPPROTO_SCTP;
+		if (getaddrinfo(local_host[i], local_port, &hints, &rp) != 0) {
 			fprintf(stderr, "%s: bad hostname: %s\n", argv0, local_host[i]);
 			exit(1);
 		}
-		memcpy(&laddr.sin_addr, hst->h_addr_list[0],sizeof(laddr.sin_addr));
-		laddr.sin_port = htons(local_port);
-		laddr.sin_family = AF_INET;
 
 		/* Bind this socket to the test port.  */
-		if ( bind(retval, (struct sockaddr *)&laddr, sizeof(laddr)) ) {
+		if (bind(retval, rp->ai_addr, rp->ai_addrlen)) {
 			emsg(argv0,"bind");
 			exit(-1);
 		}
@@ -339,21 +337,19 @@ command_send(char *argv0, int sk)
 {
 	struct msghdr outmsg;
 	struct iovec iov;
-	struct hostent *hst;
-	struct sockaddr_in remote_addr;
+	struct addrinfo hints, *rp;
 	int fd;
 	int msglen;
 	int ct;
 
 	/* Set up the destination.  */
-	hst = gethostbyname(remote_host);
-	if (hst == NULL || hst->h_length < 1) {
+	memset(&hints, 0, sizeof(struct addrinfo));
+	hints.ai_family = AF_INET;
+	hints.ai_protocol = IPPROTO_SCTP;
+	if (getaddrinfo(remote_host, remote_port, &hints, &rp) != 0) {
 		fprintf(stderr, "%s: bad hostname: %s\n", argv0, remote_host);
 		exit(1);
 	}
-	memcpy(&remote_addr.sin_addr, hst->h_addr_list[0], sizeof(remote_addr.sin_addr));
-	remote_addr.sin_port = htons(remote_port);
-	remote_addr.sin_family = AF_INET;
 
 	/* Initialize the message struct we use to pass messages to
 	 * the remote socket.
@@ -364,8 +360,8 @@ command_send(char *argv0, int sk)
 	outmsg.msg_iovlen = 1;
 	outmsg.msg_control = NULL;
 	outmsg.msg_controllen = 0;
-	outmsg.msg_name = &remote_addr;
-	outmsg.msg_namelen = sizeof(remote_addr);
+	outmsg.msg_name = rp->ai_addr;
+	outmsg.msg_namelen = rp->ai_addrlen;
 
 	/* open the file */
 	if ( filename == NULL ) fd = 0;
-- 
2.27.0