Re: [kgio] Fixes for OpenBSD
- From:
- Eric Wong
- Date:
- 2011-05-05 @ 19:35
Jeremy Evans <code@jeremyevans.net> wrote:
> 1) Failure:
> test_wait_writable_set(TestKgioTcpConnect) [test/test_tcp_connect.rb:69]:
> <"waited"> expected but was
> <nil>.
Ah, some TCP stacks may optimize loopback connections so non-blocking
connect() won't return with EAGAIN (like with Unix sockets). I'll just
disable the test on non-Linux.
> Hope this helps,
Thank you very much for your feedback :)
--
Eric Wong
Re: [kgio] Fixes for OpenBSD
- From:
- Eric Wong
- Date:
- 2011-05-05 @ 18:45
Jeremy Evans <code@jeremyevans.net> wrote:
<snip> other changes look fine
> getaddrinfo gives an error if you use AF_UNSPEC as the ai_family,
> the man page says PF_UNSPEC should be used. And other entries
> in hints need to be 0 or NULL.
I'm not sure why OpenBSD differs from POSIX here:
http://pubs.opengroup.org/onlinepubs/009695399/functions/getaddrinfo.html
Even though PF_UNSPEC == AF_UNSPEC in most systems, I'd rather go with
the following patch and single out OpenBSD (and maybe other *BSDs) since
"AF_" (address family) makes more sense than "PF_" (protocol family):
diff --git a/ext/kgio/connect.c b/ext/kgio/connect.c
index 3b40054..e4ee9fb 100644
--- a/ext/kgio/connect.c
+++ b/ext/kgio/connect.c
@@ -1,6 +1,21 @@
#include "kgio.h"
#include "sock_for_fd.h"
+/*
+ * OpenBSD getaddrinfo() requires PF_UNSPEC, but POSIX (and Linux) docs
+ * say AF_UNSPEC. AF_UNSPEC is typically PF_UNSPEC anyways, but apparently
+ * OpenBSD differs.
+ *
+ *
http://www.openbsd.org/cgi-bin/man.cgi?query=getaddrinfo&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html
+ * http://pubs.opengroup.org/onlinepubs/009695399/functions/getaddrinfo.html
+ */
+#if defined(__OpenBSD__)
+# if defined(AF_UNSPEC)
+# undef AF_UNSPEC
+# endif
+# define AF_UNSPEC PF_UNSPEC
+#endif
+
static void close_fail(int fd, const char *msg)
{
int saved_errno = errno;
@@ -69,6 +84,7 @@ static VALUE tcp_connect(VALUE klass, VALUE ip, VALUE
port, int io_wait)
rc = snprintf(ipport, sizeof(ipport), "%u", uport);
if (rc >= (int)sizeof(ipport) || rc <= 0)
rb_raise(rb_eArgError, "invalid TCP port: %u", uport);
+ memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
--
Eric Wong
Re: [kgio] Fixes for OpenBSD
- From:
- Jeremy Evans
- Date:
- 2011-05-05 @ 19:29
> I'm not sure why OpenBSD differs from POSIX here:
> http://pubs.opengroup.org/onlinepubs/009695399/functions/getaddrinfo.html
>
> Even though PF_UNSPEC == AF_UNSPEC in most systems, I'd rather go with
> the following patch and single out OpenBSD (and maybe other *BSDs) since
> "AF_" (address family) makes more sense than "PF_" (protocol family):
It looks like the AF_UNSPEC -> PF_UNSPEC is not necessary, they must be
defined to the same thing. Why the OpenBSD man page recommends
PF_UNSPEC, I'm not sure. It looks like the memset was the necessary
fix.
Thanks,
Jeremy
Re: [kgio] Fixes for OpenBSD
- From:
- Eric Wong
- Date:
- 2011-05-05 @ 19:33
Jeremy Evans <code@jeremyevans.net> wrote:
> > I'm not sure why OpenBSD differs from POSIX here:
> > http://pubs.opengroup.org/onlinepubs/009695399/functions/getaddrinfo.html
> >
> > Even though PF_UNSPEC == AF_UNSPEC in most systems, I'd rather go with
> > the following patch and single out OpenBSD (and maybe other *BSDs) since
> > "AF_" (address family) makes more sense than "PF_" (protocol family):
>
> It looks like the AF_UNSPEC -> PF_UNSPEC is not necessary, they must be
> defined to the same thing. Why the OpenBSD man page recommends
> PF_UNSPEC, I'm not sure. It looks like the memset was the necessary
> fix.
OK, thanks!
--
Eric Wong