Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/inet/inet_addr.c
39476 views
1
/*-
2
* SPDX-License-Identifier: (BSD-3-Clause AND ISC)
3
*
4
* Copyright (c) 1983, 1990, 1993
5
* The Regents of the University of California. All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
* 3. Neither the name of the University nor the names of its contributors
16
* may be used to endorse or promote products derived from this software
17
* without specific prior written permission.
18
*
19
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
* SUCH DAMAGE.
30
*/
31
32
/*
33
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
34
*
35
* Permission to use, copy, modify, and distribute this software for any
36
* purpose with or without fee is hereby granted, provided that the above
37
* copyright notice and this permission notice appear in all copies, and that
38
* the name of Digital Equipment Corporation not be used in advertising or
39
* publicity pertaining to distribution of the document or software without
40
* specific, written prior permission.
41
*
42
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
43
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
44
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
45
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
46
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
47
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
48
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
49
* SOFTWARE.
50
*/
51
52
/*
53
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
54
* Portions Copyright (c) 1996-1999 by Internet Software Consortium.
55
*
56
* Permission to use, copy, modify, and distribute this software for any
57
* purpose with or without fee is hereby granted, provided that the above
58
* copyright notice and this permission notice appear in all copies.
59
*
60
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
61
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
62
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
63
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
64
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
65
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
66
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
67
*/
68
69
#include "port_before.h"
70
71
#include <sys/param.h>
72
73
#include <netinet/in.h>
74
#include <arpa/inet.h>
75
76
#include <ctype.h>
77
78
#include "port_after.h"
79
80
/*%
81
* Ascii internet address interpretation routine.
82
* The value returned is in network order.
83
*/
84
in_addr_t /* XXX should be struct in_addr :( */
85
inet_addr(const char *cp) {
86
struct in_addr val;
87
88
if (inet_aton(cp, &val))
89
return (val.s_addr);
90
return (INADDR_NONE);
91
}
92
93
/*%
94
* Check whether "cp" is a valid ascii representation
95
* of an Internet address and convert to a binary address.
96
* Returns 1 if the address is valid, 0 if not.
97
* This replaces inet_addr, the return value from which
98
* cannot distinguish between failure and a local broadcast address.
99
*/
100
int
101
inet_aton(const char *cp, struct in_addr *addr) {
102
u_long val;
103
int base, n;
104
char c;
105
u_int8_t parts[4];
106
u_int8_t *pp = parts;
107
int digit;
108
109
c = *cp;
110
for (;;) {
111
/*
112
* Collect number up to ``.''.
113
* Values are specified as for C:
114
* 0x=hex, 0=octal, isdigit=decimal.
115
*/
116
if (!isdigit((unsigned char)c))
117
return (0);
118
val = 0; base = 10; digit = 0;
119
if (c == '0') {
120
c = *++cp;
121
if (c == 'x' || c == 'X')
122
base = 16, c = *++cp;
123
else {
124
base = 8;
125
digit = 1 ;
126
}
127
}
128
for (;;) {
129
if (isascii(c) && isdigit((unsigned char)c)) {
130
if (base == 8 && (c == '8' || c == '9'))
131
return (0);
132
val = (val * base) + (c - '0');
133
c = *++cp;
134
digit = 1;
135
} else if (base == 16 && isascii(c) &&
136
isxdigit((unsigned char)c)) {
137
val = (val << 4) |
138
(c + 10 - (islower((unsigned char)c) ? 'a' : 'A'));
139
c = *++cp;
140
digit = 1;
141
} else
142
break;
143
}
144
if (c == '.') {
145
/*
146
* Internet format:
147
* a.b.c.d
148
* a.b.c (with c treated as 16 bits)
149
* a.b (with b treated as 24 bits)
150
*/
151
if (pp >= parts + 3 || val > 0xffU)
152
return (0);
153
*pp++ = val;
154
c = *++cp;
155
} else
156
break;
157
}
158
/*
159
* Check for trailing characters.
160
*/
161
if (c != '\0' && (!isascii(c) || !isspace((unsigned char)c)))
162
return (0);
163
/*
164
* Did we get a valid digit?
165
*/
166
if (!digit)
167
return (0);
168
/*
169
* Concoct the address according to
170
* the number of parts specified.
171
*/
172
n = pp - parts + 1;
173
switch (n) {
174
case 1: /*%< a -- 32 bits */
175
break;
176
177
case 2: /*%< a.b -- 8.24 bits */
178
if (val > 0xffffffU)
179
return (0);
180
val |= (uint32_t)parts[0] << 24;
181
break;
182
183
case 3: /*%< a.b.c -- 8.8.16 bits */
184
if (val > 0xffffU)
185
return (0);
186
val |= ((uint32_t)parts[0] << 24) | (parts[1] << 16);
187
break;
188
189
case 4: /*%< a.b.c.d -- 8.8.8.8 bits */
190
if (val > 0xffU)
191
return (0);
192
val |= ((uint32_t)parts[0] << 24) | (parts[1] << 16) |
193
(parts[2] << 8);
194
break;
195
}
196
if (addr != NULL)
197
addr->s_addr = htonl(val);
198
return (1);
199
}
200
201
/*
202
* Weak aliases for applications that use certain private entry points,
203
* and fail to include <arpa/inet.h>.
204
*/
205
#undef inet_addr
206
__weak_reference(__inet_addr, inet_addr);
207
#undef inet_aton
208
__weak_reference(__inet_aton, inet_aton);
209
210
/*! \file */
211
212