static struct hostent *my_gethostbyaddr(const char *addr, int len, int type) { /* FIXME problem for threaded ? */ static struct hostent h; static char hostname[EI_MAXHOSTNAMELEN+1]; static char *aliases[1] = { NULL }; static unsigned long inaddr; static char *addrp[2] = {(char *)&inaddr, NULL}; memmove(&inaddr,addr,sizeof(inaddr)); if ((hostGetByAddr(inaddr,hostname)) == ERROR) { h_errno = HOST_NOT_FOUND; return NULL; } h_errno = 0; h.h_name = hostname; h.h_aliases = aliases; h.h_length = 4; h.h_addrtype = AF_INET; h.h_addr_list = addrp; return &h; }
int __gnat_gethostbyaddr (const char *addr, int len, int type, struct hostent *ret, char *buf, size_t buflen, int *h_errnop) { if (type != AF_INET) { *h_errnop = EAFNOSUPPORT; return -1; } if (addr == NULL || len != 4) { *h_errnop = EINVAL; return -1; } if (hostGetByAddr (*(int*)addr, &vxw_h_name) != OK) { *h_errnop = __gnat_get_h_errno (); return -1; } vxw_h_addr = addr; ret->h_name = &vxw_h_name; ret->h_aliases = &vxw_h_aliases; ret->h_addrtype = AF_INET; ret->h_length = 4; ret->h_addr_list = &vxw_h_addr_list; }
HostEntry DNS::hostByAddress(const IPAddress& address, unsigned #ifdef POCO_HAVE_ADDRINFO hintFlags #endif ) { #if defined(POCO_HAVE_LIBRESOLV) Poco::ScopedReadRWLock readLock(resolverLock); #endif #if defined(POCO_HAVE_ADDRINFO) SocketAddress sa(address, 0); static char fqname[1024]; int rc = getnameinfo(sa.addr(), sa.length(), fqname, sizeof(fqname), NULL, 0, NI_NAMEREQD); if (rc == 0) { struct addrinfo* pAI; struct addrinfo hints; std::memset(&hints, 0, sizeof(hints)); hints.ai_flags = hintFlags; rc = getaddrinfo(fqname, NULL, &hints, &pAI); if (rc == 0) { HostEntry result(pAI); freeaddrinfo(pAI); return result; } else { aierror(rc, address.toString()); } } else { aierror(rc, address.toString()); } #elif defined(POCO_VXWORKS) char name[MAXHOSTNAMELEN + 1]; if (hostGetByAddr(*reinterpret_cast<const int*>(address.addr()), name) == OK) { return HostEntry(std::string(name), address); } #else struct hostent* he = gethostbyaddr(reinterpret_cast<const char*>(address.addr()), address.length(), address.af()); if (he) { return HostEntry(he); } #endif int err = lastError(); error(err, address.toString()); // will throw an appropriate exception throw NetException(); // to silence compiler }
/* * ipAddrToHostName */ epicsShareFunc unsigned epicsShareAPI ipAddrToHostName (const struct in_addr *pAddr, char *pBuf, unsigned bufSize) { int status; int errnoCopy = errno; unsigned len; if (bufSize<1) { return 0; } if (bufSize>MAXHOSTNAMELEN) { status = hostGetByAddr ((int)pAddr->s_addr, pBuf); if (status==OK) { pBuf[MAXHOSTNAMELEN] = '\0'; len = strlen (pBuf); } else { len = 0; } } else { char name[MAXHOSTNAMELEN+1]; status = hostGetByAddr (pAddr->s_addr, name); if (status==OK) { strncpy (pBuf, name, bufSize); pBuf[bufSize-1] = '\0'; len = strlen (pBuf); } else { len = 0; } } errno = errnoCopy; return len; }
HostEntry DNS::hostByAddress(const IPAddress& address) { NetworkInitializer networkInitializer; #if defined(POCO_HAVE_IPv6) || defined(POCO_HAVE_ADDRINFO) SocketAddress sa(address, 0); static char fqname[1024]; int rc = getnameinfo(sa.addr(), sa.length(), fqname, sizeof(fqname), NULL, 0, NI_NAMEREQD); if (rc == 0) { struct addrinfo* pAI; struct addrinfo hints; std::memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_CANONNAME | AI_ADDRCONFIG; rc = getaddrinfo(fqname, NULL, &hints, &pAI); if (rc == 0) { HostEntry result(pAI); freeaddrinfo(pAI); return result; } else { aierror(rc, address.toString()); } } else { aierror(rc, address.toString()); } #elif defined(POCO_VXWORKS) char name[MAXHOSTNAMELEN + 1]; if (hostGetByAddr(*reinterpret_cast<const int*>(address.addr()), name) == OK) { return HostEntry(std::string(name), address); } #else struct hostent* he = gethostbyaddr(reinterpret_cast<const char*>(address.addr()), address.length(), address.af()); if (he) { return HostEntry(he); } #endif int err = lastError(); error(err, address.toString()); // will throw an appropriate exception throw NetException(); // to silence compiler }