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