char * TRANS(GetPeerNetworkId) (XtransConnInfo ciptr) { int family = ciptr->family; char *peer_addr = ciptr->peeraddr; char *hostname; char addrbuf[256]; char *addr = NULL; switch (family) { case AF_UNSPEC: #if defined(UNIXCONN) || defined(LOCALCONN) case AF_UNIX: { if (gethostname (addrbuf, sizeof (addrbuf)) == 0) addr = addrbuf; break; } #endif /* defined(UNIXCONN) || defined(LOCALCONN) */ #if defined(TCPCONN) case AF_INET: { struct sockaddr_in *saddr = (struct sockaddr_in *) peer_addr; #ifdef XTHREADS_NEEDS_BYNAMEPARAMS _Xgethostbynameparams hparams; #endif struct hostent * volatile hostp = NULL; #ifdef SIGALRM /* * gethostbyaddr can take a LONG time if the host does not exist. * Assume that if it does not respond in NAMESERVER_TIMEOUT seconds * that something is wrong and do not make the user wait. * gethostbyaddr will continue after a signal, so we have to * jump out of it. */ nameserver_timedout = 0; signal (SIGALRM, nameserver_lost); alarm (4); if (setjmp(env) == 0) { #endif hostp = _XGethostbyaddr ((char *) &saddr->sin_addr, sizeof (saddr->sin_addr), AF_INET, hparams); #ifdef SIGALRM } alarm (0); #endif if (hostp != NULL) addr = hostp->h_name; else addr = inet_ntoa (saddr->sin_addr); break; } #endif /* defined(TCPCONN) */ default: return (NULL); } hostname = (char *) xalloc ( strlen (ciptr->transptr->TransName) + strlen (addr) + 2); strcpy (hostname, ciptr->transptr->TransName); strcat (hostname, "/"); if (addr) strcat (hostname, addr); return (hostname); }
char * TRANS(GetPeerNetworkId) (XtransConnInfo ciptr) { int family = ciptr->family; char *peer_addr = ciptr->peeraddr; char *hostname; char addrbuf[256]; const char *addr = NULL; switch (family) { case AF_UNSPEC: #if defined(UNIXCONN) || defined(STREAMSCONN) || defined(LOCALCONN) || defined(OS2PIPECONN) case AF_UNIX: { if (gethostname (addrbuf, sizeof (addrbuf)) == 0) addr = addrbuf; break; } #endif /* defined(UNIXCONN) || defined(STREAMSCONN) || defined(LOCALCONN) || defined(OS2PIPECONN) */ #if defined(TCPCONN) || defined(STREAMSCONN) case AF_INET: #if defined(IPv6) && defined(AF_INET6) case AF_INET6: #endif { struct sockaddr_in *saddr = (struct sockaddr_in *) peer_addr; #if defined(IPv6) && defined(AF_INET6) struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *) peer_addr; #endif char *address; int addresslen; #ifdef XTHREADS_NEEDS_BYNAMEPARAMS _Xgethostbynameparams hparams; #endif struct hostent * volatile hostp = NULL; #if defined(IPv6) && defined(AF_INET6) if (family == AF_INET6) { address = (char *) &saddr6->sin6_addr; addresslen = sizeof (saddr6->sin6_addr); } else #endif { address = (char *) &saddr->sin_addr; addresslen = sizeof (saddr->sin_addr); } #ifdef SIGALRM /* * gethostbyaddr can take a LONG time if the host does not exist. * Assume that if it does not respond in NAMESERVER_TIMEOUT seconds * that something is wrong and do not make the user wait. * gethostbyaddr will continue after a signal, so we have to * jump out of it. */ nameserver_timedout = 0; signal (SIGALRM, nameserver_lost); alarm (4); if (setjmp(env) == 0) { #endif hostp = _XGethostbyaddr (address, addresslen, family, hparams); #ifdef SIGALRM } alarm (0); #endif if (hostp != NULL) addr = hostp->h_name; else #if defined(IPv6) && defined(AF_INET6) addr = inet_ntop (family, address, addrbuf, sizeof (addrbuf)); #else addr = inet_ntoa (saddr->sin_addr); #endif break; } #endif /* defined(TCPCONN) || defined(STREAMSCONN) */ #if defined(DNETCONN) case AF_DECnet: { struct sockaddr_dn *saddr = (struct sockaddr_dn *) peer_addr; struct nodeent *np; if (np = getnodebyaddr(saddr->sdn_add.a_addr, saddr->sdn_add.a_len, AF_DECnet)) { sprintf(addrbuf, "%s:", np->n_name); } else { sprintf(addrbuf, "%s:", dnet_htoa(&saddr->sdn_add)); } addr = addrbuf; break; } #endif /* defined(DNETCONN) */ default: return (NULL); } hostname = (char *) xalloc ( strlen (ciptr->transptr->TransName) + strlen (addr) + 2); strcpy (hostname, ciptr->transptr->TransName); strcat (hostname, "/"); if (addr) strcat (hostname, addr); return (hostname); }