xref: /csrg-svn/lib/libc/net/ns_ntoa.c (revision 25987)
1*25987Ssklower /*
2*25987Ssklower  * Copyright (c) 1986 Regents of the University of California.
3*25987Ssklower  * All rights reserved.  The Berkeley software License Agreement
4*25987Ssklower  * specifies the terms and conditions for redistribution.
5*25987Ssklower  *
6*25987Ssklower  */
7*25987Ssklower 
8*25987Ssklower #ifndef lint
9*25987Ssklower static char sccsid[] = "@(#)ns_ntoa.c	6.1 (Berkeley) 01/29/86";
10*25987Ssklower #endif not lint
11*25987Ssklower 
12*25987Ssklower #include <sys/types.h>
13*25987Ssklower #include <netns/ns.h>
14*25987Ssklower 
15*25987Ssklower char *
16*25987Ssklower ns_ntoa(addr)
17*25987Ssklower struct ns_addr addr;
18*25987Ssklower {
19*25987Ssklower 	static char obuf[40];
20*25987Ssklower 	char *spectHex();
21*25987Ssklower 	u_long net;
22*25987Ssklower 	u_short port = htons(addr.x_port);
23*25987Ssklower 	register char *cp;
24*25987Ssklower 	char *cp2;
25*25987Ssklower 	register u_char *up = addr.x_host.c_host;
26*25987Ssklower 	u_char *uplim = up + 6;
27*25987Ssklower 
28*25987Ssklower 	* (union ns_net *) &net = addr.x_net;
29*25987Ssklower 	net = ntohl(net);
30*25987Ssklower 	sprintf(obuf, "%lx", net);
31*25987Ssklower 	cp = spectHex(obuf);
32*25987Ssklower 	cp2 = cp + 1;
33*25987Ssklower 	while (*up==0 && up < uplim) up++;
34*25987Ssklower 	if (up == uplim) return (obuf);
35*25987Ssklower 	sprintf(cp, ".%x", *up++);
36*25987Ssklower 	while (up < uplim) {
37*25987Ssklower 		while (*cp) cp++;
38*25987Ssklower 		sprintf(cp, "%02x", *up++);
39*25987Ssklower 	}
40*25987Ssklower 	cp = spectHex(cp2);
41*25987Ssklower 	if (port) {
42*25987Ssklower 		sprintf(cp, ".%x", port);
43*25987Ssklower 		spectHex(cp + 1);
44*25987Ssklower 	}
45*25987Ssklower 	return (obuf);
46*25987Ssklower }
47*25987Ssklower 
48*25987Ssklower static char *
49*25987Ssklower spectHex(p0)
50*25987Ssklower char *p0;
51*25987Ssklower {
52*25987Ssklower 	int ok = 0;
53*25987Ssklower 	int nonzero = 0;
54*25987Ssklower 	register char *p = p0;
55*25987Ssklower 	for (; *p; p++) switch (*p) {
56*25987Ssklower 
57*25987Ssklower 	case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
58*25987Ssklower 		*p += ('A' - 'a');
59*25987Ssklower 		/* fall into . . . */
60*25987Ssklower 	case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
61*25987Ssklower 		ok = 1;
62*25987Ssklower 	case '1': case '2': case '3': case '4': case '5':
63*25987Ssklower 	case '6': case '7': case '8': case '9':
64*25987Ssklower 		nonzero = 1;
65*25987Ssklower 	}
66*25987Ssklower 	if (nonzero && !ok) { *p++ = 'H'; *p = 0; }
67*25987Ssklower 	return (p);
68*25987Ssklower }
69