PostgreSQL Source Code: src/port/inet_net_ntop.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#if defined(LIBC_SCCS) && !defined(lint)
21static const char rcsid[] = "Id: inet_net_ntop.c,v 1.1.2.2 2004/03/09 09:17:27 marka Exp $";
22#endif
23
24#ifndef FRONTEND
26#else
28#endif
29
33
34#ifndef FRONTEND
36#else
37
38
39
40
41
42#define PGSQL_AF_INET (AF_INET + 0)
43#define PGSQL_AF_INET6 (AF_INET + 1)
44#endif
45
46
47#define NS_IN6ADDRSZ 16
48#define NS_INT16SZ 2
49
50#ifdef SPRINTF_CHAR
51#define SPRINTF(x) strlen(sprintfx)
52#else
53#define SPRINTF(x) ((size_t)sprintf x)
54#endif
55
57 char *dst, size_t size);
59 char *dst, size_t size);
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76char *
77pg_inet_net_ntop(int af, const void *src, int bits, char *dst, size_t size)
78{
79
80
81
82
83
84
85 switch (af)
86 {
90#if AF_INET6 != PGSQL_AF_INET6
91 case AF_INET6:
92#endif
94 default:
96 return (NULL);
97 }
98}
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113static char *
115{
116 char *odst = dst;
117 char *t;
118 int len = 4;
119 int b;
120
121 if (bits < 0 || bits > 32)
122 {
123 errno = EINVAL;
124 return (NULL);
125 }
126
127
129 {
130 if (size <= sizeof ".255")
131 goto emsgsize;
132 t = dst;
133 if (dst != odst)
134 *dst++ = '.';
135 dst += SPRINTF((dst, "%u", *src++));
136 size -= (size_t) (dst - t);
137 }
138
139
140 if (bits != 32)
141 {
142 if (size <= sizeof "/32")
143 goto emsgsize;
144 dst += SPRINTF((dst, "/%u", bits));
145 }
146
147 return (odst);
148
149emsgsize:
151 return (NULL);
152}
153
154static int
155decoct(const u_char *src, int bytes, char *dst, size_t size)
156{
157 char *odst = dst;
158 char *t;
159 int b;
160
161 for (b = 1; b <= bytes; b++)
162 {
163 if (size <= sizeof "255.")
164 return (0);
165 t = dst;
166 dst += SPRINTF((dst, "%u", *src++));
167 if (b != bytes)
168 {
169 *dst++ = '.';
170 *dst = '\0';
171 }
172 size -= (size_t) (dst - t);
173 }
174 return (dst - odst);
175}
176
177static char *
179{
180
181
182
183
184
185
186
187 char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255/128"];
188 char *tp;
189 struct
190 {
191 int base,
193 } best, cur;
195 int i;
196
197 if ((bits < -1) || (bits > 128))
198 {
199 errno = EINVAL;
200 return (NULL);
201 }
202
203
204
205
206
207 memset(words, '\0', sizeof words);
209 words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
210 best.base = -1;
211 cur.base = -1;
212 best.len = 0;
213 cur.len = 0;
215 {
216 if (words[i] == 0)
217 {
218 if (cur.base == -1)
219 cur.base = i, cur.len = 1;
220 else
221 cur.len++;
222 }
223 else
224 {
225 if (cur.base != -1)
226 {
227 if (best.base == -1 || cur.len > best.len)
228 best = cur;
229 cur.base = -1;
230 }
231 }
232 }
233 if (cur.base != -1)
234 {
235 if (best.base == -1 || cur.len > best.len)
236 best = cur;
237 }
238 if (best.base != -1 && best.len < 2)
239 best.base = -1;
240
241
242
243
244 tp = tmp;
246 {
247
248 if (best.base != -1 && i >= best.base &&
249 i < (best.base + best.len))
250 {
251 if (i == best.base)
252 *tp++ = ':';
253 continue;
254 }
255
256 if (i != 0)
257 *tp++ = ':';
258
259 if (i == 6 && best.base == 0 && (best.len == 6 ||
260 (best.len == 7 && words[7] != 0x0001) ||
261 (best.len == 5 && words[5] == 0xffff)))
262 {
263 int n;
264
265 n = decoct(src + 12, 4, tp, sizeof tmp - (tp - tmp));
266 if (n == 0)
267 {
269 return (NULL);
270 }
271 tp += strlen(tp);
272 break;
273 }
274 tp += SPRINTF((tp, "%x", words[i]));
275 }
276
277
278 if (best.base != -1 && (best.base + best.len) ==
280 *tp++ = ':';
281 *tp = '\0';
282
283 if (bits != -1 && bits != 128)
284 tp += SPRINTF((tp, "/%u", bits));
285
286
287
288
289 if ((size_t) (tp - tmp) > size)
290 {
292 return (NULL);
293 }
294 strcpy(dst, tmp);
295 return (dst);
296}
static char * inet_net_ntop_ipv6(const u_char *src, int bits, char *dst, size_t size)
char * pg_inet_net_ntop(int af, const void *src, int bits, char *dst, size_t size)
static char * inet_net_ntop_ipv4(const u_char *src, int bits, char *dst, size_t size)
static int decoct(const u_char *src, int bytes, char *dst, size_t size)