OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [newlib-1.18.0/] [newlib/] [libc/] [sys/] [linux/] [net/] [inet_addr.c] - Blame information for rev 859

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 207 jeremybenn
/*      $KAME: inet_addr.c,v 1.5 2001/08/20 02:32:40 itojun Exp $       */
2
 
3
/*
4
 * ++Copyright++ 1983, 1990, 1993
5
 * -
6
 * Copyright (c) 1983, 1990, 1993
7
 *    The Regents of the University of California.  All rights reserved.
8
 *
9
 * Redistribution and use in source and binary forms, with or without
10
 * modification, are permitted provided that the following conditions
11
 * are met:
12
 * 1. Redistributions of source code must retain the above copyright
13
 *    notice, this list of conditions and the following disclaimer.
14
 * 2. Redistributions in binary form must reproduce the above copyright
15
 *    notice, this list of conditions and the following disclaimer in the
16
 *    documentation and/or other materials provided with the distribution.
17
 * 3. All advertising materials mentioning features or use of this software
18
 *    must display the following acknowledgement:
19
 *      This product includes software developed by the University of
20
 *      California, Berkeley and its contributors.
21
 * 4. Neither the name of the University nor the names of its contributors
22
 *    may be used to endorse or promote products derived from this software
23
 *    without specific prior written permission.
24
 *
25
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35
 * SUCH DAMAGE.
36
 * -
37
 * Portions Copyright (c) 1993 by Digital Equipment Corporation.
38
 *
39
 * Permission to use, copy, modify, and distribute this software for any
40
 * purpose with or without fee is hereby granted, provided that the above
41
 * copyright notice and this permission notice appear in all copies, and that
42
 * the name of Digital Equipment Corporation not be used in advertising or
43
 * publicity pertaining to distribution of the document or software without
44
 * specific, written prior permission.
45
 *
46
 * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
47
 * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
48
 * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
49
 * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
50
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
51
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
52
 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
53
 * SOFTWARE.
54
 * -
55
 * --Copyright--
56
 */
57
 
58
#if defined(LIBC_SCCS) && !defined(lint)
59
static char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93";
60
#endif /* LIBC_SCCS and not lint */
61
#include <sys/cdefs.h>
62
#include <sys/types.h>
63
#include <machine/endian.h>
64
 
65
#include <sys/param.h>
66
 
67
#include <netinet/in.h>
68
#include <arpa/inet.h>
69
 
70
#include <ctype.h>
71
#include <errno.h>
72
#include <string.h>
73
#include <stdlib.h>
74
 
75
/*
76
 * ASCII internet address interpretation routine.
77
 * The value returned is in network order.
78
 */
79
in_addr_t               /* XXX should be struct in_addr :( */
80
inet_addr(cp)
81
        const char *cp;
82
{
83
        struct in_addr val;
84
 
85
        if (inet_aton(cp, &val))
86
                return (val.s_addr);
87
        return (INADDR_NONE);
88
}
89
 
90
/*
91
 * Check whether "cp" is a valid ASCII representation
92
 * of an Internet address and convert to a binary address.
93
 * Returns 1 if the address is valid, 0 if not.
94
 * This replaces inet_addr, the return value from which
95
 * cannot distinguish between failure and a local broadcast address.
96
 */
97
int
98
inet_aton(cp, addr)
99
        const char *cp;
100
        struct in_addr *addr;
101
{
102
        u_long parts[4];
103
        in_addr_t val;
104
        char *c;
105
        char *endptr;
106
        int gotend, n;
107
 
108
        c = (char *)cp;
109
        n = 0;
110
        /*
111
         * Run through the string, grabbing numbers until
112
         * the end of the string, or some error
113
         */
114
        gotend = 0;
115
        while (!gotend) {
116
                errno = 0;
117
                val = strtoul(c, &endptr, 0);
118
 
119
                if (errno == ERANGE)    /* Fail completely if it overflowed. */
120
                        return (0);
121
 
122
                /*
123
                 * If the whole string is invalid, endptr will equal
124
                 * c.. this way we can make sure someone hasn't
125
                 * gone '.12' or something which would get past
126
                 * the next check.
127
                 */
128
                if (endptr == c)
129
                        return (0);
130
                parts[n] = val;
131
                c = endptr;
132
 
133
                /* Check the next character past the previous number's end */
134
                switch (*c) {
135
                case '.' :
136
                        /* Make sure we only do 3 dots .. */
137
                        if (n == 3)     /* Whoops. Quit. */
138
                                return (0);
139
                        n++;
140
                        c++;
141
                        break;
142
 
143
                case '\0':
144
                        gotend = 1;
145
                        break;
146
 
147
                default:
148
                        if (isspace((unsigned char)*c)) {
149
                                gotend = 1;
150
                                break;
151
                        } else
152
                                return (0);      /* Invalid character, so fail */
153
                }
154
 
155
        }
156
 
157
        /*
158
         * Concoct the address according to
159
         * the number of parts specified.
160
         */
161
 
162
        switch (n) {
163
        case 0:                          /* a -- 32 bits */
164
                /*
165
                 * Nothing is necessary here.  Overflow checking was
166
                 * already done in strtoul().
167
                 */
168
                break;
169
        case 1:                         /* a.b -- 8.24 bits */
170
                if (val > 0xffffff || parts[0] > 0xff)
171
                        return (0);
172
                val |= parts[0] << 24;
173
                break;
174
 
175
        case 2:                         /* a.b.c -- 8.8.16 bits */
176
                if (val > 0xffff || parts[0] > 0xff || parts[1] > 0xff)
177
                        return (0);
178
                val |= (parts[0] << 24) | (parts[1] << 16);
179
                break;
180
 
181
        case 3:                         /* a.b.c.d -- 8.8.8.8 bits */
182
                if (val > 0xff || parts[0] > 0xff || parts[1] > 0xff ||
183
                    parts[2] > 0xff)
184
                        return (0);
185
                val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
186
                break;
187
        }
188
 
189
        if (addr != NULL)
190
                addr->s_addr = htonl(val);
191
        return (1);
192
}
193
 
194
/*
195
 * Weak aliases for applications that use certain private entry points,
196
 * and fail to include <arpa/inet.h>.
197
 */
198
#undef inet_addr
199
__weak_reference(__inet_addr, inet_addr);
200
#undef inet_aton
201
__weak_reference(__inet_aton, inet_aton);

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.