/* 
 * GNetwork Library: tests/testinterfaces.c
 *
 * Copyright (C) 2003 James M. Cape
 *
 * This program 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; version 2.1 of the
 * License.
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA
 */

#include <libgnetwork/gnetwork.h>
#include <string.h>


static gchar *
protocols_to_string (GNetworkProtocols protocols)
{
  gchar *retval, *tmp;

  retval = NULL;
  if (protocols & GNETWORK_PROTOCOL_PACKET)
    {
      retval = g_strdup ("Ethernet");
    }

  if (protocols & GNETWORK_PROTOCOL_IPv4)
    {
      tmp = retval;
      retval = g_strconcat ((tmp != NULL ? "IPv4 " : "IPv4"), tmp, NULL);
      g_free (tmp);
    }

  if (protocols & GNETWORK_PROTOCOL_IPv6)
    {
      tmp = retval;
      retval = g_strconcat ((tmp != NULL ? "IPv6 " : "IPv6"), tmp, NULL);
      g_free (tmp);
    }

  return retval;
}


static gchar *
flags_to_string (GNetworkInterfaceFlags flags)
{
  gchar *ptr;
  gchar data[1024] = { 0 };

  ptr = data;
  if (flags & GNETWORK_INTERFACE_IS_UP)
    {
      memcpy (ptr, "Up ", 3);
      ptr += 3;
    }

  if (flags & GNETWORK_INTERFACE_IS_RUNNING)
    {
      memcpy (ptr, "Running ", 8);
      ptr += 8;
    }

  if (flags & GNETWORK_INTERFACE_IS_DEBUGGING)
    {
      memcpy (ptr, "Debugging ", 10);
      ptr += 10;
    }

  if (flags & GNETWORK_INTERFACE_IS_LOOPBACK)
    {
      memcpy (ptr, "Loopback ", 9);
      ptr += 9;
    }

  if (flags & GNETWORK_INTERFACE_IS_POINT_TO_POINT)
    {
      memcpy (ptr, "Point-to-point ", 15);
      ptr += 15;
    }

  if (flags & GNETWORK_INTERFACE_IS_LOAD_MASTER)
    {
      memcpy (ptr, "Load-master ", 12);
      ptr += 12;
    }

  if (flags & GNETWORK_INTERFACE_IS_LOAD_SLAVE)
    {
      memcpy (ptr, "Load-slave ", 11);
      ptr += 11;
    }

  if (flags & GNETWORK_INTERFACE_NO_TRAILERS)
    {
      memcpy (ptr, "No-trailers ", 12);
      ptr += 12;
    }

  if (flags & GNETWORK_INTERFACE_NO_ARP)
    {
      memcpy (ptr, "No-ARP ", 7);
      ptr += 7;
    }

  if (flags & GNETWORK_INTERFACE_RECV_ALL_PACKETS)
    {
      memcpy (ptr, "All-packets ", 12);
      ptr += 12;
    }

  if (flags & GNETWORK_INTERFACE_RECV_ALL_MULTICAST)
    {
      memcpy (ptr, "All-multicast ", 14);
      ptr += 14;
    }

  if (flags & GNETWORK_INTERFACE_CAN_BROADCAST)
    {
      memcpy (ptr, "Broadcast ", 10);
      ptr += 10;
    }

  if (flags & GNETWORK_INTERFACE_CAN_MULTICAST)
    {
      memcpy (ptr, "Multicast ", 10);
      ptr += 10;
    }

  if (flags & GNETWORK_INTERFACE_CAN_SET_MEDIA)
    {
      memcpy (ptr, "Media-select ", 13);
      ptr += 13;
    }

  if (flags & GNETWORK_INTERFACE_AUTOSELECTED_MEDIA)
    {
      memcpy (ptr, "Media-autoselect ", 17);
      ptr += 17;
    }

  return g_strdup (data);
}


int
main (int argc, char *argv[])
{
  GSList *interfaces;
  guint i;

  g_type_init ();

  g_print ("Configured Interfaces:\n");
  for (interfaces = gnetwork_interface_get_all_interfaces (), i = 0; interfaces != NULL;
       interfaces = g_slist_remove_link (interfaces, interfaces), i++)
    {
      gchar *str = NULL;
      G_CONST_RETURN GSList *multicasts;

      g_print ("\nInterface %u:\n", i);
      str = gnetwork_interface_info_get_name (interfaces->data);
      g_print ("  Name\t\t\t= %s\n", str);
      g_free (str);

      str = protocols_to_string (gnetwork_interface_info_get_protocols (interfaces->data));
      g_print ("  Protocols\t\t= %s\n", (str != NULL ? str : "None"));
      g_free (str);

      str = flags_to_string (gnetwork_interface_info_get_flags (interfaces->data));
      g_print ("  Flags\t\t\t= %s\n", str);
      g_free (str);

      /* HW */
      g_print ("  Hardware Address\t= %s\n",
	       (gchar *) gnetwork_interface_info_get_address (interfaces->data,
							      GNETWORK_PROTOCOL_PACKET));

      g_print ("  Hardware Broadcast\t= %s\n",
	       (gchar *) gnetwork_interface_info_get_broadcast_address (interfaces->data,
									GNETWORK_PROTOCOL_PACKET));

      /* IPv4 */
      str = gnetwork_ip_address_to_string (gnetwork_interface_info_get_address (interfaces->data,
										GNETWORK_PROTOCOL_IPv4));
      g_print ("  IPv4 Address\t\t= %s\n", str);
      g_free (str);

      str = gnetwork_ip_address_to_string (gnetwork_interface_info_get_broadcast_address (interfaces->data,
										GNETWORK_PROTOCOL_IPv4));
      g_print ("  IPv4 Broadcast\t= %s\n", str);
      g_free (str);

      str = gnetwork_ip_address_to_string (gnetwork_interface_info_get_netmask (interfaces->data,
										GNETWORK_PROTOCOL_IPv4));
      g_print ("  IPv4 Netmask\t\t= %s\n", str);
      g_free (str);

      multicasts = gnetwork_interface_info_get_multicasts (interfaces->data,
							   GNETWORK_PROTOCOL_IPv4);
      if (multicasts != NULL)
	{
	  g_print ("  IPv4 Multicasts\t=");
	  for (; multicasts != NULL; multicasts = multicasts->next)
	    {
	      str = gnetwork_ip_address_to_string (multicasts->data);
	      g_print (" %s", str);
	      g_free (str);
	    }
	  g_print ("\n");
	}

      /* IPv6 */
      str = gnetwork_ip_address_to_string (gnetwork_interface_info_get_address (interfaces->data,
										GNETWORK_PROTOCOL_IPv6));
      g_print ("  IPv6 Address\t\t= %s\n", str);
      g_free (str);

      str = gnetwork_ip_address_to_string (gnetwork_interface_info_get_netmask (interfaces->data,
										GNETWORK_PROTOCOL_IPv6));
      g_print ("  IPv6 Netmask\t\t= %s\n", str);
      g_free (str);

      multicasts = gnetwork_interface_info_get_multicasts (interfaces->data,
							   GNETWORK_PROTOCOL_IPv6);
      if (multicasts != NULL)
	{
	  g_print ("  IPv6 Multicasts\t= ");
	  for (; multicasts != NULL; multicasts = multicasts->next)
	    {
	      str = gnetwork_ip_address_to_string (multicasts->data);
	      g_print ("%s%s", str, (multicasts->next != NULL ? ", " : "\n"));
	      g_free (str);
	    }
	}

      gnetwork_interface_info_unref (interfaces->data);
    }

  return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1