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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [libnetworking/] [libc/] [inet_pton.c] - Blame information for rev 535

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

Line No. Rev Author Line
1 30 unneback
/* Copyright (c) 1996 by Internet Software Consortium.
2
 *
3
 * Permission to use, copy, modify, and distribute this software for any
4
 * purpose with or without fee is hereby granted, provided that the above
5
 * copyright notice and this permission notice appear in all copies.
6
 *
7
 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
8
 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
9
 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
10
 * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
11
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
12
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
13
 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
14
 * SOFTWARE.
15
 */
16
 
17
#if defined(LIBC_SCCS) && !defined(lint)
18
static char rcsid[] = "$Id: inet_pton.c,v 1.2 2001-09-27 12:01:53 chris Exp $";
19
#endif /* LIBC_SCCS and not lint */
20
 
21
#include <sys/param.h>
22
#include <sys/types.h>
23
#include <sys/socket.h>
24
#include <netinet/in.h>
25
#include <arpa/inet.h>
26
#include <arpa/nameser.h>
27
#include <string.h>
28
#include <errno.h>
29
 
30
/*
31
 * WARNING: Don't even consider trying to compile this on a system where
32
 * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX.
33
 */
34
 
35
static int      inet_pton4 __P((const char *src, u_char *dst));
36
static int      inet_pton6 __P((const char *src, u_char *dst));
37
 
38
/* int
39
 * inet_pton(af, src, dst)
40
 *      convert from presentation format (which usually means ASCII printable)
41
 *      to network format (which is usually some kind of binary format).
42
 * return:
43
 *      1 if the address was valid for the specified address family
44
 *      0 if the address wasn't valid (`dst' is untouched in this case)
45
 *      -1 if some other error occurred (`dst' is untouched in this case, too)
46
 * author:
47
 *      Paul Vixie, 1996.
48
 */
49
int
50
inet_pton(af, src, dst)
51
        int af;
52
        const char *src;
53
        void *dst;
54
{
55
        switch (af) {
56
        case AF_INET:
57
                return (inet_pton4(src, dst));
58
        case AF_INET6:
59
                return (inet_pton6(src, dst));
60
        default:
61
                errno = EAFNOSUPPORT;
62
                return (-1);
63
        }
64
        /* NOTREACHED */
65
}
66
 
67
/* int
68
 * inet_pton4(src, dst)
69
 *      like inet_aton() but without all the hexadecimal and shorthand.
70
 * return:
71
 *      1 if `src' is a valid dotted quad, else 0.
72
 * notice:
73
 *      does not touch `dst' unless it's returning 1.
74
 * author:
75
 *      Paul Vixie, 1996.
76
 */
77
static int
78
inet_pton4(src, dst)
79
        const char *src;
80
        u_char *dst;
81
{
82
        static const char digits[] = "0123456789";
83
        int saw_digit, octets, ch;
84
        u_char tmp[NS_INADDRSZ], *tp;
85
 
86
        saw_digit = 0;
87
        octets = 0;
88
        *(tp = tmp) = 0;
89
        while ((ch = *src++) != '\0') {
90
                const char *pch;
91
 
92
                if ((pch = strchr(digits, ch)) != NULL) {
93
                        u_int new = *tp * 10 + (pch - digits);
94
 
95
                        if (new > 255)
96
                                return (0);
97
                        *tp = new;
98
                        if (! saw_digit) {
99
                                if (++octets > 4)
100
                                        return (0);
101
                                saw_digit = 1;
102
                        }
103
                } else if (ch == '.' && saw_digit) {
104
                        if (octets == 4)
105
                                return (0);
106
                        *++tp = 0;
107
                        saw_digit = 0;
108
                } else
109
                        return (0);
110
        }
111
        if (octets < 4)
112
                return (0);
113
 
114
        memcpy(dst, tmp, NS_INADDRSZ);
115
        return (1);
116
}
117
 
118
/* int
119
 * inet_pton6(src, dst)
120
 *      convert presentation level address to network order binary form.
121
 * return:
122
 *      1 if `src' is a valid [RFC1884 2.2] address, else 0.
123
 * notice:
124
 *      (1) does not touch `dst' unless it's returning 1.
125
 *      (2) :: in a full address is silently ignored.
126
 * credit:
127
 *      inspired by Mark Andrews.
128
 * author:
129
 *      Paul Vixie, 1996.
130
 */
131
static int
132
inet_pton6(src, dst)
133
        const char *src;
134
        u_char *dst;
135
{
136
        static const char xdigits_l[] = "0123456789abcdef",
137
                          xdigits_u[] = "0123456789ABCDEF";
138
        u_char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;
139
        const char *xdigits, *curtok;
140
        int ch, saw_xdigit;
141
        u_int val;
142
 
143
        memset((tp = tmp), '\0', NS_IN6ADDRSZ);
144
        endp = tp + NS_IN6ADDRSZ;
145
        colonp = NULL;
146
        /* Leading :: requires some special handling. */
147
        if (*src == ':')
148
                if (*++src != ':')
149
                        return (0);
150
        curtok = src;
151
        saw_xdigit = 0;
152
        val = 0;
153
        while ((ch = *src++) != '\0') {
154
                const char *pch;
155
 
156
                if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
157
                        pch = strchr((xdigits = xdigits_u), ch);
158
                if (pch != NULL) {
159
                        val <<= 4;
160
                        val |= (pch - xdigits);
161
                        if (val > 0xffff)
162
                                return (0);
163
                        saw_xdigit = 1;
164
                        continue;
165
                }
166
                if (ch == ':') {
167
                        curtok = src;
168
                        if (!saw_xdigit) {
169
                                if (colonp)
170
                                        return (0);
171
                                colonp = tp;
172
                                continue;
173
                        }
174
                        if (tp + NS_INT16SZ > endp)
175
                                return (0);
176
                        *tp++ = (u_char) (val >> 8) & 0xff;
177
                        *tp++ = (u_char) val & 0xff;
178
                        saw_xdigit = 0;
179
                        val = 0;
180
                        continue;
181
                }
182
                if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
183
                    inet_pton4(curtok, tp) > 0) {
184
                        tp += NS_INADDRSZ;
185
                        saw_xdigit = 0;
186
                        break;  /* '\0' was seen by inet_pton4(). */
187
                }
188
                return (0);
189
        }
190
        if (saw_xdigit) {
191
                if (tp + NS_INT16SZ > endp)
192
                        return (0);
193
                *tp++ = (u_char) (val >> 8) & 0xff;
194
                *tp++ = (u_char) val & 0xff;
195
        }
196
        if (colonp != NULL) {
197
                /*
198
                 * Since some memmove()'s erroneously fail to handle
199
                 * overlapping regions, we'll do the shift by hand.
200
                 */
201
                const int n = tp - colonp;
202
                int i;
203
 
204
                for (i = 1; i <= n; i++) {
205
                        endp[- i] = colonp[n - i];
206
                        colonp[n - i] = 0;
207
                }
208
                tp = endp;
209
        }
210
        if (tp != endp)
211
                return (0);
212
        memcpy(dst, tmp, NS_IN6ADDRSZ);
213
        return (1);
214
}

powered by: WebSVN 2.1.0

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