From e44ac51d213c193c894747fef6d61f521d0a7804 Mon Sep 17 00:00:00 2001 From: Xin Long Date: Wed, 4 Aug 2021 07:29:16 -0400 Subject: [PATCH 4/4] sctp_darn: replace use of deprecated gethostbyname with getaddrinfo 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 Signed-off-by: Marcelo Ricardo Leitner --- 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