char * dnname_string(u_short dnaddr) { #ifdef HAVE_LIBDNET struct dn_naddr dna; dna.a_len = sizeof(short); memcpy((char *)dna.a_addr, (char *)&dnaddr, sizeof(short)); return (savestr(dnet_htoa(&dna))); #else return(dnnum_string(dnaddr)); /* punt */ #endif }
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); }
char * get_hostname (Xauth *auth) { static struct hostent *hp; int af; #ifdef DNETCONN struct nodeent *np; static char nodeaddr[4 + 2 * DN_MAXADDL]; #endif /* DNETCONN */ hp = NULL; if (auth->address_length == 0) return "Illegal Address"; #ifdef TCPCONN if (auth->family == FamilyInternet #if defined(IPv6) && defined(AF_INET6) || auth->family == FamilyInternet6 #endif ) { #if defined(IPv6) && defined(AF_INET6) if (auth->family == FamilyInternet6) af = AF_INET6; else #endif af = AF_INET; if (no_name_lookups == False) { #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 = False; signal (SIGALRM, nameserver_lost); alarm (4); if (setjmp(env) == 0) { #endif hp = gethostbyaddr (auth->address, auth->address_length, af); #ifdef SIGALRM } alarm (0); #endif } if (hp) return (hp->h_name); #if defined(IPv6) && defined(AF_INET6) else if (af == AF_INET6) { static char addr[INET6_ADDRSTRLEN+2]; /* Add [] for clarity to distinguish between address & display, like RFC 2732 for URL's. Not required, since X display syntax always ends in :<display>, but makes it easier for people to read and less confusing to those who expect the RFC 2732 style. */ addr[0] = '['; if (inet_ntop(af, auth->address, addr + 1, INET6_ADDRSTRLEN) == NULL) return NULL; strcat(addr, "]"); return addr; } #endif else { return (inet_ntoa(*((struct in_addr *)(auth->address)))); } } #endif #ifdef DNETCONN if (auth->family == FamilyDECnet) { struct dn_naddr *addr_ptr = (struct dn_naddr *) auth->address; if ((no_name_lookups == False) && (np = getnodebyaddr(addr_ptr->a_addr, addr_ptr->a_len, AF_DECnet))) { sprintf(nodeaddr, "%s:", np->n_name); } else { sprintf(nodeaddr, "%s:", dnet_htoa(auth->address)); } return(nodeaddr); } #endif return (NULL); }
char * TRANS(GetPeerNetworkId) (XtransConnInfo ciptr) { int family = ciptr->family; char *hostname; char addrbuf[256]; 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) { addrbuf[sizeof(addrbuf)-1] = '\0'; addr = addrbuf; } break; } #endif /* defined(UNIXCONN) || defined(STREAMSCONN) || defined(LOCALCONN) || defined(OS2PIPECONN) */ #if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN) case AF_INET: { char *peer_addr = ciptr->peeraddr; struct sockaddr_in *saddr = (struct sockaddr_in *) peer_addr; struct hostent * hostp = NULL; #if defined(SIGALRM) && !defined(_WIN32) /* * 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 = gethostbyaddr ((char *) &saddr->sin_addr, sizeof (saddr->sin_addr), AF_INET); #if defined(SIGALRM) && !defined(_WIN32) } alarm (0); #endif if (hostp != NULL) addr = hostp->h_name; else addr = inet_ntoa (saddr->sin_addr); break; } #endif /* defined(TCPCONN) || defined(STREAMSCONN) || MNX_TCPCONN */ #if defined(DNETCONN) case AF_DECnet: { char *peer_addr = ciptr->peeraddr; 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)) { snprintf(addrbuf, sizeof(addrbuf), "%s:", np->n_name); } else { snprintf(addrbuf, sizeof(addrbuf), "%s:", dnet_htoa(&saddr->sdn_add)); } addr = addrbuf; break; } #endif /* defined(DNETCONN) */ #if defined(AMRPCCONN) case AF_AMOEBA: { addr = "Amoeba"; /* not really used */ break; } #endif #if defined(AMTCPCONN) && !(defined(TCPCONN) || defined(STREAMSCONN)) case AF_INET: { if (gethostname (addrbuf, sizeof (addrbuf)) == 0) { addrbuf[sizeof(addrbuf)-1] = '\0'; addr = addrbuf; } else { addr = ""; } break; } #endif 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); }