- np = getnetbyaddr(host_ad, AF_INET);
- if (np != NULL)
- safe_strncpy(name, np->n_name, len);
- }
- if ((ent == NULL) && (np == NULL))
- safe_strncpy(name, inet_ntoa(s_in->sin_addr), len);
- pn = (struct addr *) xmalloc(sizeof(struct addr));
- pn->addr = *s_in;
- pn->next = INET_nn;
- pn->host = host;
- pn->name = xstrdup(name);
- INET_nn = pn;
-
- return (0);
+ np = getnetbyaddr(host_ad, AF_INET);
+ if (np != NULL) {
+ safe_strncpy(name, np->n_name, len);
+ }
+ }
+ if ((ent == NULL) && (np == NULL)) {
+ safe_strncpy(name, inet_ntoa(s_in->sin_addr), len);
+ }
+ pn = xmalloc(sizeof(struct addr));
+ pn->addr = *s_in;
+ pn->next = INET_nn;
+ pn->host = host;
+ pn->name = xstrdup(name);
+ INET_nn = pn;
+
+ return 0;
+}
+
+#ifdef CONFIG_FEATURE_IPV6
+
+int INET6_resolve(const char *name, struct sockaddr_in6 *sin6)
+{
+ struct addrinfo req, *ai;
+ int s;
+
+ memset(&req, '\0', sizeof req);
+ req.ai_family = AF_INET6;
+ s = getaddrinfo(name, NULL, &req, &ai);
+ if (s) {
+ bb_error_msg("getaddrinfo: %s: %d", name, s);
+ return -1;
+ }
+ memcpy(sin6, ai->ai_addr, sizeof(struct sockaddr_in6));
+
+ freeaddrinfo(ai);
+
+ return 0;
+}
+
+#ifndef IN6_IS_ADDR_UNSPECIFIED
+# define IN6_IS_ADDR_UNSPECIFIED(a) \
+ (((uint32_t *) (a))[0] == 0 && ((uint32_t *) (a))[1] == 0 && \
+ ((uint32_t *) (a))[2] == 0 && ((uint32_t *) (a))[3] == 0)
+#endif
+
+
+int INET6_rresolve(char *name, size_t len, struct sockaddr_in6 *sin6,
+ int numeric)
+{
+ int s;
+
+ /* Grmpf. -FvK */
+ if (sin6->sin6_family != AF_INET6) {
+#ifdef DEBUG
+ bb_error_msg("rresolve: unsupport address family %d!",
+ sin6->sin6_family);
+#endif
+ errno = EAFNOSUPPORT;
+ return -1;
+ }
+ if (numeric & 0x7FFF) {
+ inet_ntop(AF_INET6, &sin6->sin6_addr, name, len);
+ return 0;
+ }
+ if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
+ if (numeric & 0x8000) {
+ strcpy(name, bb_str_default);
+ } else {
+ name[0] = '*';
+ name[1] = '\0';
+ }
+ return 0;
+ }
+
+ s = getnameinfo((struct sockaddr *) sin6, sizeof(struct sockaddr_in6), name, len, NULL, 0, 0);
+ if (s) {
+ bb_error_msg("getnameinfo failed");
+ return -1;
+ }
+ return 0;