All of lore.kernel.org
 help / color / mirror / Atom feed
From: Xin Long <lucien.xin@gmail.com>
To: linux-sctp@vger.kernel.org,
	Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Subject: [PATCH lksctp-tools 4/4] sctp_darn: replace use of deprecated gethostbyname with getaddrinfo
Date: Wed,  4 Aug 2021 07:29:16 -0400	[thread overview]
Message-ID: <957cd3ddeb19fa8bced4abe9cb160804fe73767e.1628076531.git.lucien.xin@gmail.com> (raw)
In-Reply-To: <cover.1628076531.git.lucien.xin@gmail.com>

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

Note that different from sctp_test, sctp_darn prefers v4 address
to v6 address when getting addrinfo from hostname. To keep the
compatibility, we don't change it.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
 configure.ac         |   2 +-
 src/apps/sctp_darn.c | 246 +++++++++++++------------------------------
 2 files changed, 72 insertions(+), 176 deletions(-)

diff --git a/configure.ac b/configure.ac
index 8345dab..28132bf 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 getaddrinfo gethostbyname gettimeofday memmove memset select socket \
+AC_CHECK_FUNCS([bzero getaddrinfo gettimeofday memmove memset select socket \
 		strchr strerror strtol strtoul])
 
 # Support for stream reset even, added on v4.11, 35ea82d611da
diff --git a/src/apps/sctp_darn.c b/src/apps/sctp_darn.c
index bcfb822..133c1c6 100644
--- a/src/apps/sctp_darn.c
+++ b/src/apps/sctp_darn.c
@@ -126,7 +126,6 @@ int if_index = 0;
 sockaddr_storage_t remote_addr;
 sa_family_t ra_family;	/* What family is remote_addr? */
 int ra_len = 0;		/* How long is remote_addr? */
