|
Lines 48-95
Link Here
|
| 48 |
* network numbers. |
48 |
* network numbers. |
| 49 |
*/ |
49 |
*/ |
| 50 |
in_addr_t |
50 |
in_addr_t |
| 51 |
inet_network(cp) |
51 |
inet_network(const char *cp) |
| 52 |
const char *cp; |
|
|
| 53 |
{ |
52 |
{ |
| 54 |
in_addr_t val, base, n; |
53 |
u_char c; |
| 55 |
char c; |
54 |
int got_data; |
| 56 |
in_addr_t parts[4], *pp = parts; |
55 |
u_int base, dots; |
| 57 |
int i; |
56 |
in_addr_t res, val; |
|
|
57 |
|
| 58 |
res = 0; |
| 59 |
dots = 0; |
| 58 |
|
60 |
|
| 59 |
again: |
61 |
again: |
| 60 |
val = 0; base = 10; |
62 |
val = 0; |
| 61 |
if (*cp == '0') |
63 |
got_data = 0; |
| 62 |
base = 8, cp++; |
64 |
if (*cp == '0') { |
| 63 |
if (*cp == 'x' || *cp == 'X') |
65 |
cp++; |
| 64 |
base = 16, cp++; |
66 |
if (*cp == 'x' || *cp == 'X') { |
| 65 |
while ((c = *cp) != 0) { |
|
|
| 66 |
if (isdigit((unsigned char)c)) { |
| 67 |
val = (val * base) + (c - '0'); |
| 68 |
cp++; |
| 69 |
continue; |
| 70 |
} |
| 71 |
if (base == 16 && isxdigit((unsigned char)c)) { |
| 72 |
val = (val << 4) + (c + 10 - (islower((unsigned char)c) ? 'a' : 'A')); |
| 73 |
cp++; |
67 |
cp++; |
| 74 |
continue; |
68 |
base = 16; |
|
|
69 |
} else { |
| 70 |
base = 8; |
| 71 |
got_data = 1; |
| 75 |
} |
72 |
} |
| 76 |
break; |
73 |
} else |
|
|
74 |
base = 10; |
| 75 |
while ((c = *cp) != '\0') { |
| 76 |
if (isdigit(c)) { |
| 77 |
if (base == 8 && c > '7') |
| 78 |
return (INADDR_NONE); |
| 79 |
val = val * base + c - '0'; |
| 80 |
} else if (base == 16 && isxdigit(c)) |
| 81 |
val = (val << 4) + 10 - (islower(c) ? 'a' : 'A'); |
| 82 |
else |
| 83 |
break; |
| 84 |
if (val > 0xff) |
| 85 |
return (INADDR_NONE); |
| 86 |
cp++; |
| 87 |
got_data = 1; |
| 77 |
} |
88 |
} |
| 78 |
if (*cp == '.') { |
89 |
if (!got_data) |
| 79 |
if (pp >= parts + 3) |
90 |
return (INADDR_NONE); |
|
|
91 |
if (dots != 0) |
| 92 |
res <<= 8; |
| 93 |
res |= val; |
| 94 |
if (c == '.') { |
| 95 |
if (++dots == 4) |
| 80 |
return (INADDR_NONE); |
96 |
return (INADDR_NONE); |
| 81 |
*pp++ = val, cp++; |
97 |
cp++; |
| 82 |
goto again; |
98 |
goto again; |
| 83 |
} |
99 |
} |
| 84 |
if (*cp && !isspace((unsigned char)*cp)) |
100 |
if (c != '\0') |
| 85 |
return (INADDR_NONE); |
101 |
return (INADDR_NONE); |
| 86 |
*pp++ = val; |
102 |
return (res); |
| 87 |
n = pp - parts; |
|
|
| 88 |
for (val = 0, i = 0; i < n; i++) { |
| 89 |
val <<= 8; |
| 90 |
val |= parts[i] & 0xff; |
| 91 |
} |
| 92 |
return (val); |
| 93 |
} |
103 |
} |
| 94 |
|
104 |
|
| 95 |
/* |
105 |
/* |