Date: Wed, 30 Sep 2015 01:51:56 +0300 From: Dmitry Sivachenko <trtrmitya@gmail.com> To: FreeBSD Net <freebsd-net@freebsd.org> Subject: getaddrinfo() question Message-ID: <F5AD2BAC-7927-46CA-A52C-287685DD4260@gmail.com>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hello!
I have a machine (FreeBSD-10/stable) with both ipv4 and ipv6 addresses configured.
Also I have ip6addrctl_policy="ipv4_prefer" in rc.conf.
I am trying to resolve a hostname which has both A and AAAA records and I expect getaddrinfo() to return A record because of ipv4_prefer.
I am running a sample program attached.
When I use hints.ai_flags = AI_PASSIVE flag, the program prints "AF_INET6" (why?), if I change that line to hints.ai_flags = 0; it printf "AF_INET" (as expected).
Can you please explain why AI_PASSIVE makes a difference?
On FreeBSD, the manual page is unclear about the behavior when hostname is not NULL and AI_PASSIVE is used, but on Linux it explicitly states that
"If node is not NULL, then the AI_PASSIVE flag is ignored."
Thanks!
[-- Attachment #2 --]
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
int main() {
struct addrinfo hints, *result;
const char* host = "wfe0.ysv.freebsd.org";
memset(&result, 0, sizeof(result));
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
hints.ai_protocol = 0;
if (getaddrinfo(host, NULL, &hints, &result) == 0) {
switch (result->ai_family) {
case AF_INET:
printf("AF_INET\n");
break;
case AF_INET6:
printf("AF_INET6\n");
break;
}
}
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?F5AD2BAC-7927-46CA-A52C-287685DD4260>
