static const char * netname4(in_addr_t in, in_addr_t mask) { char *cp = 0; static char line[MAXHOSTNAMELEN + sizeof("&0xffffffff")]; char nline[INET_ADDRSTRLEN]; struct netent *np = 0; in_addr_t i; if (in == INADDR_ANY && mask == 0) { strlcpy(line, "default", sizeof(line)); return (line); } /* It is ok to supply host address. */ in &= mask; i = ntohl(in); if (!numeric_addr && i) { np = getnetbyaddr(i >> NSHIFT(ntohl(mask)), AF_INET); if (np != NULL) { cp = np->n_name; trimdomain(cp, strlen(cp)); } }
char * routename(in_addr_t in) { char *cp; static char line[MAXHOSTNAMELEN]; struct hostent *hp; cp = 0; if (!numeric_addr) { hp = gethostbyaddr(&in, sizeof (struct in_addr), AF_INET); if (hp) { cp = hp->h_name; trimdomain(cp, strlen(cp)); } } if (cp) { strlcpy(line, cp, sizeof(line)); } else { #define C(x) ((x) & 0xff) in = ntohl(in); sprintf(line, "%u.%u.%u.%u", C(in >> 24), C(in >> 16), C(in >> 8), C(in)); } return (line); }
char * routename(struct sockaddr *sa, int flags) { static char line[NI_MAXHOST]; int error, f; f = (flags) ? NI_NUMERICHOST : 0; error = getnameinfo(sa, sa->sa_len, line, sizeof(line), NULL, 0, f); if (error) { const void *src; switch (sa->sa_family) { #ifdef INET case AF_INET: src = &satosin(sa)->sin_addr; break; #endif /* INET */ #ifdef INET6 case AF_INET6: src = &satosin6(sa)->sin6_addr; break; #endif /* INET6 */ default: return(line); } inet_ntop(sa->sa_family, src, line, sizeof(line) - 1); return (line); } trimdomain(line, strlen(line)); return (line); }
/* * Return the name of the network whose address is given. * The address is assumed to be that of a net or subnet, not a host. */ char * netname(u_long in, u_long mask) { char *cp = 0; static char line[MAXHOSTNAMELEN]; struct netent *np = 0; u_long dmask; u_long i; #define NSHIFT(m) ( \ (m) == IN_CLASSA_NET ? IN_CLASSA_NSHIFT : \ (m) == IN_CLASSB_NET ? IN_CLASSB_NSHIFT : \ (m) == IN_CLASSC_NET ? IN_CLASSC_NSHIFT : \ 0) i = ntohl(in); dmask = forgemask(i); if (!numeric_addr && i) { np = getnetbyaddr(i >> NSHIFT(mask), AF_INET); if (np == NULL && mask == 0) np = getnetbyaddr(i >> NSHIFT(dmask), AF_INET); if (np != NULL) { cp = np->n_name; trimdomain(cp, strlen(cp)); } }
/* * Return the name of the network whose address is given. * The address is assumed to be that of a net or subnet, not a host. */ char * netname(in_addr_t in, u_long mask) { char *cp = 0; static char line[MAXHOSTNAMELEN]; struct netent *np = 0; in_addr_t i; i = ntohl(in); if (!numeric_addr && i) { np = getnetbyaddr(i >> NSHIFT(mask), AF_INET); if (np != NULL) { cp = np->n_name; trimdomain(cp, strlen(cp)); } }
void testit(const char *input, int hostsize, const char *output, const char *test) { char *testhost; const char *expected = (output == NULL) ? input : output; testhost = strdup(input); trimdomain(testhost, hostsize < 0 ? (int)strlen(testhost) : hostsize); tests++; if (strcmp(testhost, expected) != 0) { printf("not ok %d - %s\n", tests, test); printf("# %s -> %s (expected %s)\n", input, testhost, expected); } else printf("ok %d - %s\n", tests, test); free(testhost); return; }
/* * Return the name of the network whose address is given. */ char * netname(in_addr_t in, in_addr_t mask) { char *cp = 0; static char line[MAXHOSTNAMELEN]; struct netent *np = 0; in_addr_t i; /* It is ok to supply host address. */ in &= mask; i = ntohl(in); if (!numeric_addr && i) { np = getnetbyaddr(i >> NSHIFT(ntohl(mask)), AF_INET); if (np != NULL) { cp = np->n_name; trimdomain(cp, strlen(cp)); } }
/* * Construct an Internet address representation. * If numeric_addr has been supplied, give * numeric value, otherwise try for symbolic name. */ char * inetname(struct in_addr *inp) { char *cp; static char line[MAXHOSTNAMELEN]; struct hostent *hp; struct netent *np; cp = 0; if (!numeric_addr && inp->s_addr != INADDR_ANY) { int net = inet_netof(*inp); int lna = inet_lnaof(*inp); if (lna == INADDR_ANY) { np = getnetbyaddr(net, AF_INET); if (np) cp = np->n_name; } if (cp == NULL) { hp = gethostbyaddr((char *)inp, sizeof (*inp), AF_INET); if (hp) { cp = hp->h_name; trimdomain(cp, strlen(cp)); } } } if (inp->s_addr == INADDR_ANY) strcpy(line, "*"); else if (cp) { strlcpy(line, cp, sizeof(line)); } else { inp->s_addr = ntohl(inp->s_addr); #define C(x) ((u_int)((x) & 0xff)) snprintf(line, sizeof(line), "%u.%u.%u.%u", C(inp->s_addr >> 24), C(inp->s_addr >> 16), C(inp->s_addr >> 8), C(inp->s_addr)); } return (line); }
int realhostname(char *host, size_t hsize, const struct in_addr *ip) { char trimmed[MAXHOSTNAMELEN]; int result; struct hostent *hp; result = HOSTNAME_INVALIDADDR; hp = gethostbyaddr((const char *)ip, sizeof(*ip), AF_INET); if (hp != NULL) { strlcpy(trimmed, hp->h_name, sizeof(trimmed)); trimdomain(trimmed, strlen(trimmed)); if (strlen(trimmed) <= hsize) { char lookup[MAXHOSTNAMELEN]; strncpy(lookup, hp->h_name, sizeof(lookup) - 1); lookup[sizeof(lookup) - 1] = '\0'; hp = gethostbyname(lookup); if (hp == NULL) result = HOSTNAME_INVALIDNAME; else for (; ; hp->h_addr_list++) { if (*hp->h_addr_list == NULL) { result = HOSTNAME_INCORRECTNAME; break; } if (!memcmp(*hp->h_addr_list, ip, sizeof(*ip))) { strncpy(host, trimmed, hsize); return HOSTNAME_FOUND; } } } } strncpy(host, inet_ntoa(*ip), hsize); return result; }
int realhostname_sa(char *host, size_t hsize, struct sockaddr *addr, int addrlen) { int result, error; char buf[NI_MAXHOST]; #ifdef INET6 struct sockaddr_in lsin; #endif result = HOSTNAME_INVALIDADDR; #ifdef INET6 /* IPv4 mapped IPv6 addr consideraton, specified in rfc2373. */ if (addr->sa_family == AF_INET6 && addrlen == sizeof(struct sockaddr_in6) && IN6_IS_ADDR_V4MAPPED(&SOCKADDR_IN6(addr)->sin6_addr)) { struct sockaddr_in6 *sin6; sin6 = SOCKADDR_IN6(addr); memset(&lsin, 0, sizeof(lsin)); lsin.sin_len = sizeof(struct sockaddr_in); lsin.sin_family = AF_INET; lsin.sin_port = sin6->sin6_port; memcpy(&lsin.sin_addr, &sin6->sin6_addr.s6_addr[12], sizeof(struct in_addr)); addr = (struct sockaddr *)&lsin; addrlen = lsin.sin_len; } #endif error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0, NI_NAMEREQD); if (error == 0) { struct addrinfo hints, *res, *ores; struct sockaddr *sa; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = addr->sa_family; hints.ai_flags = AI_CANONNAME | AI_PASSIVE; hints.ai_socktype = SOCK_STREAM; error = getaddrinfo(buf, NULL, &hints, &res); if (error) { result = HOSTNAME_INVALIDNAME; goto numeric; } for (ores = res; ; res = res->ai_next) { if (res == NULL) { freeaddrinfo(ores); result = HOSTNAME_INCORRECTNAME; goto numeric; } sa = res->ai_addr; if (sa == NULL) { freeaddrinfo(ores); result = HOSTNAME_INCORRECTNAME; goto numeric; } if (sa->sa_len == addrlen && sa->sa_family == addr->sa_family) { SOCKINET(sa)->si_port = SOCKINET(addr)->si_port; #ifdef INET6 /* * XXX: sin6_socpe_id may not been * filled by DNS */ if (sa->sa_family == AF_INET6 && SOCKADDR_IN6(sa)->sin6_scope_id == 0) SOCKADDR_IN6(sa)->sin6_scope_id = SOCKADDR_IN6(addr)->sin6_scope_id; #endif if (!memcmp(sa, addr, sa->sa_len)) { result = HOSTNAME_FOUND; if (ores->ai_canonname == NULL) { freeaddrinfo(ores); goto numeric; } strlcpy(buf, ores->ai_canonname, sizeof(buf)); trimdomain(buf, hsize); if (strlen(buf) > hsize && addr->sa_family == AF_INET) { freeaddrinfo(ores); goto numeric; } strncpy(host, buf, hsize); break; } } } freeaddrinfo(ores); } else { numeric: if (getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0, NI_NUMERICHOST) == 0) strncpy(host, buf, hsize); } return result; }