"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Omar Polo <op@omarpolo.com>
Subject:
remove host, host_v4 and host_v6; rename host_dns -> host
To:
gameoftrees@openbsd.org
Date:
Mon, 29 May 2023 18:35:02 +0200

Download raw body.

Thread
This is an attempt at simplifying how host() works.  host() is used in
the configuration file via get_addrs() to prepare a struct address
after a "listen on" directive

The current code first tries to resolve it as an ipv4 address via
inet_pton(), then as an ipv6 address using getaddrinfo() with
AI_NUMERICHOST, then as an interface name and finally as a name to
resolve via getaddrinfo() again.

Instead, scratch host(), host_v4() and host_v6() and rename host_dns()
to host().  It preserve the lookup via interface name, and then uses
getaddrinfo() only once wich already knows how to deal with IPv4/v6
literals and resolving addresses too.

ok?


diff 1adf41e8089257344579fba9c7e03d7ebc0c15b8 748f613ecec2c026f9351e11e7f25fd19d71e9d6
commit - 1adf41e8089257344579fba9c7e03d7ebc0c15b8
commit + 748f613ecec2c026f9351e11e7f25fd19d71e9d6
blob - 3b73a07923fb6fec5efd9fea7f055fc7f917cfae
blob + d01669e79c40ee6a64a1ed544069b368ac00bac0
--- gotwebd/parse.y
+++ gotwebd/parse.y
@@ -99,14 +99,10 @@ struct address	*host_v4(const char *);
 int		 addr_dup_check(struct addresslist *, struct address *,
 		    const char *, const char *);
 int		 add_addr(struct server *, struct address *);
-struct address	*host_v4(const char *);
-struct address	*host_v6(const char *);
-int		 host_dns(const char *, struct server *,
-		    int, in_port_t, const char *, int);
-int		 host_if(const char *, struct server *,
-		    int, in_port_t, const char *, int);
 int		 host(const char *, struct server *,
 		    int, in_port_t, const char *, int);
+int		 host_if(const char *, struct server *,
+		    int, in_port_t, const char *, int);
 int		 is_if_in_group(const char *, const char *);
 
 typedef struct {
@@ -1001,50 +997,8 @@ struct address *
 	return (unsigned short)llval;
 }
 
-struct address *
-host_v4(const char *s)
-{
-	struct in_addr ina;
-	struct sockaddr_in *sain;
-	struct address *h;
-
-	memset(&ina, 0, sizeof(ina));
-	if (inet_pton(AF_INET, s, &ina) != 1)
-		return (NULL);
-
-	if ((h = calloc(1, sizeof(*h))) == NULL)
-		fatal(__func__);
-	sain = (struct sockaddr_in *)&h->ss;
-	got_sockaddr_inet_init(sain, &ina);
-	return (h);
-}
-
-struct address *
-host_v6(const char *s)
-{
-	struct addrinfo hints, *res;
-	struct sockaddr_in6 *sa_in6, *ra;
-	struct address *h = NULL;
-
-	memset(&hints, 0, sizeof(hints));
-	hints.ai_family = AF_INET6;
-	hints.ai_socktype = SOCK_DGRAM; /* dummy */
-	hints.ai_flags = AI_NUMERICHOST;
-	if (getaddrinfo(s, "0", &hints, &res) == 0) {
-		if ((h = calloc(1, sizeof(*h))) == NULL)
-			fatal(__func__);
-		sa_in6 = (struct sockaddr_in6 *)&h->ss;
-		ra = (struct sockaddr_in6 *)res->ai_addr;
-		got_sockaddr_inet6_init(sa_in6, &ra->sin6_addr,
-		    ra->sin6_scope_id);
-		freeaddrinfo(res);
-	}
-
-	return (h);
-}
-
 int
-host_dns(const char *s, struct server *new_srv, int max,
+host(const char *s, struct server *new_srv, int max,
     in_port_t port, const char *ifname, int ipproto)
 {
 	struct addrinfo hints, *res0, *res;
@@ -1190,41 +1144,6 @@ host(const char *s, struct server *new_srv, int max,
 }
 
 int
-host(const char *s, struct server *new_srv, int max,
-    in_port_t port, const char *ifname, int ipproto)
-{
-	struct address *h;
-
-	h = host_v4(s);
-
-	/* IPv6 address? */
-	if (h == NULL)
-		h = host_v6(s);
-
-	if (h != NULL) {
-		if (port)
-			h->port = port;
-		if (ifname != NULL) {
-			if (strlcpy(h->ifname, ifname, sizeof(h->ifname)) >=
-			    sizeof(h->ifname)) {
-				log_warnx("%s: interface name truncated",
-				    __func__);
-				free(h);
-				return (-1);
-			}
-		}
-		if (ipproto != -1)
-			h->ipproto = ipproto;
-
-		if (add_addr(new_srv, h))
-			return -1;
-		return (1);
-	}
-
-	return (host_dns(s, new_srv, max, port, ifname, ipproto));
-}
-
-int
 is_if_in_group(const char *ifname, const char *groupname)
 {
 	unsigned int len;