@@ -32,21 +32,14 @@ static const char rcsid[] = "Id: inet_net_ntop.c,v 1.1.2.2 2004/03/09 09:17:27 m
3232#include "utils/inet.h"
3333
3434
35- #define NS_IN6ADDRSZ 16
36- #define NS_INT16SZ 2
37-
3835#ifdef SPRINTF_CHAR
3936#define SPRINTF (x ) strlen(sprintf/**/ x )
4037#else
4138#define SPRINTF (x ) ((size_t)sprintf x)
4239#endif
4340
44- static char * inet_net_ntop_ipv4 (const u_char * src , int bits ,
45- char * dst , size_t size );
4641static char * inet_cidr_ntop_ipv4 (const u_char * src , int bits ,
4742 char * dst , size_t size );
48- static char * inet_net_ntop_ipv6 (const u_char * src , int bits ,
49- char * dst , size_t size );
5043static char * inet_cidr_ntop_ipv6 (const u_char * src , int bits ,
5144 char * dst , size_t size );
5245
@@ -300,231 +293,3 @@ inet_cidr_ntop_ipv6(const u_char *src, int bits, char *dst, size_t size)
300293 errno = EMSGSIZE ;
301294 return (NULL );
302295}
303-
304-
305- /*
306- * char *
307- * inet_net_ntop(af, src, bits, dst, size)
308- * convert host/network address from network to presentation format.
309- * "src"'s size is determined from its "af".
310- * return:
311- * pointer to dst, or NULL if an error occurred (check errno).
312- * note:
313- * 192.5.5.1/28 has a nonzero host part, which means it isn't a network
314- * as called for by inet_net_pton() but it can be a host address with
315- * an included netmask.
316- * author:
317- * Paul Vixie (ISC), October 1998
318- */
319- char *
320- inet_net_ntop (int af , const void * src , int bits , char * dst , size_t size )
321- {
322- switch (af )
323- {
324- case PGSQL_AF_INET :
325- return (inet_net_ntop_ipv4 (src , bits , dst , size ));
326- case PGSQL_AF_INET6 :
327- return (inet_net_ntop_ipv6 (src , bits , dst , size ));
328- default :
329- errno = EAFNOSUPPORT ;
330- return (NULL );
331- }
332- }
333-
334- /*
335- * static char *
336- * inet_net_ntop_ipv4(src, bits, dst, size)
337- * convert IPv4 network address from network to presentation format.
338- * "src"'s size is determined from its "af".
339- * return:
340- * pointer to dst, or NULL if an error occurred (check errno).
341- * note:
342- * network byte order assumed. this means 192.5.5.240/28 has
343- * 0b11110000 in its fourth octet.
344- * author:
345- * Paul Vixie (ISC), October 1998
346- */
347- static char *
348- inet_net_ntop_ipv4 (const u_char * src , int bits , char * dst , size_t size )
349- {
350- char * odst = dst ;
351- char * t ;
352- int len = 4 ;
353- int b ;
354-
355- if (bits < 0 || bits > 32 )
356- {
357- errno = EINVAL ;
358- return (NULL );
359- }
360-
361- /* Always format all four octets, regardless of mask length. */
362- for (b = len ; b > 0 ; b -- )
363- {
364- if (size <= sizeof ".255" )
365- goto emsgsize ;
366- t = dst ;
367- if (dst != odst )
368- * dst ++ = '.' ;
369- dst += SPRINTF ((dst , "%u" , * src ++ ));
370- size -= (size_t ) (dst - t );
371- }
372-
373- /* don't print masklen if 32 bits */
374- if (bits != 32 )
375- {
376- if (size <= sizeof "/32" )
377- goto emsgsize ;
378- dst += SPRINTF ((dst , "/%u" , bits ));
379- }
380-
381- return (odst );
382-
383- emsgsize :
384- errno = EMSGSIZE ;
385- return (NULL );
386- }
387-
388- static int
389- decoct (const u_char * src , int bytes , char * dst , size_t size )
390- {
391- char * odst = dst ;
392- char * t ;
393- int b ;
394-
395- for (b = 1 ; b <= bytes ; b ++ )
396- {
397- if (size <= sizeof "255." )
398- return (0 );
399- t = dst ;
400- dst += SPRINTF ((dst , "%u" , * src ++ ));
401- if (b != bytes )
402- {
403- * dst ++ = '.' ;
404- * dst = '\0' ;
405- }
406- size -= (size_t ) (dst - t );
407- }
408- return (dst - odst );
409- }
410-
411- static char *
412- inet_net_ntop_ipv6 (const u_char * src , int bits , char * dst , size_t size )
413- {
414- /*
415- * Note that int32_t and int16_t need only be "at least" large enough to
416- * contain a value of the specified size. On some systems, like Crays,
417- * there is no such thing as an integer variable with 16 bits. Keep this
418- * in mind if you think this function should have been coded to use
419- * pointer overlays. All the world's not a VAX.
420- */
421- char tmp [sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255/128" ];
422- char * tp ;
423- struct
424- {
425- int base ,
426- len ;
427- } best , cur ;
428- u_int words [NS_IN6ADDRSZ / NS_INT16SZ ];
429- int i ;
430-
431- if ((bits < -1 ) || (bits > 128 ))
432- {
433- errno = EINVAL ;
434- return (NULL );
435- }
436-
437- /*
438- * Preprocess: Copy the input (bytewise) array into a wordwise array. Find
439- * the longest run of 0x00's in src[] for :: shorthanding.
440- */
441- memset (words , '\0' , sizeof words );
442- for (i = 0 ; i < NS_IN6ADDRSZ ; i ++ )
443- words [i / 2 ] |= (src [i ] << ((1 - (i % 2 )) << 3 ));
444- best .base = -1 ;
445- cur .base = -1 ;
446- best .len = 0 ;
447- cur .len = 0 ;
448- for (i = 0 ; i < (NS_IN6ADDRSZ / NS_INT16SZ ); i ++ )
449- {
450- if (words [i ] == 0 )
451- {
452- if (cur .base == -1 )
453- cur .base = i , cur .len = 1 ;
454- else
455- cur .len ++ ;
456- }
457- else
458- {
459- if (cur .base != -1 )
460- {
461- if (best .base == -1 || cur .len > best .len )
462- best = cur ;
463- cur .base = -1 ;
464- }
465- }
466- }
467- if (cur .base != -1 )
468- {
469- if (best .base == -1 || cur .len > best .len )
470- best = cur ;
471- }
472- if (best .base != -1 && best .len < 2 )
473- best .base = -1 ;
474-
475- /*
476- * Format the result.
477- */
478- tp = tmp ;
479- for (i = 0 ; i < (NS_IN6ADDRSZ / NS_INT16SZ ); i ++ )
480- {
481- /* Are we inside the best run of 0x00's? */
482- if (best .base != -1 && i >= best .base &&
483- i < (best .base + best .len ))
484- {
485- if (i == best .base )
486- * tp ++ = ':' ;
487- continue ;
488- }
489- /* Are we following an initial run of 0x00s or any real hex? */
490- if (i != 0 )
491- * tp ++ = ':' ;
492- /* Is this address an encapsulated IPv4? */
493- if (i == 6 && best .base == 0 && (best .len == 6 ||
494- (best .len == 7 && words [7 ] != 0x0001 ) ||
495- (best .len == 5 && words [5 ] == 0xffff )))
496- {
497- int n ;
498-
499- n = decoct (src + 12 , 4 , tp , sizeof tmp - (tp - tmp ));
500- if (n == 0 )
501- {
502- errno = EMSGSIZE ;
503- return (NULL );
504- }
505- tp += strlen (tp );
506- break ;
507- }
508- tp += SPRINTF ((tp , "%x" , words [i ]));
509- }
510-
511- /* Was it a trailing run of 0x00's? */
512- if (best .base != -1 && (best .base + best .len ) ==
513- (NS_IN6ADDRSZ / NS_INT16SZ ))
514- * tp ++ = ':' ;
515- * tp = '\0' ;
516-
517- if (bits != -1 && bits != 128 )
518- tp += SPRINTF ((tp , "/%u" , bits ));
519-
520- /*
521- * Check for overflow, copy, and we're done.
522- */
523- if ((size_t ) (tp - tmp ) > size )
524- {
525- errno = EMSGSIZE ;
526- return (NULL );
527- }
528- strcpy (dst , tmp );
529- return (dst );
530- }
0 commit comments