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