-void *ra_raw;		/* This is the addr part of remote_addr. */
 int new_connection = 1;
 
 enum inter_cmd_num {
@@ -491,49 +490,29 @@ int
 build_endpoint(char *argv0, int portnum)
 {
 	int retval;
-	struct hostent *hst;
+	struct addrinfo hints, *rp;
 	sockaddr_storage_t local_addr;
-	sa_family_t la_family;	/* What family is local_addr? */
-	int la_len;		/* How long is local_addr? */
-	void *la_raw;		/* This is the addr part of local_addr. */
 	int error;
 	struct sctp_event_subscribe subscribe;
 
 	/* Get the transport address for the local host name.  */
-	hst = gethostbyname(local_host);
-	if (hst == NULL) {
-		hst = gethostbyname2(local_host, AF_INET6);
-	}
-
-	if (hst == NULL || hst->h_length < 1) {
-		fprintf(stderr, "%s: bad hostname: %s\n", argv0, local_host);
-		exit(1);
+	memset(&hints, 0, sizeof(struct addrinfo));
+	hints.ai_family = AF_INET;
+	hints.ai_protocol = IPPROTO_SCTP;
+	if (getaddrinfo(local_host, NULL, &hints, &rp) != 0) {
+		hints.ai_family = AF_INET6;
+		if (getaddrinfo(local_host, NULL, &hints, &rp) != 0) {
+			fprintf(stderr, "%s: bad hostname: %s\n", argv0, local_host);
+			exit(1);
+		}
 	}
-
-	la_family = hst->h_addrtype;
-	switch (la_family) {
-	case AF_INET:
-		la_len = sizeof(local_addr.v4);
-		la_raw = &local_addr.v4.sin_addr;
-		local_addr.v4.sin_port = htons(portnum);
-		local_addr.v4.sin_family = AF_INET;
-		break;
-	case AF_INET6:
-		la_len = sizeof(local_addr.v6);
-		la_raw = &local_addr.v6.sin6_addr;
-		local_addr.v6.sin6_port = htons(portnum);
-		local_addr.v6.sin6_family = AF_INET6;
+	memcpy(&local_addr, rp->ai_addr, rp->ai_addrlen);
+	local_addr.v4.sin_port = htons(portnum); /* equal to v6.sin6_port */
+	if (rp->ai_family == AF_INET6)
 		local_addr.v6.sin6_scope_id = if_index;
-		break;
-	default:
-		fprintf(stderr, "Invalid address type.\n");
-		exit(1);
-		break;
-	}
-	memcpy(la_raw, hst->h_addr_list[0], hst->h_length);
 
 	/* Create the local endpoint.  */
-	retval = socket(la_family, socket_type, IPPROTO_SCTP);
+	retval = socket(rp->ai_family, socket_type, IPPROTO_SCTP);
 	if (retval < 0) {
 		fprintf(stderr, "%s: failed to create socket:  %s.\n",
 			argv0, strerror(errno));
@@ -553,7 +532,7 @@ build_endpoint(char *argv0, int portnum)
 	}
 
 	/* Bind this socket to the test port.  */
-	error = bind(retval, &local_addr.sa, la_len);
+	error = bind(retval, &local_addr.sa, rp->ai_addrlen);
 	if (error != 0) {
 		fprintf(stderr, "%s: can not bind to %s:%d: %s.\n",
 			argv0, local_host, portnum,
@@ -778,7 +757,7 @@ command_send(char *argv0, int *skp)
 	struct iovec iov;
 	int done = 0;
 	char message[REALLY_BIG];
-	struct hostent *hst;
+	struct addrinfo hints, *rp;
 	int c;
 	struct sockaddr *addrs;
 	int msglen;
@@ -787,38 +766,21 @@ command_send(char *argv0, int *skp)
 
 	/* Set up the destination.  */
 	if (remote_host != NULL) {
-		hst = gethostbyname(remote_host);
-		if (hst == NULL) {
-			hst = gethostbyname2(remote_host, AF_INET6);
-		}
-
-		if (hst == NULL || hst->h_length < 1) {
-			fprintf(stderr, "%s: bad hostname: %s\n",
-				argv0, remote_host);
-			exit(1);
+		memset(&hints, 0, sizeof(struct addrinfo));
+		hints.ai_family = AF_INET;
+		hints.ai_protocol = IPPROTO_SCTP;
+		if (getaddrinfo(remote_host, NULL, &hints, &rp) != 0) {
+			hints.ai_family = AF_INET6;
+			if (getaddrinfo(remote_host, NULL, &hints, &rp) != 0) {
+				fprintf(stderr, "%s: bad hostname: %s\n", argv0, remote_host);
+				exit(1);
+			}
 		}
-
-		ra_family = hst->h_addrtype;
-		switch (ra_family) {
-		case AF_INET:
-			ra_len = sizeof(remote_addr.v4);
-			ra_raw = &remote_addr.v4.sin_addr;
-			remote_addr.v4.sin_port = htons(remote_port);
-			remote_addr.v4.sin_family = AF_INET;
-			break;
-		case AF_INET6:
-			ra_len = sizeof(remote_addr.v6);
-			ra_raw = &remote_addr.v6.sin6_addr;
-			remote_addr.v6.sin6_port = htons(remote_port);
-			remote_addr.v6.sin6_family = AF_INET6;
+		memcpy(&remote_addr, rp->ai_addr, rp->ai_addrlen);
+		remote_addr.v4.sin_port = htons(remote_port); /* equal to v6.sin6_port */
+		if (rp->ai_family == AF_INET6)
 			remote_addr.v6.sin6_scope_id = if_index;
-			break;
-		default:
-			fprintf(stderr, "Invalid address type.\n");
-			exit(1);
-			break;
-		}
-		memcpy(ra_raw, hst->h_addr_list[0], hst->h_length);
+		ra_len = rp->ai_addrlen;
 	}
 
 	/* Initialize the global value for interactive mode functions.  */
@@ -1041,7 +1003,7 @@ command_poll(char *argv0)
 	fd_set *xbitsp = NULL;
 
 	struct msghdr outmsg;
-	struct hostent *hst;
+	struct addrinfo hints, *rp;
 	int msglen;
 	int temp_fd, temp_set;
 
@@ -1050,38 +1012,20 @@ command_poll(char *argv0)
 	/* If a remote host is specified, initialize the destination. */
 	if (remote_host) {
 		/* Set up the destination.  */
-		hst = gethostbyname(remote_host);
-		if (hst == NULL) {
-			hst = gethostbyname2(remote_host, AF_INET6);
-		}
-
-		if (hst == NULL || hst->h_length < 1) {
-			fprintf(stderr, "%s: bad hostname: %s\n",
-				argv0, remote_host);
-			exit(1);
+		memset(&hints, 0, sizeof(struct addrinfo));
+		hints.ai_family = AF_INET;
+		hints.ai_protocol = IPPROTO_SCTP;
+		if (getaddrinfo(remote_host, NULL, &hints, &rp) != 0) {
+			hints.ai_family = AF_INET6;
+			if (getaddrinfo(remote_host, NULL, &hints, &rp) != 0) {
+				fprintf(stderr, "%s: bad hostname: %s\n", argv0, remote_host);
+				exit(1);
+			}
 		}
-
-		ra_family = hst->h_addrtype;
-		switch (ra_family) {
-		case AF_INET:
-			ra_len = sizeof(remote_addr.v4);
-			ra_raw = &remote_addr.v4.sin_addr;
-			remote_addr.v4.sin_port = htons(remote_port);
-			remote_addr.v4.sin_family = AF_INET;
-			break;
-		case AF_INET6:
-			ra_len = sizeof(remote_addr.v6);
-			ra_raw = &remote_addr.v6.sin6_addr;
-			remote_addr.v6.sin6_port = htons(remote_port);
-			remote_addr.v6.sin6_family = AF_INET6;
+		memcpy(&remote_addr, rp->ai_addr, rp->ai_addrlen);
+		remote_addr.v4.sin_port = htons(remote_port); /* equal to v6.sin6_port */
+		if (rp->ai_family == AF_INET6)
 			remote_addr.v6.sin6_scope_id = if_index;
-			break;
-		default:
-			fprintf(stderr, "Invalid address type.\n");
-			exit(1);
-			break;
-		}
-		memcpy(ra_raw, hst->h_addr_list[0], hst->h_length);
 
 		/* Initialize the message struct we use to pass messages to
 	 	 * the remote socket.
@@ -1091,7 +1035,7 @@ command_poll(char *argv0)
 		outmsg.msg_control = NULL;
 		outmsg.msg_controllen = 0;
 		outmsg.msg_name = &remote_addr;
-		outmsg.msg_namelen = ra_len;
+		outmsg.msg_namelen = rp->ai_addrlen;
 		outmsg.msg_flags = 0;
 	}
 
@@ -1406,14 +1350,11 @@ struct sockaddr *
 append_addr(const char *parm, struct sockaddr *addrs, int *ret_count)
 {
 	struct sockaddr *new_addrs = NULL;
+	struct addrinfo hints, *res, *rp;
 	void *aptr;
 	struct sockaddr *sa_addr;
 	struct sockaddr_in *b4ap;
 	struct sockaddr_in6 *b6ap;
-	struct hostent *hst4 = NULL;
-	struct hostent *hst6 = NULL;
-	int i4 = 0;
-	int i6 = 0;
 	int j;
 	int orig_count = *ret_count;
 	int count = orig_count;
@@ -1421,28 +1362,17 @@ append_addr(const char *parm, struct sockaddr *addrs, int *ret_count)
 
 	if (!parm)
 		return NULL;
-	/* Get the entries for this host.  */
-	hst4 = gethostbyname(parm);
-	hst6 = gethostbyname2(parm, AF_INET6);
 
-	if ((NULL == hst4 || hst4->h_length < 1)
-	    && (NULL == hst6 || hst6->h_length < 1)) {
+	memset(&hints, 0, sizeof(struct addrinfo));
+	hints.ai_family = AF_UNSPEC;
+	hints.ai_protocol = IPPROTO_SCTP;
+	if (getaddrinfo(parm, NULL, &hints, &res) != 0) {
 		fprintf(stderr, "bad hostname: %s\n", parm);
 		goto finally;
 	}
 
-
-	/* Figure out the number of addresses.  */
-	if (NULL != hst4) {
-		for (i4 = 0; NULL != hst4->h_addr_list[i4]; ++i4) {
-			count++;
-		}
-	}
-	if (NULL != hst6) {
-		for (i6 = 0; NULL != hst6->h_addr_list[i6]; ++i6) {
-			count++;
-		}
-	}
+	for (rp = res; rp != NULL; rp = rp->ai_next)
+		count++;
 
 	/* Expand memory for the new addresses.  Assume all the addresses 
 	 * are v6 addresses.
@@ -1473,31 +1403,14 @@ append_addr(const char *parm, struct sockaddr *addrs, int *ret_count)
 	}	
 					
 	/* Put the new addresses away.  */
-	if (NULL != hst4) {
-		for (j = 0; j < i4; ++j) {
-			b4ap = (struct sockaddr_in *)aptr;
-			memset(b4ap, 0x00, sizeof(*b4ap));
-			b4ap->sin_family = AF_INET;
-			b4ap->sin_port = htons(local_port);
-			bcopy(hst4->h_addr_list[j], &b4ap->sin_addr,
-			      hst4->h_length);
-
-			aptr += sizeof(struct sockaddr_in);
-		} /* for (loop through the new v4 addresses) */
-	}
-
-	if (NULL != hst6) {
-		for (j = 0; j < i6; ++j) {
-			b6ap = (struct sockaddr_in6 *)aptr;
-			memset(b6ap, 0x00, sizeof(*b6ap));
-			b6ap->sin6_family = AF_INET6;
-			b6ap->sin6_port =  htons(local_port);
+	for (rp = res; rp != NULL; rp = rp->ai_next) {
+		b4ap = (struct sockaddr_in *)aptr;
+		b6ap = (struct sockaddr_in6 *)aptr;
+		bcopy(rp->ai_addr, aptr, rp->ai_addrlen);
+		b4ap->sin_port = htons(local_port); /* equal to b6ap.v6.sin6_port */
+		if (rp->ai_family == AF_INET6)
 			b6ap->sin6_scope_id = if_index;
-			bcopy(hst6->h_addr_list[j], &b6ap->sin6_addr,
-			      hst6->h_length);
-
-			aptr += sizeof(struct sockaddr_in6);
-		} /* for (loop through the new v6 addresses) */
+		aptr += rp->ai_addrlen;
 	}
 
  finally:
@@ -2123,7 +2036,7 @@ shutdown_func(char *argv0, int *skp, int shutdown_type)
 	struct cmsghdr *cmsg;
         int error=0, bytes_sent;
 	struct sctp_sndrcvinfo *sinfo;
-	struct hostent *hst;
+	struct addrinfo hints, *rp;
 	char *sd_type;
 	int sk = *skp;
 
@@ -2142,37 +2055,20 @@ shutdown_func(char *argv0, int *skp, int shutdown_type)
 	if (socket_type == SOCK_SEQPACKET) {
 		/* Set up the destination.  */
 		if (remote_host) {
-			hst = gethostbyname(remote_host);
-			if (hst == NULL) {
-				hst = gethostbyname2(remote_host, AF_INET6);
-			}
-
-			if (hst == NULL || hst->h_length < 1) {
-				fprintf(stderr, "%s: bad hostname: %s\n",
-					argv0, remote_host);
-				exit(1);
-			}
-
-			ra_family = hst->h_addrtype;
-			switch (ra_family) {
-			case AF_INET:
-				ra_len = sizeof(remote_addr.v4);
-				ra_raw = &remote_addr.v4.sin_addr;
-				remote_addr.v4.sin_port = htons(remote_port);
-				remote_addr.v4.sin_family = AF_INET;
-				break;
-			case AF_INET6:
-				ra_len = sizeof(remote_addr.v6);
-				ra_raw = &remote_addr.v6.sin6_addr;
-				remote_addr.v6.sin6_port = htons(remote_port);
-				remote_addr.v6.sin6_family = AF_INET6;
-				break;
-			default:
-				fprintf(stderr, "Invalid address type.\n");
-				exit(1);
-				break;
+			memset(&hints, 0, sizeof(struct addrinfo));
+			hints.ai_family = AF_INET;
+			hints.ai_protocol = IPPROTO_SCTP;
+			if (getaddrinfo(remote_host, NULL, &hints, &rp) != 0) {
+				hints.ai_family = AF_INET6;
+				if (getaddrinfo(remote_host, NULL, &hints, &rp) != 0) {
+					fprintf(stderr, "%s: bad hostname: %s\n",
+						argv0, remote_host);
+					exit(1);
+				}
 			}
-			memcpy(ra_raw, hst->h_addr_list[0], hst->h_length);
+			memcpy(&remote_addr, rp->ai_addr, rp->ai_addrlen);
+			remote_addr.v4.sin_port = htons(remote_port); /* equal to v6.sin6_port */
+			ra_len = rp->ai_addrlen;
 		}
 
 		/* Initialize the message struct we use to pass messages to
-- 
2.27.0


  parent reply	other threads:[~2021-08-04 11:29 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-04 11:29 [PATCH lksctp-tools 0/4] lksctp-tools: replace use of deprecated gethostbyname with getaddrinfo Xin Long
2021-08-04 11:29 ` [PATCH lksctp-tools 1/4] myftp: " Xin Long
2021-08-04 11:29 ` [PATCH lksctp-tools 2/4] sctp_xconnect: " Xin Long
2021-08-04 11:29 ` [PATCH lksctp-tools 3/4] sctp_test: " Xin Long
2021-08-04 11:29 ` Xin Long [this message]
2021-08-04 23:47 ` [PATCH lksctp-tools 0/4] lksctp-tools: " Xin Long
2021-08-11 17:27 ` mleitner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=957cd3ddeb19fa8bced4abe9cb160804fe73767e.1628076531.git.lucien.xin@gmail.com \
    --to=lucien.xin@gmail.com \
    --cc=linux-sctp@vger.kernel.org \
    --cc=marcelo.leitner@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.