diff --git a/src/ChangeLog b/src/ChangeLog index 028c0e86..49670ff5 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2003-11-13 Hrvoje Niksic + + * init.c (defaults): Turn on opt.ipv4_only if we're compiling with + IPv6, and AI_ADDRINFO is not available, and AF_INET6 sockets can't + be created. + 2003-11-13 Hrvoje Niksic * host.c (lookup_host): Document the fact that the addresses are diff --git a/src/init.c b/src/init.c index 182c0648..74e49cc1 100644 --- a/src/init.c +++ b/src/init.c @@ -304,6 +304,29 @@ defaults (void) opt.restrict_files_os = restrict_windows; #endif opt.restrict_files_ctrl = 1; + +#ifdef ENABLE_IPV6 +# ifndef HAVE_GETADDRINFO_AI_ADDRCONFIG + /* If IPv6 is enabled, but AI_ADDRCONFIG is missing, check whether + we can create AF_INET6 sockets. If we can't, turn on the + --inet4-only setting. This is necessary because on some systems + (e.g. RHL 9) getaddrinfo resolves AAAA records, but socket() + can't even create an AF_INET6 socket, let alone connect to IPv6 + hosts. To avoid "address family not supported" error messages, + we set ipv4_only. + + We do it as early as here, so that the user can revert the + settingn using --no-inet4-only, in case he wants to see the error + messages, for whatever reason. */ + { + int sock = socket (AF_INET6, SOCK_STREAM, 0); + if (sock < 0) + opt.ipv4_only = 1; + else + close (sock); + } +# endif /* not HAVE_GETADDRINFO_AI_ADDRCONFIG */ +#endif /* ENABLE_IPV6 */ } /* Return the user's home directory (strdup-ed), or NULL if none is