text: /**
   * \file
   * Portable networking functions
   *
   * Author:
   *	Rodrigo Kumpera (kumpera@gmail.com)
   *
   * (C) 2015 Xamarin
   */
  
  
  #ifndef __MONO_NETWORKING_H__
  #define __MONO_NETWORKING_H__
  
  #include <config.h>
  #include <glib.h>
  
  #ifdef HAVE_ARPA_INET_H
  #include <arpa/inet.h>
  #endif
  #include <sys/types.h>
  #ifdef HAVE_SYS_SOCKET_H
  #include <sys/socket.h>
  #endif
  #ifdef HAVE_SYS_SOCKIO_H
  #include <sys/sockio.h>
  #endif
  
  #ifdef HAVE_NETINET_IN_H
  #include <netinet/in.h>
  #endif
  
  #ifdef HOST_WIN32
  #include <winsock2.h>
  #include <ws2tcpip.h>
  #endif
  
  #include <mono/utils/mono-compiler.h>
  
  typedef enum {
  	MONO_HINT_UNSPECIFIED		= 0,
  	MONO_HINT_IPV4				= 1,
  	MONO_HINT_IPV6				= 2,
  	MONO_HINT_CANONICAL_NAME	= 4,
  	MONO_HINT_CONFIGURED_ONLY	= 8,
  } MonoGetAddressHints;
  
  typedef struct _MonoAddressEntry MonoAddressEntry;
  
  struct _MonoAddressEntry {
  	int family;
  	int socktype;
  	int protocol;
  	int address_len;
  	union {
  		struct in_addr v4;
  #ifdef HAVE_STRUCT_SOCKADDR_IN6
  		struct in6_addr v6;
  #endif
  	} address;
  	const char *canonical_name;
  	MonoAddressEntry *next;
  };
  
  typedef struct {
  	MonoAddressEntry *entries;
  	char **aliases;
  } MonoAddressInfo;
  
  typedef union {
  	struct sockaddr_in v4;
  #ifdef HAVE_STRUCT_SOCKADDR_IN6
  	struct sockaddr_in6 v6;
  #endif
  	struct sockaddr addr;
  } MonoSocketAddress;
  
  typedef struct {
  	int family;
  	union {
  		struct in_addr v4;
  #ifdef HAVE_STRUCT_SOCKADDR_IN6
  		struct in6_addr v6;
  #endif
  	} addr;
  } MonoAddress;
  
  /* This only supports IPV4 / IPV6 and tcp */
  int mono_get_address_info (const char *hostname, int port, int flags, MonoAddressInfo **res);
  
  void mono_free_address_info (MonoAddressInfo *ai);
  
  void mono_socket_address_init (MonoSocketAddress *sa, socklen_t *len, int family, const void *address, int port);
  
  void *mono_get_local_interfaces (int family, int *interface_count);
  
  #ifndef HAVE_INET_PTON
  int inet_pton (int family, const char *address, void *inaddrp);
  #endif
  
  void mono_address_init (MonoAddress *out_addr, int family, void *in_addr);
  int mono_address_size_for_family (int family);
  gboolean mono_networking_addr_to_str (MonoAddress *address, char *buffer, socklen_t buflen);
  
  int mono_networking_get_tcp_protocol (void);
  int mono_networking_get_ip_protocol (void);
  int mono_networking_get_ipv6_protocol (void);
  
  void mono_networking_init (void);
  void mono_networking_shutdown (void);
  
  
  #endif
  