Index | Thread | Search

From:
Florian Obser <florian@openbsd.org>
Subject:
dhcrelay: use getaddrinfo(3)
To:
tech <tech@openbsd.org>
Date:
Wed, 21 Aug 2024 10:16:37 +0200

Download raw body.

Thread
  • Florian Obser:

    dhcrelay: use getaddrinfo(3)

Not using dhcrelay, but it still starts with a list of hostnames &
ip addresses :)

Tests, OK?

diff --git dhcrelay.c dhcrelay.c
index ff5b355dfc6..6fc20273a28 100644
--- dhcrelay.c
+++ dhcrelay.c
@@ -162,12 +162,15 @@ main(int argc, char *argv[])
 	}
 
 	while (argc > 0) {
-		struct hostent		*he;
+		struct addrinfo hints, *res;
 		struct in_addr		 ia, *iap = NULL;
 
 		if ((sp = calloc(1, sizeof(*sp))) == NULL)
 			fatalx("calloc");
 
+		memset(&hints, 0, sizeof(hints));
+		hints.ai_family = AF_INET;
+
 		if ((sp->intf = register_interface(argv[0], got_one,
 		    1)) != NULL) {
 			if (drm == DRM_LAYER3)
@@ -185,15 +188,14 @@ main(int argc, char *argv[])
 			continue;
 		}
 
-		if (inet_aton(argv[0], &ia))
-			iap = &ia;
+		if (getaddrinfo(argv[0], NULL, &hints, &res) != 0)
+			log_warnx("%s: host unknown", argv[0]);
 		else {
-			he = gethostbyname(argv[0]);
-			if (!he)
-				log_warnx("%s: host unknown", argv[0]);
-			else
-				iap = ((struct in_addr *)he->h_addr_list[0]);
+			ia = ((struct sockaddr_in *)res->ai_addr)->sin_addr;
+			iap = &ia;
+			freeaddrinfo(res);
 		}
+
 		if (iap) {
 			if (drm == DRM_LAYER2)
 				fatalx("don't mix interfaces with hosts");

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