12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1999 Kungliga Tekniska H�gskolan
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * (Royal Institute of Technology, Stockholm, Sweden).
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * All rights reserved.
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that the following conditions
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met:
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    documentation and/or other materials provided with the distribution.
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 3. All advertising materials mentioning features or use of this software
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    must display the following acknowledgement:
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *      This product includes software developed by the Kungliga Tekniska
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *      H�gskolan and its contributors.
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 4. Neither the name of the Institute nor the names of its contributors
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    may be used to endorse or promote products derived from this software
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    without specific prior written permission.
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SUCH DAMAGE.
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3953f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* $Id: inet_ntop.c,v 1.8 2005-02-09 02:25:46 guy Exp $ */
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
4353f17a9db278d33517d9888dd77848f554522a38JP Abgrall     "@(#) $Header: /tcpdump/master/tcpdump/missing/inet_ntop.c,v 1.8 2005-02-09 02:25:46 guy Exp $";
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <errno.h>
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef IN6ADDRSZ
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IN6ADDRSZ   16   /* IPv6 T_AAAA */
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef INT16SZ
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define INT16SZ     2    /* word size */
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectinet_ntop_v4 (const void *src, char *dst, size_t size)
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char digits[] = "0123456789";
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    int i;
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    struct in_addr *addr = (struct in_addr *)src;
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    u_long a = ntohl(addr->s_addr);
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    const char *orig_dst = dst;
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (size < INET_ADDRSTRLEN) {
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	errno = ENOSPC;
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    for (i = 0; i < 4; ++i) {
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int n = (a >> (24 - i * 8)) & 0xFF;
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int non_zerop = 0;
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (non_zerop || n / 100 > 0) {
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    *dst++ = digits[n / 100];
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    n %= 100;
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    non_zerop = 1;
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (non_zerop || n / 10 > 0) {
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    *dst++ = digits[n / 10];
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    n %= 10;
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    non_zerop = 1;
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	*dst++ = digits[n];
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i != 3)
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    *dst++ = '.';
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    *dst++ = '\0';
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return orig_dst;
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Convert IPv6 binary address into presentation (printable) format.
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectinet_ntop_v6 (const u_char *src, char *dst, size_t size)
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  /*
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   * Note that int32_t and int16_t need only be "at least" large enough
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   * to contain a value of the specified size.  On some systems, like
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   * Crays, there is no such thing as an integer variable with 16 bits.
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   * Keep this in mind if you think this function should have been coded
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   * to use pointer overlays.  All the world's not a VAX.
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   */
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  char  tmp [INET6_ADDRSTRLEN+1];
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  char *tp;
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  struct {
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    long base;
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    long len;
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  } best, cur;
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  u_long words [IN6ADDRSZ / INT16SZ];
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  int    i;
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  /* Preprocess:
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   *  Copy the input (bytewise) array into a wordwise array.
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   *  Find the longest run of 0x00's in src[] for :: shorthanding.
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   */
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  memset (words, 0, sizeof(words));
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  for (i = 0; i < IN6ADDRSZ; i++)
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      words[i/2] |= (src[i] << ((1 - (i % 2)) << 3));
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  best.base = -1;
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  cur.base  = -1;
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++)
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  {
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (words[i] == 0)
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    {
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      if (cur.base == -1)
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project           cur.base = i, cur.len = 1;
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      else cur.len++;
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    else if (cur.base != -1)
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    {
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      if (best.base == -1 || cur.len > best.len)
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         best = cur;
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      cur.base = -1;
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  }
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  if ((cur.base != -1) && (best.base == -1 || cur.len > best.len))
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     best = cur;
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  if (best.base != -1 && best.len < 2)
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     best.base = -1;
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  /* Format the result.
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   */
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  tp = tmp;
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++)
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  {
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* Are we inside the best run of 0x00's?
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     */
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (best.base != -1 && i >= best.base && i < (best.base + best.len))
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    {
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      if (i == best.base)
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         *tp++ = ':';
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      continue;
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* Are we following an initial run of 0x00s or any real hex?
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     */
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (i != 0)
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project       *tp++ = ':';
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    /* Is this address an encapsulated IPv4?
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     */
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    if (i == 6 && best.base == 0 &&
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        (best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    {
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      if (!inet_ntop_v4(src+12, tp, sizeof(tmp) - (tp - tmp)))
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      {
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        errno = ENOSPC;
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        return (NULL);
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      }
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      tp += strlen(tp);
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      break;
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    tp += sprintf (tp, "%lX", words[i]);
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  }
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  /* Was it a trailing run of 0x00's?
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   */
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ))
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     *tp++ = ':';
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  *tp++ = '\0';
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  /* Check for overflow, copy, and we're done.
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project   */
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  if ((size_t)(tp - tmp) > size)
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  {
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    errno = ENOSPC;
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return (NULL);
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  }
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  return strcpy (dst, tmp);
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  return (NULL);
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif   /* INET6 */
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst char *
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectinet_ntop(int af, const void *src, char *dst, size_t size)
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    switch (af) {
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case AF_INET :
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return inet_ntop_v4 (src, dst, size);
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    case AF_INET6:
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project         return inet_ntop_v6 ((const u_char*)src, dst, size);
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    default :
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	errno = EAFNOSUPPORT;
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
220