125987Ssklower /* 225987Ssklower * Copyright (c) 1986 Regents of the University of California. 335361Sbostic * All rights reserved. 425987Ssklower * 5*42626Sbostic * %sccs.include.redist.c% 625987Ssklower */ 725987Ssklower 826638Sdonn #if defined(LIBC_SCCS) && !defined(lint) 9*42626Sbostic static char sccsid[] = "@(#)ns_ntoa.c 6.5 (Berkeley) 06/01/90"; 1035361Sbostic #endif /* LIBC_SCCS and not lint */ 1125987Ssklower 1225987Ssklower #include <sys/types.h> 1325987Ssklower #include <netns/ns.h> 1425987Ssklower 1525987Ssklower char * 1625987Ssklower ns_ntoa(addr) 1725987Ssklower struct ns_addr addr; 1825987Ssklower { 1925987Ssklower static char obuf[40]; 2025987Ssklower char *spectHex(); 2126073Ssklower union { union ns_net net_e; u_long long_e; } net; 2225987Ssklower u_short port = htons(addr.x_port); 2325987Ssklower register char *cp; 2425987Ssklower char *cp2; 2525987Ssklower register u_char *up = addr.x_host.c_host; 2625987Ssklower u_char *uplim = up + 6; 2725987Ssklower 2826073Ssklower net.net_e = addr.x_net; 2926073Ssklower sprintf(obuf, "%lx", ntohl(net.long_e)); 3025987Ssklower cp = spectHex(obuf); 3125987Ssklower cp2 = cp + 1; 3225987Ssklower while (*up==0 && up < uplim) up++; 3326073Ssklower if (up == uplim) { 3426073Ssklower if (port) { 3526073Ssklower sprintf(cp, ".0"); 3626073Ssklower cp += 2; 3726073Ssklower } 3826073Ssklower } else { 3926073Ssklower sprintf(cp, ".%x", *up++); 4026073Ssklower while (up < uplim) { 4126073Ssklower while (*cp) cp++; 4226073Ssklower sprintf(cp, "%02x", *up++); 4326073Ssklower } 4426073Ssklower cp = spectHex(cp2); 4525987Ssklower } 4625987Ssklower if (port) { 4725987Ssklower sprintf(cp, ".%x", port); 4825987Ssklower spectHex(cp + 1); 4925987Ssklower } 5025987Ssklower return (obuf); 5125987Ssklower } 5225987Ssklower 5325987Ssklower static char * 5425987Ssklower spectHex(p0) 5525987Ssklower char *p0; 5625987Ssklower { 5725987Ssklower int ok = 0; 5825987Ssklower int nonzero = 0; 5925987Ssklower register char *p = p0; 6025987Ssklower for (; *p; p++) switch (*p) { 6125987Ssklower 6225987Ssklower case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 6325987Ssklower *p += ('A' - 'a'); 6425987Ssklower /* fall into . . . */ 6525987Ssklower case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 6625987Ssklower ok = 1; 6725987Ssklower case '1': case '2': case '3': case '4': case '5': 6825987Ssklower case '6': case '7': case '8': case '9': 6925987Ssklower nonzero = 1; 7025987Ssklower } 7125987Ssklower if (nonzero && !ok) { *p++ = 'H'; *p = 0; } 7225987Ssklower return (p); 7325987Ssklower } 74