|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #if defined(LIBC_SCCS) && !defined(lint) ! 8: static char sccsid[] = "@(#)inet_addr.c 5.2 (Berkeley) 3/9/86"; ! 9: #endif LIBC_SCCS and not lint ! 10: ! 11: #include <sys/types.h> ! 12: #include <ctype.h> ! 13: #include <netinet/in.h> ! 14: ! 15: /* ! 16: * Internet address interpretation routine. ! 17: * All the network library routines call this ! 18: * routine to interpret entries in the data bases ! 19: * which are expected to be an address. ! 20: * The value returned is in network order. ! 21: */ ! 22: u_long ! 23: inet_addr(cp) ! 24: register char *cp; ! 25: { ! 26: register u_long val, base, n; ! 27: register char c; ! 28: u_long parts[4], *pp = parts; ! 29: ! 30: again: ! 31: /* ! 32: * Collect number up to ``.''. ! 33: * Values are specified as for C: ! 34: * 0x=hex, 0=octal, other=decimal. ! 35: */ ! 36: val = 0; base = 10; ! 37: if (*cp == '0') ! 38: base = 8, cp++; ! 39: if (*cp == 'x' || *cp == 'X') ! 40: base = 16, cp++; ! 41: while (c = *cp) { ! 42: if (isdigit(c)) { ! 43: val = (val * base) + (c - '0'); ! 44: cp++; ! 45: continue; ! 46: } ! 47: if (base == 16 && isxdigit(c)) { ! 48: val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); ! 49: cp++; ! 50: continue; ! 51: } ! 52: break; ! 53: } ! 54: if (*cp == '.') { ! 55: /* ! 56: * Internet format: ! 57: * a.b.c.d ! 58: * a.b.c (with c treated as 16-bits) ! 59: * a.b (with b treated as 24 bits) ! 60: */ ! 61: if (pp >= parts + 4) ! 62: return (-1); ! 63: *pp++ = val, cp++; ! 64: goto again; ! 65: } ! 66: /* ! 67: * Check for trailing characters. ! 68: */ ! 69: if (*cp && !isspace(*cp)) ! 70: return (-1); ! 71: *pp++ = val; ! 72: /* ! 73: * Concoct the address according to ! 74: * the number of parts specified. ! 75: */ ! 76: n = pp - parts; ! 77: switch (n) { ! 78: ! 79: case 1: /* a -- 32 bits */ ! 80: val = parts[0]; ! 81: break; ! 82: ! 83: case 2: /* a.b -- 8.24 bits */ ! 84: val = (parts[0] << 24) | (parts[1] & 0xffffff); ! 85: break; ! 86: ! 87: case 3: /* a.b.c -- 8.8.16 bits */ ! 88: val = (parts[0] << 24) | ((parts[1] & 0xff) << 16) | ! 89: (parts[2] & 0xffff); ! 90: break; ! 91: ! 92: case 4: /* a.b.c.d -- 8.8.8.8 bits */ ! 93: val = (parts[0] << 24) | ((parts[1] & 0xff) << 16) | ! 94: ((parts[2] & 0xff) << 8) | (parts[3] & 0xff); ! 95: break; ! 96: ! 97: default: ! 98: return (-1); ! 99: } ! 100: val = htonl(val); ! 101: return (val); ! 102: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.