1*8309Ssam /* inet_addr.c 4.1 82/10/05 */ 2*8309Ssam /* 3*8309Ssam * Internet address interpretation routine. 4*8309Ssam * All the network library routines call this 5*8309Ssam * routine to interpret entries in the data bases 6*8309Ssam * which are expected to be an address. 7*8309Ssam */ 8*8309Ssam u_long 9*8309Ssam inet_addr(cp) 10*8309Ssam register char *cp; 11*8309Ssam { 12*8309Ssam register unsigned long val, base, n; 13*8309Ssam register char c; 14*8309Ssam unsigned long parts[4], *pp = parts; 15*8309Ssam 16*8309Ssam again: 17*8309Ssam val = 0; base = 10; 18*8309Ssam if (*cp == '0') 19*8309Ssam base = 8, cp++; 20*8309Ssam if (*cp == 'x' || *cp == 'X') 21*8309Ssam base = 16, cp++; 22*8309Ssam while (c = *cp) { 23*8309Ssam if (isdigit(c)) { 24*8309Ssam val = (val * base) + (c - '0'); 25*8309Ssam cp++; 26*8309Ssam continue; 27*8309Ssam } 28*8309Ssam if (base == 16 && isxdigit(c)) { 29*8309Ssam val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); 30*8309Ssam cp++; 31*8309Ssam continue; 32*8309Ssam } 33*8309Ssam break; 34*8309Ssam } 35*8309Ssam if (*cp == '.') { 36*8309Ssam /* 37*8309Ssam * Internet format: 38*8309Ssam * a.b.c.d 39*8309Ssam * a.b.c (with c treated as 16-bits) 40*8309Ssam * a.b (with b treated as 24 bits) 41*8309Ssam */ 42*8309Ssam if (pp >= parts + 4) 43*8309Ssam return (-1); 44*8309Ssam *pp++ = val, cp++; 45*8309Ssam goto again; 46*8309Ssam } 47*8309Ssam if (*cp && !isspace(*cp)) 48*8309Ssam return (-1); 49*8309Ssam n = pp - parts; 50*8309Ssam if (n > 0) { 51*8309Ssam if (n > 4) 52*8309Ssam return (-1); 53*8309Ssam *pp++ = val; n++; 54*8309Ssam val = parts[0]; 55*8309Ssam if (n > 1) 56*8309Ssam val <<= 24; 57*8309Ssam if (n > 2) 58*8309Ssam val |= (parts[1] & 0xff) << 16; 59*8309Ssam if (n > 3) 60*8309Ssam val |= (parts[2] & 0xff) << 8; 61*8309Ssam if (n > 1) 62*8309Ssam val |= parts[n - 1]; 63*8309Ssam #if vax || pdp11 64*8309Ssam val = htonl(val); 65*8309Ssam #endif 66*8309Ssam } 67*8309Ssam return (val); 68*8309Ssam } 69*8309Ssam 70