From: Omar Polo 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 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;