6 #include <sys/socket.h>
7 #include <netinet/in.h>
11 int getnameinfo(const struct sockaddr *restrict sa, socklen_t sl,
12 char *restrict node, socklen_t nodelen,
13 char *restrict serv, socklen_t servlen,
17 unsigned char reply[512];
18 int af = sa->sa_family;
23 a = (void *)&((struct sockaddr_in *)sa)->sin_addr;
24 if (sl != sizeof(struct sockaddr_in)) return EAI_FAMILY;
27 a = (void *)&((struct sockaddr_in6 *)sa)->sin6_addr;
28 if (sl != sizeof(struct sockaddr_in6)) return EAI_FAMILY;
34 if (node && nodelen) {
35 if ((flags & NI_NUMERICHOST)
36 || __dns_query(reply, a, af, 1) <= 0
37 || __dns_get_rr(buf, 0, 256, 1, reply, RR_PTR, 1) <= 0)
39 if (flags & NI_NAMEREQD) return EAI_NONAME;
40 inet_ntop(af, a, buf, sizeof buf);
42 if (strlen(buf) >= nodelen) return EAI_OVERFLOW;
46 if (serv && servlen) {
47 if (snprintf(buf, sizeof buf, "%d",
48 ntohs(((struct sockaddr_in *)sa)->sin_port))>=servlen)