/* Test listing of network interface addresses.
   Copyright (C) 2002-2014 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <arpa/inet.h>

static int failures;

static const char *
addr_string (struct sockaddr *sa, char *buf, size_t size)
{
  if (sa == NULL)
    return "<none>";

  switch (sa->sa_family)
    {
    case AF_INET:
      return inet_ntop (AF_INET, &((struct sockaddr_in *) sa)->sin_addr,
			buf, size);
    case AF_INET6:
      return inet_ntop (AF_INET6, &((struct sockaddr_in6 *) sa)->sin6_addr,
			buf, size);
#ifdef AF_LINK
    case AF_LINK:
      return "<link>";
#endif
    case AF_UNSPEC:
      return "---";

#ifdef AF_PACKET
    case AF_PACKET:
      return "<packet>";
#endif

    default:
      ++failures;
      printf ("sa_family=%d %08x\n", sa->sa_family,
	      *(int*)&((struct sockaddr_in *) sa)->sin_addr.s_addr);
      return "<unexpected sockaddr family>";
    }
}


static int
do_test (void)
{
  struct ifaddrs *ifaces, *ifa;

  if (getifaddrs (&ifaces) < 0)
    {
      if (errno != ENOSYS)
	{
	  printf ("Couldn't get any interfaces: %s.\n", strerror (errno));
	  exit (1);
	}
      /* The function is simply not implemented.  */
      exit (0);
    }

  puts ("\
Name           Flags   Address         Netmask         Broadcast/Destination");

  for (ifa = ifaces; ifa != NULL; ifa = ifa->ifa_next)
    {
      char abuf[64], mbuf[64], dbuf[64];
      printf ("%-15s%#.4x  %-15s %-15s %-15s\n",
	      ifa->ifa_name, ifa->ifa_flags,
	      addr_string (ifa->ifa_addr, abuf, sizeof (abuf)),
	      addr_string (ifa->ifa_netmask, mbuf, sizeof (mbuf)),
	      addr_string (ifa->ifa_broadaddr, dbuf, sizeof (dbuf)));
    }

  freeifaddrs (ifaces);

  return failures ? 1 : 0;
}

#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
