ReactOS  0.4.15-dev-2956-g61e7ea5
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
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:
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 *
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  */
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) {
188  return (NULL);
189  }
190  strcpy(dst, tmp);
191  return (dst);
192 }
193 #endif
194 
#define SPRINTF(x)
Definition: inet_ntop.c:30
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
PCSTR WSAAPI inet_ntop(INT Family, PVOID pAddr, PSTR pStringBuf, size_t StringBufSize)
Definition: inet_ntop.c:57
#define WSAEINVAL
Definition: winerror.h:1946
#define WSAEAFNOSUPPORT
Definition: winerror.h:1960
int32_t INT
Definition: typedefs.h:58
GLuint base
Definition: 3dtext.c:35
#define AF_INET6
Definition: winsock.h:369
#define _In_
Definition: ms_sal.h:308
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:2930
GLsizeiptr size
Definition: glext.h:5919
static const char * inet_ntop4(const u_char *src, char *dst, socklen_t size)
Definition: inet_ntop.c:87
int socklen_t
Definition: tcp.c:35
GLenum GLsizei len
Definition: glext.h:6722
GLenum src
Definition: glext.h:6340
FxCollectionEntry * cur
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
UINT32 u_int
Definition: types.h:82
#define WSAAPI
Definition: winsock2.h:584
#define IN6ADDRSZ
Definition: inet_ntop.c:20
signed char * PSTR
Definition: retypes.h:7
GLenum GLenum dst
Definition: glext.h:6340
#define NULL
Definition: types.h:112
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define AF_INET
Definition: tcpip.h:117
const char * PCSTR
Definition: typedefs.h:52
UCHAR u_char
Definition: types.h:80
#define memset(x, y, z)
Definition: compat.h:39
Definition: dsound.c:943
#define INT16SZ
Definition: inet_ntop.c:24
#define _Out_writes_(size)
Definition: ms_sal.h:348