ReactOS 0.4.15-dev-7942-gd23573b
inet_ntop.c
Go to the documentation of this file.
1/* from NetBSD: inet_ntop.c,v 1.9 2000/01/22 22:19:16 mycroft Exp */
2
3/* Copyright (c) 1996 by Internet Software Consortium.
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
10 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
11 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
12 * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
15 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
16 * SOFTWARE.
17 */
18
19#ifndef IN6ADDRSZ
20#define IN6ADDRSZ 16
21#endif
22
23#ifndef INT16SZ
24#define INT16SZ 2
25#endif
26
27#ifdef SPRINTF_CHAR
28# define SPRINTF(x) strlen(sprintfx)
29#else
30# define SPRINTF(x) ((socklen_t)sprintf x)
31#endif
32
33/*
34 * WARNING: Don't even consider trying to compile this on a system where
35 * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
36 */
37
38static const char *inet_ntop4(const u_char *src, char *dst, socklen_t size);
39
40#ifdef INET6
41static const char *inet_ntop6(const u_char *src, char *dst, socklen_t size);
42#endif
43
44/* char *
45 * inet_ntop(af, src, dst, size)
46 * convert a network format address to presentation format.
47 * return:
48 * pointer to presentation format address (`dst'), or NULL (see errno).
49 * author:
50 * Paul Vixie, 1996.
51 */
55 _In_ INT af,
57 _Out_writes_(StringBufSize) PSTR dst,
58 _In_ size_t size)
59{
60
61 switch (af) {
62 case AF_INET:
63 return (inet_ntop4(src, dst, size));
64#ifdef INET6
65 case AF_INET6:
66 return (inet_ntop6(src, dst, size));
67#endif
68 default:
70 return (NULL);
71 }
72 /* NOTREACHED */
73}
74
75/* const char *
76 * inet_ntop4(src, dst, size)
77 * format an IPv4 address, more or less like inet_ntoa()
78 * return:
79 * `dst' (as a const)
80 * notes:
81 * (1) uses no statics
82 * (2) takes a u_char* not an in_addr as input
83 * author:
84 * Paul Vixie, 1996.
85 */
86static const char *
88{
89 static const char fmt[] = "%u.%u.%u.%u";
90 char tmp[sizeof "255.255.255.255"];
91
92 if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) {
94 return (NULL);
95 }
96 strcpy(dst, tmp);
97 return (dst);
98}
99
100#ifdef INET6
101/* const char *
102 * inet_ntop6(src, dst, size)
103 * convert IPv6 binary address into presentation (printable) format
104 * author:
105 * Paul Vixie, 1996.
106 */
107static const char *
108inet_ntop6(const u_char *src, char *dst, socklen_t size)
109{
110 /*
111 * Note that int32_t and int16_t need only be "at least" large enough
112 * to contain a value of the specified size. On some systems, like
113 * Crays, there is no such thing as an integer variable with 16 bits.
114 * Keep this in mind if you think this function should have been coded
115 * to use pointer overlays. All the world's not a VAX.
116 */
117 char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp;
118 struct { int base, len; } best, cur;
119 u_int words[IN6ADDRSZ / INT16SZ];
120 int i;
121
122 /*
123 * Preprocess:
124 * Copy the input (bytewise) array into a wordwise array.
125 * Find the longest run of 0x00's in src[] for :: shorthanding.
126 */
127 memset(words, '\0', sizeof words);
128 for (i = 0; i < IN6ADDRSZ; i++)
129 words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
130 best.base = -1;
131 cur.base = -1;
132 for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) {
133 if (words[i] == 0) {
134 if (cur.base == -1)
135 cur.base = i, cur.len = 1;
136 else
137 cur.len++;
138 } else {
139 if (cur.base != -1) {
140 if (best.base == -1 || cur.len > best.len)
141 best = cur;
142 cur.base = -1;
143 }
144 }
145 }
146 if (cur.base != -1) {
147 if (best.base == -1 || cur.len > best.len)
148 best = cur;
149 }
150 if (best.base != -1 && best.len < 2)
151 best.base = -1;
152
153 /*
154 * Format the result.
155 */
156 tp = tmp;
157 for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) {
158 /* Are we inside the best run of 0x00's? */
159 if (best.base != -1 && i >= best.base &&
160 i < (best.base + best.len)) {
161 if (i == best.base)
162 *tp++ = ':';
163 continue;
164 }
165 /* Are we following an initial run of 0x00s or any real hex? */
166 if (i != 0)
167 *tp++ = ':';
168 /* Is this address an encapsulated IPv4? */
169 if (i == 6 && best.base == 0 &&
170 (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) {
171 if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp)))
172 return (NULL);
173 tp += strlen(tp);
174 break;
175 }
176 tp += SPRINTF((tp, "%x", words[i]));
177 }
178 /* Was it a trailing run of 0x00's? */
179 if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ))
180 *tp++ = ':';
181 *tp++ = '\0';
182
183 /*
184 * Check for overflow, copy, and we're done.
185 */
186 if ((socklen_t)(tp - tmp) > size) {
188 return (NULL);
189 }
190 strcpy(dst, tmp);
191 return (dst);
192}
193#endif
194
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
UINT32 u_int
Definition: types.h:82
#define NULL
Definition: types.h:112
UCHAR u_char
Definition: types.h:80
VOID WSAAPI WSASetLastError(IN INT iError)
Definition: dllmain.c:123
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
Definition: btrfs.c:2996
#define AF_INET
Definition: tcpip.h:117
FxCollectionEntry * cur
GLsizeiptr size
Definition: glext.h:5919
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
int socklen_t
Definition: tcp.c:35
#define _Out_writes_(size)
Definition: ms_sal.h:348
#define _In_
Definition: ms_sal.h:308
#define memset(x, y, z)
Definition: compat.h:39
Definition: dsound.c:943
char * PSTR
Definition: typedefs.h:51
int32_t INT
Definition: typedefs.h:58
const char * PCSTR
Definition: typedefs.h:52
#define WSAEINVAL
Definition: winerror.h:1946
#define WSAEAFNOSUPPORT
Definition: winerror.h:1960
#define SPRINTF(x)
Definition: inet_ntop.c:32
PCSTR WSAAPI inet_ntop(INT Family, PVOID pAddr, PSTR pStringBuf, size_t StringBufSize)
Definition: inet_ntop.c:57
static const char * inet_ntop4(const u_char *src, char *dst, size_t size)
Definition: inet_ntop.c:86
#define IN6ADDRSZ
Definition: inet_ntop.c:22
#define INT16SZ
Definition: inet_ntop.c:26
#define WSAAPI
Definition: winsock2.h:605
#define AF_INET6
Definition: winsock.h:369