$NetBSD: patch-ag,v 1.4 2001/02/24 22:40:40 tron Exp $

--- src/sysdeps.c.orig	Tue Dec 29 11:46:52 1998
+++ src/sysdeps.c	Sat Feb 24 23:31:43 2001
@@ -20,8 +20,8 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
-#include "server.h"
 #include "sysdeps.h"
+#include "server.h"
 
 #undef  PURIFY_HACK
 /*#define PURIFY_HACK*/
@@ -96,6 +96,9 @@
 #ifdef EINPROGRESS
 	    err_no == EINPROGRESS ||
 #endif
+#ifdef EALREADY
+	    err_no == EALREADY ||
+#endif
 	    err_no == EAGAIN);
 }
 
@@ -256,10 +259,12 @@
 
 /***********************************************************************/
 
+#if !defined(USE_INET6)
 struct SERV_ADDR {
     struct in_addr	addr;
     unsigned short	port;
 };
+#endif
 
 /*
  * host:	either "hostname:port" or "ip.ip.ip.ip:port",
@@ -271,6 +276,28 @@
  */
 SERV_ADDR *get_host(char *host, unsigned short def_port, int byte_swap)
 {
+#if defined(USE_INET6)
+    char		*c, *port, buffer[6];
+    struct addrinfo	hints, *res;
+
+    port = 0;
+    c = strrchr(host, ':');
+    if (c) {
+	*c = '\0';
+	if (c[1] >= '0' && c[1] <= '9')
+	    port = c + 1;
+    }
+    if (!port) {
+	sprintf(buffer, "%d", def_port);
+	port = buffer;
+    }
+
+    memset(&hints, '\0', sizeof(hints));
+    hints.ai_family = AF_UNSPEC;
+    hints.ai_socktype = SOCK_STREAM;
+    hints.ai_protocol = 0;
+    return getaddrinfo(host, port, &hints, &res) ? NULL : res;
+#else
     SERV_ADDR		*ret;
     struct in_addr	addr;
     unsigned short	port;
@@ -332,14 +359,38 @@
     ret->port = port;
 
     return ret;
+#endif
 }
 
-int open_socket(void)
+SERV_ADDR *next_addr(SERV_ADDR *addr)
+
+{
+#ifdef USE_INET6
+    return addr->ai_next;
+#else
+    return NULL;
+#endif
+}
+void free_addr(SERV_ADDR *addr)
+
+{
+#ifdef USE_INET6
+    freeaddrinfo(addr);
+#else
+    XtFree((char *)addr);
+#endif
+}
+
+int open_socket(SERV_ADDR *addr)
 {
     int	fd, tmp;
 
     do {
-	fd = socket(PF_INET, SOCK_STREAM, 0);
+#ifdef USE_INET6
+	fd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
+#else
+	fd = socket(AF_INET, SOCK_STREAM, 0);
+#endif
     } while (fd < 0 && errno == EINTR);
 
     if (fd < 0) {
@@ -372,8 +423,15 @@
 
 int connect_socket(int fd, SERV_ADDR *addr)
 {
-    struct sockaddr_in	serv_addr;
     int			tmp;
+#ifdef USE_INET6
+    do {
+	tmp = connect(fd, addr->ai_addr, addr->ai_addrlen);
+    } while (tmp < 0 && errno == EINTR);
+
+    return tmp;
+#else
+    struct sockaddr_in	serv_addr;
 
     if (!addr) {
 	fputs("knews: connect_socket: addr is NULL!!!\n", stderr);
@@ -390,6 +448,7 @@
     } while (tmp < 0 && errno == EINTR);
 
     return tmp;
+#endif
 }
 
 #if 0 /* Misc stuff for ftp routines */
@@ -548,7 +607,7 @@
 char *get_mailhostname(void)
 {
     struct utsname	  un = {{0,},};
-    char		 *host = NULL, *domain;
+    char		 *host = NULL;
 
 #ifdef PURIFY_HACK
     return NULL;
