| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- #include "gai_hdr.h"
- /*
- * Handle either an IPv4 or an IPv6 address and port.
- */
- /* include gn_ipv46 */
- int
- gn_ipv46(char *host, size_t hostlen, char *serv, size_t servlen,
- void *aptr, size_t alen, int family, int port, int flags)
- {
- char *ptr;
- struct hostent *hptr;
- struct servent *sptr;
- if (hostlen > 0) {
- if (flags & NI_NUMERICHOST) {
- if (inet_ntop(family, aptr, host, hostlen) == NULL)
- return(1);
- } else {
- hptr = gethostbyaddr(aptr, alen, family);
- if (hptr != NULL && hptr->h_name != NULL) {
- if (flags & NI_NOFQDN) {
- if ( (ptr = strchr(hptr->h_name, '.')) != NULL)
- *ptr = 0; /* overwrite first dot */
- }
- snprintf(host, hostlen, "%s", hptr->h_name);
- } else {
- if (flags & NI_NAMEREQD)
- return(1);
- if (inet_ntop(family, aptr, host, hostlen) == NULL)
- return(1);
- }
- }
- }
- if (servlen > 0) {
- if (flags & NI_NUMERICSERV) {
- snprintf(serv, servlen, "%d", ntohs(port));
- } else {
- sptr = getservbyport(port, (flags & NI_DGRAM) ? "udp" : NULL);
- if (sptr != NULL && sptr->s_name != NULL)
- snprintf(serv, servlen, "%s", sptr->s_name);
- else
- snprintf(serv, servlen, "%d", ntohs(port));
- }
- }
- return(0);
- }
- /* end gn_ipv46 */
|