ReactOS
0.4.16-dev-2-g02a6913
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
38
static
const
char
*
inet_ntop4
(
const
u_char
*
src
,
char
*
dst
,
socklen_t
size
);
39
40
#ifdef INET6
41
static
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
*/
52
PCSTR
53
WSAAPI
54
inet_ntop
(
55
_In_
INT
af,
56
_In_
PVOID
src
,
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
:
69
WSASetLastError
(
WSAEAFNOSUPPORT
);
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
*/
86
static
const
char
*
87
inet_ntop4
(
const
u_char
*
src
,
char
*
dst
,
socklen_t
size
)
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
) {
93
WSASetLastError
(
WSAEINVAL
);
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
*/
107
static
const
char
*
108
inet_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
) {
187
WSASetLastError
(
WSAEINVAL
);
188
return
(
NULL
);
189
}
190
strcpy
(
dst
, tmp);
191
return
(
dst
);
192
}
193
#endif
194
strlen
ACPI_SIZE strlen(const char *String)
Definition:
utclib.c:269
strcpy
char * strcpy(char *DstString, const char *SrcString)
Definition:
utclib.c:388
u_int
UINT32 u_int
Definition:
types.h:82
NULL
#define NULL
Definition:
types.h:112
u_char
UCHAR u_char
Definition:
types.h:80
WSASetLastError
VOID WSAAPI WSASetLastError(IN INT iError)
Definition:
dllmain.c:123
tp
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
Definition:
btrfs.c:2996
AF_INET
#define AF_INET
Definition:
tcpip.h:117
cur
FxCollectionEntry * cur
Definition:
fxresourceapi.cpp:412
size
GLsizeiptr size
Definition:
glext.h:5919
src
GLenum src
Definition:
glext.h:6340
dst
GLenum GLenum dst
Definition:
glext.h:6340
len
GLenum GLsizei len
Definition:
glext.h:6722
i
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
void
Definition:
nsiface.idl:2307
socklen_t
int socklen_t
Definition:
tcp.c:35
_Out_writes_
#define _Out_writes_(size)
Definition:
ms_sal.h:348
_In_
#define _In_
Definition:
ms_sal.h:308
memset
#define memset(x, y, z)
Definition:
compat.h:39
base
Definition:
uninitialized_test.cpp:81
fmt
Definition:
dsound.c:943
PSTR
char * PSTR
Definition:
typedefs.h:51
INT
int32_t INT
Definition:
typedefs.h:58
PCSTR
const char * PCSTR
Definition:
typedefs.h:52
WSAEINVAL
#define WSAEINVAL
Definition:
winerror.h:1946
WSAEAFNOSUPPORT
#define WSAEAFNOSUPPORT
Definition:
winerror.h:1960
SPRINTF
#define SPRINTF(x)
Definition:
inet_ntop.c:32
inet_ntop
PCSTR WSAAPI inet_ntop(INT Family, PVOID pAddr, PSTR pStringBuf, size_t StringBufSize)
Definition:
inet_ntop.c:57
inet_ntop4
static const char * inet_ntop4(const u_char *src, char *dst, size_t size)
Definition:
inet_ntop.c:86
IN6ADDRSZ
#define IN6ADDRSZ
Definition:
inet_ntop.c:22
INT16SZ
#define INT16SZ
Definition:
inet_ntop.c:26
WSAAPI
#define WSAAPI
Definition:
winsock2.h:605
AF_INET6
#define AF_INET6
Definition:
winsock.h:369
dll
win32
wininet
inet_ntop.c
Generated on Thu Sep 12 2024 06:05:15 for ReactOS by
1.9.6