ReactOS 0.4.15-dev-7918-g2a2556c
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#include <stdio.h>
20
21#ifndef IN6ADDRSZ
22#define IN6ADDRSZ 16
23#endif
24
25#ifndef INT16SZ
26#define INT16SZ 2
27#endif
28
29#ifdef SPRINTF_CHAR
30# define SPRINTF(x) strlen(sprintfx)
31#else
32# define SPRINTF(x) ((size_t)sprintf x)
33#endif
34
35/*
36 * WARNING: Don't even consider trying to compile this on a system where
37 * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
38 */
39
40static const char *inet_ntop4(const u_char *src, char *dst, size_t size);
41
42#ifdef INET6
43static const char *inet_ntop6(const u_char *src, char *dst, size_t size);
44#endif
45
46/* char *
47 * inet_ntop(af, src, dst, size)
48 * convert a network format address to presentation format.
49 * return:
50 * pointer to presentation format address (`dst'), or NULL (see errno).
51 * author:
52 * Paul Vixie, 1996.
53 */
54
57inet_ntop(INT Family, PVOID pAddr, PSTR pStringBuf, size_t StringBufSize)
58{
59
60 switch (Family) {
61 case AF_INET:
62 return (inet_ntop4(pAddr, pStringBuf, StringBufSize));
63#ifdef INET6
64 case AF_INET6:
65 return (inet_ntop6(pAddr, pStringBuf, StringBufSize));
66#endif
67 default:
69 return (NULL);
70 }
71 /* NOTREACHED */
72}
73
74/* const char *
75 * inet_ntop4(src, dst, size)
76 * format an IPv4 address, more or less like inet_ntoa()
77 * return:
78 * `dst' (as a const)
79 * notes:
80 * (1) uses no statics
81 * (2) takes a u_char* not an in_addr as input
82 * author:
83 * Paul Vixie, 1996.
84 */
85static const char *
86inet_ntop4(const u_char *src, char *dst, size_t size)
87{
88 static const char fmt[] = "%u.%u.%u.%u";
89 char tmp[sizeof "255.255.255.255"];
90
91 if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) {
93 return (NULL);
94 }
95 strcpy(dst, tmp);
96 return (dst);
97}
98
99#ifdef INET6
100/* const char *
101 * inet_ntop6(src, dst, size)
102 * convert IPv6 binary address into presentation (printable) format
103 * author:
104 * Paul Vixie, 1996.
105 */
106static const char *
107inet_ntop6(const u_char *src, char *dst, size_t size)
108{
109 /*
110 * Note that int32_t and int16_t need only be "at least" large enough
111 * to contain a value of the specified size. On some systems, like
112 * Crays, there is no such thing as an integer variable with 16 bits.
113 * Keep this in mind if you think this function should have been coded
114 * to use pointer overlays. All the world's not a VAX.
115 */
116 char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp;
117 struct { int base, len; } best, cur;
118 u_int words[IN6ADDRSZ / INT16SZ];
119 int i;
120
121 /*
122 * Preprocess:
123 * Copy the input (bytewise) array into a wordwise array.
124 * Find the longest run of 0x00's in src[] for :: shorthanding.
125 */
126 memset(words, '\0', sizeof words);
127 for (i = 0; i < IN6ADDRSZ; i++)
128 words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
129 best.base = -1;
130 cur.base = -1;
131 for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) {
132 if (words[i] == 0) {
133 if (cur.base == -1)
134 cur.base = i, cur.len = 1;
135 else
136 cur.len++;
137 } else {
138 if (cur.base != -1) {
139 if (best.base == -1 || cur.len > best.len)
140 best = cur;
141 cur.base = -1;
142 }
143 }
144 }
145 if (cur.base != -1) {
146 if (best.base == -1 || cur.len > best.len)
147 best = cur;
148 }
149 if (best.base != -1 && best.len < 2)
150 best.base = -1;
151
152 /*
153 * Format the result.
154 */
155 tp = tmp;
156 for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++) {
157 /* Are we inside the best run of 0x00's? */
158 if (best.base != -1 && i >= best.base &&
159 i < (best.base + best.len)) {
160 if (i == best.base)
161 *tp++ = ':';
162 continue;
163 }
164 /* Are we following an initial run of 0x00s or any real hex? */
165 if (i != 0)
166 *tp++ = ':';
167 /* Is this address an encapsulated IPv4? */
168 if (i == 6 && best.base == 0 &&
169 (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) {
170 if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp)))
171 return (NULL);
172 tp += strlen(tp);
173 break;
174 }
175 tp += SPRINTF((tp, "%x", words[i]));
176 }
177 /* Was it a trailing run of 0x00's? */
178 if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ))
179 *tp++ = ':';
180 *tp++ = '\0';
181
182 /*
183 * Check for overflow, copy, and we're done.
184 */
185 if ((size_t)(tp - tmp) > size) {
187 return (NULL);
188 }
189 strcpy(dst, tmp);
190 return (dst);
191}
192#endif
193
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
PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER pAddr
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
static int Family
Definition: ping.c:62
#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