ReactOS  0.4.14-dev-98-gb0d4763
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 
40 static const char *inet_ntop4(const u_char *src, char *dst, size_t size);
41 
42 #ifdef INET6
43 static 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 
55 PCSTR
56 WSAAPI
57 inet_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  */
85 static const char *
86 inet_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  */
106 static const char *
107 inet_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
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:56
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
GLuint base
Definition: 3dtext.c:35
#define INT16SZ
Definition: inet_ntop.c:26
smooth NULL
Definition: ftsmooth.c:416
#define AF_INET6
Definition: winsock.h:369
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:2883
GLsizeiptr size
Definition: glext.h:5919
static const char * inet_ntop4(const u_char *src, char *dst, size_t size)
Definition: inet_ntop.c:86
#define SPRINTF(x)
Definition: inet_ntop.c:32
GLenum GLsizei len
Definition: glext.h:6722
GLenum src
Definition: glext.h:6340
UINT32 u_int
Definition: types.h:82
#define WSAAPI
Definition: winsock2.h:584
signed char * PSTR
Definition: retypes.h:7
GLenum GLenum dst
Definition: glext.h:6340
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define AF_INET
Definition: tcpip.h:117
const char * PCSTR
Definition: typedefs.h:51
UCHAR u_char
Definition: types.h:80
#define memset(x, y, z)
Definition: compat.h:39
Definition: dsound.c:943
#define IN6ADDRSZ
Definition: inet_ntop.c:22