2 * Copyright (c) 1983, 1990 Regents of the University of California.
5 * Redistribution and use in source and binary forms are permitted provided
6 * that: (1) source distributions retain this entire copyright notice and
7 * comment, and (2) distributions including binaries display the following
8 * acknowledgement: ``This product includes software developed by the
9 * University of California, Berkeley and its contributors'' in the
10 * documentation or other materials provided with the distribution and in
11 * all advertising materials mentioning features or use of this software.
12 * Neither the name of the University nor the names of its contributors may
13 * be used to endorse or promote products derived from this software without
14 * specific prior written permission.
15 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
16 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
17 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20 #if defined(LIBC_SCCS) && !defined(lint)
21 static char sccsid
[] = "@(#)inet_addr.c 5.8 (Berkeley) 6/23/90";
22 #endif /* LIBC_SCCS and not lint */
25 #include <sys/types.h>
30 #include <net/gen/in.h>
31 #include <net/gen/inet.h>
41 * Ascii internet address interpretation routine.
42 * The value returned is in network order.
46 register _CONST
char *cp
;
50 if (inet_aton(cp
, &val
))
57 * Check whether "cp" is a valid ascii representation
58 * of an Internet address and convert to a binary address.
59 * Returns 1 if the address is valid, 0 if not.
60 * This replaces inet_addr, the return value from which
61 * cannot distinguish between failure and a local broadcast address.
66 register _CONST
char *cp
;
69 register u32_t val
, base
, n
;
71 u32_t parts
[4], *pp
= parts
;
75 * Collect number up to ``.''.
76 * Values are specified as for C:
77 * 0x=hex, 0=octal, other=decimal.
81 if (*++cp
== 'x' || *cp
== 'X')
86 while ((c
= *cp
) != '\0') {
87 if (isascii(c
) && isdigit(c
)) {
88 val
= (val
* base
) + (c
- '0');
92 if (base
== 16 && isascii(c
) && isxdigit(c
)) {
94 (c
+ 10 - (islower(c
) ? 'a' : 'A'));
104 * a.b.c (with c treated as 16-bits)
105 * a.b (with b treated as 24 bits)
107 if (pp
>= parts
+ 3 || val
> 0xff)
114 * Check for trailing characters.
116 if (*cp
&& (!isascii(*cp
) || !isspace(*cp
)))
119 * Concoct the address according to
120 * the number of parts specified.
125 case 1: /* a -- 32 bits */
128 case 2: /* a.b -- 8.24 bits */
131 val
|= parts
[0] << 24;
134 case 3: /* a.b.c -- 8.8.16 bits */
137 val
|= (parts
[0] << 24) | (parts
[1] << 16);
140 case 4: /* a.b.c.d -- 8.8.8.8 bits */
143 val
|= (parts
[0] << 24) | (parts
[1] << 16) | (parts
[2] << 8);