FIx a bug where the remote IMAP server has a AAAA record but there's
no IPv6 connectivity from the client to that site. Prior to this fix, the fallback to IPv4 wasn't working properly. (The fix should be in the next release of libetpan.)
This commit is contained in:
parent
1d6e2a6afe
commit
8c8141dc18
3 changed files with 70 additions and 3 deletions
|
@ -1,8 +1,8 @@
|
||||||
# $NetBSD: Makefile,v 1.16 2008/01/18 05:08:26 tnn Exp $
|
# $NetBSD: Makefile,v 1.17 2008/01/25 18:26:31 smb Exp $
|
||||||
#
|
#
|
||||||
|
|
||||||
DISTNAME= libetpan-0.52
|
DISTNAME= libetpan-0.52
|
||||||
PKGREVISION= 2
|
PKGREVISION= 3
|
||||||
CATEGORIES= mail
|
CATEGORIES= mail
|
||||||
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=libetpan/}
|
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=libetpan/}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
$NetBSD: distinfo,v 1.8 2007/10/27 13:55:27 wiz Exp $
|
$NetBSD: distinfo,v 1.9 2008/01/25 18:26:32 smb Exp $
|
||||||
|
|
||||||
SHA1 (libetpan-0.52.tar.gz) = e2fdf76b471e57a153bad4c4def7fde512385021
|
SHA1 (libetpan-0.52.tar.gz) = e2fdf76b471e57a153bad4c4def7fde512385021
|
||||||
RMD160 (libetpan-0.52.tar.gz) = 3e826d57987780b204c9074a9c225e960f214d66
|
RMD160 (libetpan-0.52.tar.gz) = 3e826d57987780b204c9074a9c225e960f214d66
|
||||||
Size (libetpan-0.52.tar.gz) = 1611405 bytes
|
Size (libetpan-0.52.tar.gz) = 1611405 bytes
|
||||||
SHA1 (patch-aa) = e783adf544c9a63df584815ee4b033249cecf0ff
|
SHA1 (patch-aa) = e783adf544c9a63df584815ee4b033249cecf0ff
|
||||||
|
SHA1 (patch-af) = f7f6977a0bdd709eaba1efed216eee6a3a0f542b
|
||||||
|
|
66
mail/libetpan/patches/patch-af
Normal file
66
mail/libetpan/patches/patch-af
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
$NetBSD: patch-af,v 1.1 2008/01/25 18:26:32 smb Exp $
|
||||||
|
|
||||||
|
--- src/data-types/connect.c.orig 2007-08-06 17:32:30.000000000 -0400
|
||||||
|
+++ src/data-types/connect.c 2008-01-25 13:15:13.000000000 -0500
|
||||||
|
@@ -88,6 +88,21 @@
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef HAVE_IPV6
|
||||||
|
+static int verify_sock_errors(int s)
|
||||||
|
+{
|
||||||
|
+ uint len;
|
||||||
|
+ int val;
|
||||||
|
+ len = sizeof(val);
|
||||||
|
+ if (getsockopt(s, SOL_SOCKET, SO_ERROR, &val, &len) < 0) {
|
||||||
|
+ return -1;
|
||||||
|
+ } else if (val != 0) {
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
static int wait_connect(int s, int r)
|
||||||
|
{
|
||||||
|
fd_set fds;
|
||||||
|
@@ -206,6 +221,7 @@
|
||||||
|
|
||||||
|
for (ai = res; ai != NULL; ai = ai->ai_next) {
|
||||||
|
s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
|
||||||
|
+
|
||||||
|
if (s == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
@@ -239,9 +255,23 @@
|
||||||
|
|
||||||
|
r = connect(s, ai->ai_addr, ai->ai_addrlen);
|
||||||
|
r = wait_connect(s, r);
|
||||||
|
+
|
||||||
|
+ if (r != -1) {
|
||||||
|
+ r = verify_sock_errors(s);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (r == -1) {
|
||||||
|
+ if (ai->ai_next) {
|
||||||
|
+#ifdef WIN32
|
||||||
|
+ closesocket(s);
|
||||||
|
+#else
|
||||||
|
+ close(s);
|
||||||
|
+#endif
|
||||||
|
+ continue;
|
||||||
|
+ } else {
|
||||||
|
goto close_socket;
|
||||||
|
}
|
||||||
|
+ }
|
||||||
|
/* if we're here, we're good */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
@@ -252,7 +282,6 @@
|
||||||
|
if (ai == NULL)
|
||||||
|
goto err;
|
||||||
|
#endif
|
||||||
|
-
|
||||||
|
return s;
|
||||||
|
|
||||||
|
close_socket:
|
Loading…
Reference in a new issue