2013-09-26 17:14:40 +02:00

142 lines
2.8 KiB
Plaintext

$NetBSD: patch-ag,v 1.5 2001/03/10 22:05:54 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;