diff options
Diffstat (limited to 'libc/inet')
-rw-r--r-- | libc/inet/getaddrinfo.c | 125 |
1 files changed, 64 insertions, 61 deletions
diff --git a/libc/inet/getaddrinfo.c b/libc/inet/getaddrinfo.c index f3440c8c3..b1aae1281 100644 --- a/libc/inet/getaddrinfo.c +++ b/libc/inet/getaddrinfo.c @@ -169,45 +169,49 @@ struct gaih { static unsigned __check_pf(void) { unsigned seen = 0; + #if defined __UCLIBC_SUPPORT_AI_ADDRCONFIG__ - { - /* Get the interface list via getifaddrs. */ - struct ifaddrs *ifa = NULL; - struct ifaddrs *runp; - if (getifaddrs(&ifa) != 0) { - /* We cannot determine what interfaces are available. - * Be optimistic. */ + + struct ifaddrs *ifa; + struct ifaddrs *runp; + + /* Get the interface list via getifaddrs. */ + if (getifaddrs(&ifa) != 0) { + /* We cannot determine what interfaces are available. + * Be optimistic. */ #if defined __UCLIBC_HAS_IPV4__ - seen |= SEEN_IPV4; -#endif /* __UCLIBC_HAS_IPV4__ */ + seen |= SEEN_IPV4; +#endif #if defined __UCLIBC_HAS_IPV6__ - seen |= SEEN_IPV6; -#endif /* __UCLIBC_HAS_IPV6__ */ - return seen; - } + seen |= SEEN_IPV6; +#endif + return seen; + } - for (runp = ifa; runp != NULL; runp = runp->ifa_next) { + for (runp = ifa; runp != NULL; runp = runp->ifa_next) { #if defined __UCLIBC_HAS_IPV4__ - if (runp->ifa_addr->sa_family == PF_INET) - seen |= SEEN_IPV4; -#endif /* __UCLIBC_HAS_IPV4__ */ + if (runp->ifa_addr->sa_family == PF_INET) + seen |= SEEN_IPV4; +#endif #if defined __UCLIBC_HAS_IPV6__ - if (runp->ifa_addr->sa_family == PF_INET6) - seen |= SEEN_IPV6; -#endif /* __UCLIBC_HAS_IPV6__ */ - } - freeifaddrs(ifa); + if (runp->ifa_addr->sa_family == PF_INET6) + seen |= SEEN_IPV6; +#endif } + freeifaddrs(ifa); + #else + /* AI_ADDRCONFIG is disabled, assume both ipv4 and ipv6 available. */ #if defined __UCLIBC_HAS_IPV4__ seen |= SEEN_IPV4; -#endif /* __UCLIBC_HAS_IPV4__ */ +#endif #if defined __UCLIBC_HAS_IPV6__ seen |= SEEN_IPV6; -#endif /* __UCLIBC_HAS_IPV6__ */ +#endif #endif /* __UCLIBC_SUPPORT_AI_ADDRCONFIG__ */ + return seen; } @@ -264,52 +268,51 @@ gaih_local(const char *name, const struct gaih_service *service, strcmp(name, "unix") && strcmp(name, utsname.nodename)) return (GAIH_OKIFUNSPEC | -EAI_NONAME); - } + } - if (req->ai_protocol || req->ai_socktype) { - const struct gaih_typeproto *tp = gaih_inet_typeproto + 1; + if (req->ai_protocol || req->ai_socktype) { + const struct gaih_typeproto *tp = gaih_inet_typeproto + 1; - while (tp->name[0] - && ((tp->protoflag & GAI_PROTO_NOSERVICE) != 0 - || (req->ai_socktype != 0 && req->ai_socktype != tp->socktype) - || (req->ai_protocol != 0 && !(tp->protoflag & GAI_PROTO_PROTOANY) && req->ai_protocol != tp->protocol)) - ) { - ++tp; - } - if (! tp->name[0]) { - if (req->ai_socktype) - return (GAIH_OKIFUNSPEC | -EAI_SOCKTYPE); - return (GAIH_OKIFUNSPEC | -EAI_SERVICE); - } + while (tp->name[0] + && ((tp->protoflag & GAI_PROTO_NOSERVICE) != 0 + || (req->ai_socktype != 0 && req->ai_socktype != tp->socktype) + || (req->ai_protocol != 0 && !(tp->protoflag & GAI_PROTO_PROTOANY) && req->ai_protocol != tp->protocol)) + ) { + ++tp; } + if (! tp->name[0]) { + if (req->ai_socktype) + return (GAIH_OKIFUNSPEC | -EAI_SOCKTYPE); + return (GAIH_OKIFUNSPEC | -EAI_SERVICE); + } + } - *pai = ai = malloc(sizeof(struct addrinfo) + sizeof(struct sockaddr_un) - + ((req->ai_flags & AI_CANONNAME) - ? (strlen(utsname.nodename) + 1) : 0)); - if (ai == NULL) - return -EAI_MEMORY; - - ai->ai_next = NULL; - ai->ai_flags = req->ai_flags; - ai->ai_family = AF_LOCAL; - ai->ai_socktype = req->ai_socktype ? req->ai_socktype : SOCK_STREAM; - ai->ai_protocol = req->ai_protocol; - ai->ai_addrlen = sizeof(struct sockaddr_un); - ai->ai_addr = (void *)ai + sizeof(struct addrinfo); + *pai = ai = malloc(sizeof(struct addrinfo) + sizeof(struct sockaddr_un) + + ((req->ai_flags & AI_CANONNAME) + ? (strlen(utsname.nodename) + 1) : 0)); + if (ai == NULL) + return -EAI_MEMORY; + + ai->ai_next = NULL; + ai->ai_flags = req->ai_flags; + ai->ai_family = AF_LOCAL; + ai->ai_socktype = req->ai_socktype ? req->ai_socktype : SOCK_STREAM; + ai->ai_protocol = req->ai_protocol; + ai->ai_addrlen = sizeof(struct sockaddr_un); + ai->ai_addr = (void *)ai + sizeof(struct addrinfo); #if SALEN - ((struct sockaddr_un *)ai->ai_addr)->sun_len = sizeof(struct sockaddr_un); + ((struct sockaddr_un *)ai->ai_addr)->sun_len = sizeof(struct sockaddr_un); #endif /* SALEN */ - ((struct sockaddr_un *)ai->ai_addr)->sun_family = AF_LOCAL; - memset(((struct sockaddr_un *)ai->ai_addr)->sun_path, 0, UNIX_PATH_MAX); - - if (service) { - struct sockaddr_un *sunp = (struct sockaddr_un *)ai->ai_addr; + ((struct sockaddr_un *)ai->ai_addr)->sun_family = AF_LOCAL; + memset(((struct sockaddr_un *)ai->ai_addr)->sun_path, 0, UNIX_PATH_MAX); - if (strchr(service->name, '/') != NULL) { - if (strlen(service->name) >= sizeof(sunp->sun_path)) - return GAIH_OKIFUNSPEC | -EAI_SERVICE; + if (service) { + struct sockaddr_un *sunp = (struct sockaddr_un *)ai->ai_addr; + if (strchr(service->name, '/') != NULL) { + if (strlen(service->name) >= sizeof(sunp->sun_path)) + return GAIH_OKIFUNSPEC | -EAI_SERVICE; strcpy(sunp->sun_path, service->name); } else { if (strlen(P_tmpdir "/") + 1 + strlen(service->name) >= sizeof(sunp->sun_path)) |