xref: /csrg-svn/lib/libc/net/inet_addr.c (revision 8324)
1*8324Ssam /*	inet_addr.c	4.2	82/10/05	*/
2*8324Ssam 
3*8324Ssam #include <sys/types.h>
4*8324Ssam #include <ctype.h>
5*8324Ssam 
68309Ssam /*
78309Ssam  * Internet address interpretation routine.
88309Ssam  * All the network library routines call this
98309Ssam  * routine to interpret entries in the data bases
108309Ssam  * which are expected to be an address.
118309Ssam  */
128309Ssam u_long
138309Ssam inet_addr(cp)
148309Ssam 	register char *cp;
158309Ssam {
168309Ssam 	register unsigned long val, base, n;
178309Ssam 	register char c;
188309Ssam 	unsigned long parts[4], *pp = parts;
198309Ssam 
208309Ssam again:
218309Ssam 	val = 0; base = 10;
228309Ssam 	if (*cp == '0')
238309Ssam 		base = 8, cp++;
248309Ssam 	if (*cp == 'x' || *cp == 'X')
258309Ssam 		base = 16, cp++;
268309Ssam 	while (c = *cp) {
278309Ssam 		if (isdigit(c)) {
288309Ssam 			val = (val * base) + (c - '0');
298309Ssam 			cp++;
308309Ssam 			continue;
318309Ssam 		}
328309Ssam 		if (base == 16 && isxdigit(c)) {
338309Ssam 			val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A'));
348309Ssam 			cp++;
358309Ssam 			continue;
368309Ssam 		}
378309Ssam 		break;
388309Ssam 	}
398309Ssam 	if (*cp == '.') {
408309Ssam 		/*
418309Ssam 		 * Internet format:
428309Ssam 		 *	a.b.c.d
438309Ssam 		 *	a.b.c	(with c treated as 16-bits)
448309Ssam 		 *	a.b	(with b treated as 24 bits)
458309Ssam 		 */
468309Ssam 		if (pp >= parts + 4)
478309Ssam 			return (-1);
488309Ssam 		*pp++ = val, cp++;
498309Ssam 		goto again;
508309Ssam 	}
518309Ssam 	if (*cp && !isspace(*cp))
528309Ssam 		return (-1);
538309Ssam 	n = pp - parts;
548309Ssam 	if (n > 0) {
558309Ssam 		if (n > 4)
568309Ssam 			return (-1);
578309Ssam 		*pp++ = val; n++;
588309Ssam 		val = parts[0];
598309Ssam 		if (n > 1)
608309Ssam 			val <<= 24;
618309Ssam 		if (n > 2)
628309Ssam 			val |= (parts[1] & 0xff) << 16;
638309Ssam 		if (n > 3)
648309Ssam 			val |= (parts[2] & 0xff) << 8;
658309Ssam 		if (n > 1)
668309Ssam 			val |= parts[n - 1];
678309Ssam #if vax || pdp11
688309Ssam 		val = htonl(val);
698309Ssam #endif
708309Ssam 	}
718309Ssam 	return (val);
728309Ssam }
738309Ssam 
74