Index | Thread | Search

From:
Florian Obser <florian@openbsd.org>
Subject:
Re: yppoll / ypset: convert to getaddrinfo
To:
tech@openbsd.org
Date:
Mon, 26 Aug 2024 21:11:59 +0200

Download raw body.

Thread
On 2024-08-22 18:22 +02, Florian Obser <florian@openbsd.org> wrote:
> pretty straight forward, untested for lack of YP...
> Tests, OKs?
>

Anyone?

diff --git yppoll.c yppoll.c
index 266f88b60cc..78c89e4c085 100644
--- yppoll.c
+++ yppoll.c
@@ -65,7 +65,7 @@ get_remote_info(char *indomain, char *inmap, char *server, int *outorder,
 	struct sockaddr_in rsrv_sin;
 	int rsrv_sock;
 	CLIENT *client;
-	struct hostent *h;
+	struct addrinfo hints, *res;
 	int r;
 
 	bzero((char *)&rsrv_sin, sizeof rsrv_sin);
@@ -73,14 +73,15 @@ get_remote_info(char *indomain, char *inmap, char *server, int *outorder,
 	rsrv_sin.sin_family = AF_INET;
 	rsrv_sock = RPC_ANYSOCK;
 
-	h = gethostbyname(server);
-	if (h == NULL) {
-		if (inet_aton(server, &rsrv_sin.sin_addr) == 0) {
-			fprintf(stderr, "unknown host %s\n", server);
-			exit(1);
-		}
-	} else
-		rsrv_sin.sin_addr.s_addr = *(u_int32_t *)h->h_addr;
+	memset(&hints, 0, sizeof(hints));
+	hints.ai_family = AF_INET;
+
+	if (getaddrinfo(server, NULL, &hints, &res) != 0) {
+		fprintf(stderr, "unknown host %s\n", server);
+		exit(1);
+	}
+	rsrv_sin.sin_addr = ((struct sockaddr_in *)res->ai_addr)->sin_addr;
+	freeaddrinfo(res);
 
 	tv.tv_sec = 10;
 	tv.tv_usec = 0;


diff --git ypset.c ypset.c
index ebd86597fa1..103b8235861 100644
--- ypset.c
+++ ypset.c
@@ -54,7 +54,7 @@ bind_tohost(struct sockaddr_in *sin, char *dom, char *server)
 {
 	struct ypbind_setdom ypsd;
 	struct in_addr iaddr;
-	struct hostent *hp;
+	struct addrinfo hints, *res;
 	struct timeval tv;
 	CLIENT *client;
 	int sock, port, r;
@@ -66,12 +66,14 @@ bind_tohost(struct sockaddr_in *sin, char *dom, char *server)
 
 	memset(&ypsd, 0, sizeof ypsd);
 
-	if (inet_aton(server, &iaddr) == 0) {
-		hp = gethostbyname(server);
-		if (hp == NULL)
-			errx(1, "can't find address for %s", server);
-		memmove(&iaddr.s_addr, hp->h_addr, sizeof(iaddr.s_addr));
-	}
+		memset(&hints, 0, sizeof(hints));
+	hints.ai_family = AF_INET;
+
+	if (getaddrinfo(server, NULL, &hints, &res) != 0)
+		errx(1, "can't find address for %s", server);
+	iaddr = ((struct sockaddr_in *)res->ai_addr)->sin_addr;
+	freeaddrinfo(res);
+
 	ypsd.ypsetdom_domain = dom;
 	bcopy(&iaddr.s_addr, &ypsd.ypsetdom_binding.ypbind_binding_addr,
 	    sizeof(ypsd.ypsetdom_binding.ypbind_binding_addr));
@@ -105,7 +107,7 @@ int
 main(int argc, char *argv[])
 {
 	struct sockaddr_in sin;
-	struct hostent *hent;
+	struct addrinfo hints, *res;
 	extern char *optarg;
 	extern int optind;
 	char *domainname;
@@ -123,13 +125,15 @@ main(int argc, char *argv[])
 			domainname = optarg;
 			break;
 		case 'h':
-			if (inet_aton(optarg, &sin.sin_addr) == 0) {
-				hent = gethostbyname(optarg);
-				if (hent == NULL)
-					errx(1, "host %s unknown\n", optarg);
-				bcopy(hent->h_addr, &sin.sin_addr,
-				    sizeof(sin.sin_addr));
-			}
+			memset(&hints, 0, sizeof(hints));
+			hints.ai_family = AF_INET;
+
+			if (getaddrinfo(optarg, NULL, &hints, &res) != 0)
+				errx(1, "host %s unknown\n", optarg);
+
+			sin.sin_addr =
+			    ((struct sockaddr_in *)res->ai_addr)->sin_addr;
+			freeaddrinfo(res);
 			break;
 		default:
 			usage();


-- 
In my defence, I have been left unsupervised.