Index: trunk/include/samhain.h
===================================================================
--- trunk/include/samhain.h	(revision 294)
+++ trunk/include/samhain.h	(revision 295)
@@ -34,4 +34,28 @@
  **************************************************/
 
+/* IPv6 */
+#if defined(HAVE_GETNAMEINFO) && defined(HAVE_GETADDRINFO)
+
+#if defined(SH_COMPILE_STATIC) && defined(__linux__)
+#undef USE_IPVX
+#define SH_SOCKMAX 1
+#else
+
+#if defined(USE_IPV4)
+#undef USE_IPVX
+#else
+#define USE_IPVX 1
+#endif
+
+#define SH_SOCKMAX 8
+#endif
+
+#else
+#undef USE_IPVX
+#define SH_SOCKMAX 1
+#endif
+
+/* end IPv6 */
+
 #define REPLACE_OLD
 
@@ -39,5 +63,5 @@
  * IPv6 is 8 groups of 4 hex digits seperated by colons.
  */
-#define SH_IP_BUF        40
+#define SH_IP_BUF        48
 #define SH_MINIBUF       64
 #define SH_BUFSIZE     1024
Index: trunk/include/sh_calls.h
===================================================================
--- trunk/include/sh_calls.h	(revision 294)
+++ trunk/include/sh_calls.h	(revision 295)
@@ -35,7 +35,9 @@
 int sh_aud_set_functions(const char * str_s);
 
+#ifdef SH_IPVX_H
+long int retry_accept(const char * file, int line, 
+		      int fd, struct sh_sockaddr *serv_addr, int * addrlen);
+#endif
 
-long int retry_accept(const char * file, int line, 
-		      int fd, struct sockaddr *serv_addr, int * addrlen);
 long int retry_stat (const char * file, int line, 
 		     const char *file_name, struct stat *buf);
Index: trunk/include/sh_ipvx.h
===================================================================
--- trunk/include/sh_ipvx.h	(revision 295)
+++ trunk/include/sh_ipvx.h	(revision 295)
@@ -0,0 +1,75 @@
+#ifndef SH_IPVX_H
+#define SH_IPVX_H
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#if defined(USE_IPVX)
+#define SH_SSP_LEN(a) ((a)->ss_family == AF_INET) ? \
+	sizeof(struct sockaddr_in) : \
+	sizeof(struct sockaddr_in6)
+
+#define SH_SS_LEN(a) ((a).ss_family == AF_INET) ? \
+	sizeof(struct sockaddr_in) : \
+	sizeof(struct sockaddr_in6)
+#else
+#define SH_SSP_LEN(a) sizeof(struct sockaddr_in)
+#define SH_SS_LEN(a)  sizeof(struct sockaddr_in)
+#endif
+
+struct sh_sockaddr {
+  int ss_family;
+
+  struct sockaddr_in  sin;
+#if defined(USE_IPVX)
+  struct sockaddr_in6 sin6;
+#endif
+};
+
+/* Cast a sockaddress
+ */
+struct sockaddr * sh_ipvx_sockaddr_cast (struct sh_sockaddr * ss);
+
+/* Compare with any_address
+ */
+int sh_ipvx_isany (struct sh_sockaddr * a);
+
+/* Compare two addresses
+ */
+int sh_ipvx_cmp(struct sh_sockaddr * a, struct sh_sockaddr * b);
+
+/* Set the port
+ */
+int sh_ipvx_set_port(struct sh_sockaddr * ss, int port);
+
+/* Save a sockaddress
+ */
+void sh_ipvx_save(struct sh_sockaddr * ss, int sa_family, struct sockaddr * sa);
+
+/* Determine whether the given address is numeric
+ */
+int sh_ipvx_is_numeric (const char * addr);
+
+/* Convert a network address to an ascii numeric address
+ */
+int sh_ipvx_ntoa (char * name, size_t name_size, struct sh_sockaddr * ss);
+
+/* Convert an ascii numeric address to a network address
+ */
+int sh_ipvx_aton (const char * name, struct sh_sockaddr * ss);
+
+/* Try to find canonical hostname
+ */
+char * sh_ipvx_canonical(const char * hostname, char * numeric, size_t nlen);
+
+/* Convert address to hostname
+ */
+char * sh_ipvx_addrtoname(struct sh_sockaddr * ss);
+
+/* Try a reverse lookup
+ */
+int sh_ipvx_reverse_check_ok (char * peer, int port, struct sh_sockaddr * ss);
+#endif
Index: trunk/include/sh_tools.h
===================================================================
--- trunk/include/sh_tools.h	(revision 294)
+++ trunk/include/sh_tools.h	(revision 295)
@@ -28,5 +28,5 @@
  */
 char * sh_tools_safe_name(const char * str, int flag);
-int is_numeric (const char * address);
+
 int connect_port (char * address, int port, 
 		  char * ecall, int * errnum, char * errmsg, int errsiz);
