Index: trunk/src/sh_ipvx.c
===================================================================
--- trunk/src/sh_ipvx.c	(revision 313)
+++ trunk/src/sh_ipvx.c	(revision 314)
@@ -61,5 +61,5 @@
 	( c < 'a' || c > 'f' ) &&
 	( c < 'A' || c > 'F' ) &&
-	( c != ':'))
+	( c != ':') && ( c != '.'))
       return (1 == 0);
   }
@@ -132,12 +132,21 @@
 			name, name_size, NULL, 0, NI_NUMERICHOST);
 
-  if (ret != 0)
-    {
-      if (name_size > 7) {
-	name[0] = '0'; name[1] = '.'; name[2] = '0'; name[3] = '.'; 
-	name[4] = '0'; name[5] = '.'; name[6] = '0'; name[7] = '\0';
-      } else if (name_size > 0) {
-	name[0] = '\0';
-      }
+
+  /* fprintf(stderr, "FIXME: Error %s (%d), name %s (%d)\n", 
+     gai_strerror(ret), ret, name, name_size); */
+
+  if (ret != 0 && name_size > 0)
+    {
+      name[name_size-1] = '\0';
+
+      if (!sh_ipvx_is_numeric(name))
+	{
+	  if (name_size > 7) {
+	    name[0] = '0'; name[1] = '.'; name[2] = '0'; name[3] = '.'; 
+	    name[4] = '0'; name[5] = '.'; name[6] = '0'; name[7] = '\0';
+	  } else {
+	    name[0] = '\0';
+	  }
+	}
     } 
   return ret;
@@ -158,4 +167,14 @@
 }
 
+char * sh_ipvx_print_sockaddr (struct sockaddr * sa, int sa_family)
+{
+  struct sh_sockaddr ss;
+  static char ipbuf[SH_IP_BUF];
+
+  sh_ipvx_save(&ss, sa_family, sa);
+  sh_ipvx_ntoa (ipbuf, sizeof(ipbuf), &ss);
+  return ipbuf;
+}
+
 void sh_ipvx_save(struct sh_sockaddr * ss, int sa_family, struct sockaddr * sa)
 {
@@ -166,10 +185,10 @@
     case AF_INET:
       ss->ss_family = AF_INET;
-      memcpy(&(ss->sin), sa, sizeof(struct sockaddr_in));
+      memcpy(&(ss->sin), (struct sockaddr_in*) sa, sizeof(struct sockaddr_in));
       break;
 #if defined(USE_IPVX)
     case AF_INET6:
       ss->ss_family = AF_INET6;
-      memcpy(&(ss->sin6), sa, sizeof(struct sockaddr_in6));
+      memcpy(&(ss->sin6), (struct sockaddr_in6*) sa, sizeof(struct sockaddr_in6));
       break;
 #endif
@@ -198,4 +217,24 @@
   return 0;
 #endif
+}
+
+int sh_ipvx_get_port(struct sockaddr * sa, int sa_family)
+{
+  int port = 0;
+#if defined(USE_IPVX)
+
+  switch (sa_family)
+    {
+    case AF_INET:
+      port = ntohs(((struct sockaddr_in *)sa)->sin_port);
+      break;
+    case AF_INET6:
+      port = ntohs(((struct sockaddr_in6 *)sa)->sin6_port);
+      break;
+    }
+#else
+  port = ntohs(((struct sockaddr_in *)sa).sin_port);
+#endif
+  return port;
 }
 
