git: a709d15529b3 - main - libc/tests: getaddrinfo_test: test both IPv4 and IPv6 preferred policies

From: Gleb Smirnoff <glebius_at_FreeBSD.org>
Date: Tue, 08 Apr 2025 17:34:57 UTC
The branch main has been updated by glebius:

URL: https://cgit.FreeBSD.org/src/commit/?id=a709d15529b3dd8479f2a642b4d0e65e09d0515e

commit a709d15529b3dd8479f2a642b4d0e65e09d0515e
Author:     K Rin <rin@sandb0x.tw>
AuthorDate: 2025-04-06 00:27:19 +0000
Commit:     Gleb Smirnoff <glebius@FreeBSD.org>
CommitDate: 2025-04-08 16:53:15 +0000

    libc/tests: getaddrinfo_test: test both IPv4 and IPv6 preferred policies
---
 lib/libc/tests/net/getaddrinfo/Makefile            |  15 +
 .../tests/net/getaddrinfo/data/basics_v4_only.exp  |  50 ++++
 .../net/getaddrinfo/data/basics_v4v6_prefer_v4.exp |  50 ++++
 .../net/getaddrinfo/data/generate_testdata.sh      |  45 +++
 .../tests/net/getaddrinfo/data/no_host_v4_only.exp |  68 +++++
 .../getaddrinfo/data/no_host_v4v6_prefer_v4.exp    |  68 +++++
 .../tests/net/getaddrinfo/data/no_serv_v4_only.exp |  20 ++
 .../getaddrinfo/data/no_serv_v4v6_prefer_v4.exp    |  20 ++
 .../tests/net/getaddrinfo/data/scoped_v4_only.exp  |   5 +
 .../net/getaddrinfo/data/scoped_v4v6_prefer_v4.exp |   5 +
 .../net/getaddrinfo/data/sock_raw_v4_only.exp      |  15 +
 .../getaddrinfo/data/sock_raw_v4v6_prefer_v4.exp   |  15 +
 .../net/getaddrinfo/data/spec_fam_v4_only.exp      |  10 +
 .../getaddrinfo/data/spec_fam_v4v6_prefer_v4.exp   |  10 +
 .../net/getaddrinfo/data/unsup_fam_v4_only.exp     |   2 +
 .../getaddrinfo/data/unsup_fam_v4v6_prefer_v4.exp  |   2 +
 lib/libc/tests/net/getaddrinfo/t_getaddrinfo.sh    | 324 ++++++++++++++++++---
 17 files changed, 682 insertions(+), 42 deletions(-)

diff --git a/lib/libc/tests/net/getaddrinfo/Makefile b/lib/libc/tests/net/getaddrinfo/Makefile
index 0b2a06785ade..47d945a52c6e 100644
--- a/lib/libc/tests/net/getaddrinfo/Makefile
+++ b/lib/libc/tests/net/getaddrinfo/Makefile
@@ -15,17 +15,32 @@ ${PACKAGE}DATA_FILESPACKAGE=	tests
 ${PACKAGE}DATA_FILESDIR=	${TESTSDIR}/data
 
 ${PACKAGE}DATA_FILES+=          data/basics_v4.exp
+${PACKAGE}DATA_FILES+=          data/basics_v4_only.exp
 ${PACKAGE}DATA_FILES+=          data/basics_v4v6.exp
+${PACKAGE}DATA_FILES+=          data/basics_v4v6_prefer_v4.exp
 ${PACKAGE}DATA_FILES+=          data/no_host_v4.exp
+${PACKAGE}DATA_FILES+=          data/no_host_v4_only.exp
 ${PACKAGE}DATA_FILES+=          data/no_host_v4v6.exp
+${PACKAGE}DATA_FILES+=          data/no_host_v4v6_prefer_v4.exp
 ${PACKAGE}DATA_FILES+=          data/no_serv_v4.exp
+${PACKAGE}DATA_FILES+=          data/no_serv_v4_only.exp
 ${PACKAGE}DATA_FILES+=          data/no_serv_v4v6.exp
+${PACKAGE}DATA_FILES+=          data/no_serv_v4v6_prefer_v4.exp
 ${PACKAGE}DATA_FILES+=          data/scoped.exp
+${PACKAGE}DATA_FILES+=          data/scoped_v4_only.exp
+${PACKAGE}DATA_FILES+=          data/scoped_v4v6_prefer_v4.exp
 ${PACKAGE}DATA_FILES+=          data/sock_raw_v4.exp
+${PACKAGE}DATA_FILES+=          data/sock_raw_v4_only.exp
 ${PACKAGE}DATA_FILES+=          data/sock_raw_v4v6.exp
+${PACKAGE}DATA_FILES+=          data/sock_raw_v4v6_prefer_v4.exp
 ${PACKAGE}DATA_FILES+=          data/spec_fam_v4.exp
+${PACKAGE}DATA_FILES+=          data/spec_fam_v4_only.exp
 ${PACKAGE}DATA_FILES+=          data/spec_fam_v4v6.exp
+${PACKAGE}DATA_FILES+=          data/spec_fam_v4v6_prefer_v4.exp
 ${PACKAGE}DATA_FILES+=          data/unsup_fam.exp
+${PACKAGE}DATA_FILES+=          data/unsup_fam_v4_only.exp
+${PACKAGE}DATA_FILES+=          data/unsup_fam_v4v6_prefer_v4.exp
+
 
 .include "../../Makefile.netbsd-tests"
 
diff --git a/lib/libc/tests/net/getaddrinfo/data/basics_v4_only.exp b/lib/libc/tests/net/getaddrinfo/data/basics_v4_only.exp
new file mode 100644
index 000000000000..0a37d3212649
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/basics_v4_only.exp
@@ -0,0 +1,50 @@
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv http
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv http
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv http
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv http
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv http
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv http
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv http
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv http
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv http
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv http
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv http
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv http
+ai4: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv http
+ai5: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv http
+ai6: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv http
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv tftp
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv tftp
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv tftp
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv tftp
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv tftp
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv tftp
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv tftp
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv tftp
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv tftp
+ai3: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv tftp
+ai4: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv tftp
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv echo
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv echo
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv echo
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv echo
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv echo
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv echo
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv echo
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv echo
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv echo
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv echo
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv echo
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv echo
+ai4: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv echo
+ai5: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv echo
+ai6: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv echo
+
diff --git a/lib/libc/tests/net/getaddrinfo/data/basics_v4v6_prefer_v4.exp b/lib/libc/tests/net/getaddrinfo/data/basics_v4v6_prefer_v4.exp
new file mode 100644
index 000000000000..0a37d3212649
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/basics_v4v6_prefer_v4.exp
@@ -0,0 +1,50 @@
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv http
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv http
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv http
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv http
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv http
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv http
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv http
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv http
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv http
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv http
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv http
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv http
+ai4: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv http
+ai5: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv http
+ai6: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv http
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv tftp
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv tftp
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv tftp
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv tftp
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv tftp
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv tftp
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv tftp
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv tftp
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv tftp
+ai3: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv tftp
+ai4: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv tftp
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv echo
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv echo
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv echo
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv echo
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv echo
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv echo
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv echo
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv echo
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv echo
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv echo
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv echo
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv echo
+ai4: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv echo
+ai5: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv echo
+ai6: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv echo
+
diff --git a/lib/libc/tests/net/getaddrinfo/data/generate_testdata.sh b/lib/libc/tests/net/getaddrinfo/data/generate_testdata.sh
new file mode 100755
index 000000000000..f0425a3b0283
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/generate_testdata.sh
@@ -0,0 +1,45 @@
+#service ip6addrctl prefer_ipv4
+TEST=./h_gai
+family=v4_only
+
+( $TEST ::1 http
+  $TEST 127.0.0.1 http
+  $TEST localhost http
+  $TEST ::1 tftp
+  $TEST 127.0.0.1 tftp
+  $TEST localhost tftp
+  $TEST ::1 echo
+  $TEST 127.0.0.1 echo
+  $TEST localhost echo ) > basics_${family}.exp
+
+( $TEST -4 localhost http
+  $TEST -6 localhost http ) > spec_fam_${family}.exp
+
+( $TEST '' http
+  $TEST '' echo
+  $TEST '' tftp
+  $TEST '' 80
+  $TEST -P '' http
+  $TEST -P '' echo
+  $TEST -P '' tftp
+  $TEST -P '' 80
+  $TEST -S '' 80
+  $TEST -D '' 80 ) > no_host_${family}.exp
+
+( $TEST ::1 ''
+  $TEST 127.0.0.1 ''
+  $TEST localhost ''
+  $TEST '' '' ) > no_serv_${family}.exp
+
+( $TEST -R -p 0 localhost ''
+  $TEST -R -p 59 localhost ''
+  $TEST -R -p 59 localhost 80
+  $TEST -R -p 59 localhost www
+  $TEST -R -p 59 ::1 '' ) > sock_raw_${family}.exp
+
+( $TEST -f 99 localhost '' ) > unsup_fam_${family}.exp
+
+( $TEST fe80::1%lo0 http
+#	  IF=`ifconfig -a | grep -v '^	' | sed -e 's/:.*//' | head -1 | awk '{print $1}'`
+#	  $TEST fe80::1%$IF http
+) > scoped_${family}.exp
diff --git a/lib/libc/tests/net/getaddrinfo/data/no_host_v4_only.exp b/lib/libc/tests/net/getaddrinfo/data/no_host_v4_only.exp
new file mode 100644
index 000000000000..596799305117
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/no_host_v4_only.exp
@@ -0,0 +1,68 @@
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv http
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv http
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv http
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv http
+ai4: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv http
+ai5: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv http
+ai6: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv http
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv echo
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv echo
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv echo
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv echo
+ai4: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv echo
+ai5: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv echo
+ai6: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv echo
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv tftp
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv tftp
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv tftp
+ai3: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv tftp
+ai4: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv tftp
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv 80
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv http
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv http
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv http
+ai4: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv http
+ai5: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv http
+ai6: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv http
+
+arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv http
+ai1: flags 0x3 family 28 socktype 2 protocol 17 addrlen 28 host :: serv http
+ai2: flags 0x3 family 28 socktype 1 protocol 6 addrlen 28 host :: serv http
+ai3: flags 0x3 family 28 socktype 5 protocol 132 addrlen 28 host :: serv http
+ai4: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv http
+ai5: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv http
+ai6: flags 0x3 family 2 socktype 5 protocol 132 addrlen 16 host 0.0.0.0 serv http
+
+arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv echo
+ai1: flags 0x3 family 28 socktype 2 protocol 17 addrlen 28 host :: serv echo
+ai2: flags 0x3 family 28 socktype 1 protocol 6 addrlen 28 host :: serv echo
+ai3: flags 0x3 family 28 socktype 5 protocol 132 addrlen 28 host :: serv echo
+ai4: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv echo
+ai5: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv echo
+ai6: flags 0x3 family 2 socktype 5 protocol 132 addrlen 16 host 0.0.0.0 serv echo
+
+arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv tftp
+ai1: flags 0x3 family 28 socktype 2 protocol 17 addrlen 28 host :: serv tftp
+ai2: flags 0x3 family 28 socktype 1 protocol 6 addrlen 28 host :: serv tftp
+ai3: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv tftp
+ai4: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv tftp
+
+arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv 80
+ai1: flags 0x3 family 28 socktype 2 protocol 17 addrlen 28 host :: serv http
+ai2: flags 0x3 family 28 socktype 1 protocol 6 addrlen 28 host :: serv http
+ai3: flags 0x3 family 28 socktype 5 protocol 132 addrlen 28 host :: serv http
+ai4: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv http
+ai5: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv http
+ai6: flags 0x3 family 2 socktype 5 protocol 132 addrlen 16 host 0.0.0.0 serv http
+
+arg: flags 0x2 family 0 socktype 1 protocol 0 addrlen 0 host (empty) serv 80
+ai1: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv http
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv http
+
+arg: flags 0x2 family 0 socktype 2 protocol 0 addrlen 0 host (empty) serv 80
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv http
+ai2: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv http
+
diff --git a/lib/libc/tests/net/getaddrinfo/data/no_host_v4v6_prefer_v4.exp b/lib/libc/tests/net/getaddrinfo/data/no_host_v4v6_prefer_v4.exp
new file mode 100644
index 000000000000..596799305117
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/no_host_v4v6_prefer_v4.exp
@@ -0,0 +1,68 @@
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv http
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv http
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv http
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv http
+ai4: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv http
+ai5: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv http
+ai6: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv http
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv echo
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv echo
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv echo
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv echo
+ai4: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv echo
+ai5: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv echo
+ai6: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv echo
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv tftp
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv tftp
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv tftp
+ai3: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv tftp
+ai4: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv tftp
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv 80
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv http
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv http
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv http
+ai4: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv http
+ai5: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv http
+ai6: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv http
+
+arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv http
+ai1: flags 0x3 family 28 socktype 2 protocol 17 addrlen 28 host :: serv http
+ai2: flags 0x3 family 28 socktype 1 protocol 6 addrlen 28 host :: serv http
+ai3: flags 0x3 family 28 socktype 5 protocol 132 addrlen 28 host :: serv http
+ai4: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv http
+ai5: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv http
+ai6: flags 0x3 family 2 socktype 5 protocol 132 addrlen 16 host 0.0.0.0 serv http
+
+arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv echo
+ai1: flags 0x3 family 28 socktype 2 protocol 17 addrlen 28 host :: serv echo
+ai2: flags 0x3 family 28 socktype 1 protocol 6 addrlen 28 host :: serv echo
+ai3: flags 0x3 family 28 socktype 5 protocol 132 addrlen 28 host :: serv echo
+ai4: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv echo
+ai5: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv echo
+ai6: flags 0x3 family 2 socktype 5 protocol 132 addrlen 16 host 0.0.0.0 serv echo
+
+arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv tftp
+ai1: flags 0x3 family 28 socktype 2 protocol 17 addrlen 28 host :: serv tftp
+ai2: flags 0x3 family 28 socktype 1 protocol 6 addrlen 28 host :: serv tftp
+ai3: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv tftp
+ai4: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv tftp
+
+arg: flags 0x3 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv 80
+ai1: flags 0x3 family 28 socktype 2 protocol 17 addrlen 28 host :: serv http
+ai2: flags 0x3 family 28 socktype 1 protocol 6 addrlen 28 host :: serv http
+ai3: flags 0x3 family 28 socktype 5 protocol 132 addrlen 28 host :: serv http
+ai4: flags 0x3 family 2 socktype 2 protocol 17 addrlen 16 host 0.0.0.0 serv http
+ai5: flags 0x3 family 2 socktype 1 protocol 6 addrlen 16 host 0.0.0.0 serv http
+ai6: flags 0x3 family 2 socktype 5 protocol 132 addrlen 16 host 0.0.0.0 serv http
+
+arg: flags 0x2 family 0 socktype 1 protocol 0 addrlen 0 host (empty) serv 80
+ai1: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv http
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv http
+
+arg: flags 0x2 family 0 socktype 2 protocol 0 addrlen 0 host (empty) serv 80
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv http
+ai2: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv http
+
diff --git a/lib/libc/tests/net/getaddrinfo/data/no_serv_v4_only.exp b/lib/libc/tests/net/getaddrinfo/data/no_serv_v4_only.exp
new file mode 100644
index 000000000000..0d28490c8d81
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/no_serv_v4_only.exp
@@ -0,0 +1,20 @@
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv (empty)
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv 0
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv 0
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv 0
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv (empty)
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 0
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 0
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv 0
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv (empty)
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 0
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 0
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv 0
+ai4: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv 0
+ai5: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv 0
+ai6: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv 0
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv (empty)
+Name does not resolve
diff --git a/lib/libc/tests/net/getaddrinfo/data/no_serv_v4v6_prefer_v4.exp b/lib/libc/tests/net/getaddrinfo/data/no_serv_v4v6_prefer_v4.exp
new file mode 100644
index 000000000000..0d28490c8d81
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/no_serv_v4v6_prefer_v4.exp
@@ -0,0 +1,20 @@
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host ::1 serv (empty)
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv 0
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv 0
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv 0
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host 127.0.0.1 serv (empty)
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 0
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 0
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv 0
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host localhost serv (empty)
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv 0
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv 0
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv 0
+ai4: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv 0
+ai5: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv 0
+ai6: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv 0
+
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host (empty) serv (empty)
+Name does not resolve
diff --git a/lib/libc/tests/net/getaddrinfo/data/scoped_v4_only.exp b/lib/libc/tests/net/getaddrinfo/data/scoped_v4_only.exp
new file mode 100644
index 000000000000..f5ddb4bf6feb
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/scoped_v4_only.exp
@@ -0,0 +1,5 @@
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host fe80::1%lo0 serv http
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host fe80::1%lo0 serv http
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host fe80::1%lo0 serv http
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host fe80::1%lo0 serv http
+
diff --git a/lib/libc/tests/net/getaddrinfo/data/scoped_v4v6_prefer_v4.exp b/lib/libc/tests/net/getaddrinfo/data/scoped_v4v6_prefer_v4.exp
new file mode 100644
index 000000000000..f5ddb4bf6feb
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/scoped_v4v6_prefer_v4.exp
@@ -0,0 +1,5 @@
+arg: flags 0x2 family 0 socktype 0 protocol 0 addrlen 0 host fe80::1%lo0 serv http
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host fe80::1%lo0 serv http
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host fe80::1%lo0 serv http
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host fe80::1%lo0 serv http
+
diff --git a/lib/libc/tests/net/getaddrinfo/data/sock_raw_v4_only.exp b/lib/libc/tests/net/getaddrinfo/data/sock_raw_v4_only.exp
new file mode 100644
index 000000000000..932c1faab0d3
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/sock_raw_v4_only.exp
@@ -0,0 +1,15 @@
+arg: flags 0x2 family 0 socktype 3 protocol 0 addrlen 0 host localhost serv (empty)
+ai1: flags 0x2 family 2 socktype 3 protocol 0 addrlen 16 host 127.0.0.1 serv 0
+ai2: flags 0x2 family 28 socktype 3 protocol 0 addrlen 28 host ::1 serv 0
+
+arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host localhost serv (empty)
+ai1: flags 0x2 family 2 socktype 3 protocol 59 addrlen 16 host 127.0.0.1 serv 0
+ai2: flags 0x2 family 28 socktype 3 protocol 59 addrlen 28 host ::1 serv 0
+
+arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host localhost serv 80
+Service was not recognized for socket type
+arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host localhost serv www
+Service was not recognized for socket type
+arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host ::1 serv (empty)
+ai1: flags 0x2 family 28 socktype 3 protocol 59 addrlen 28 host ::1 serv 0
+
diff --git a/lib/libc/tests/net/getaddrinfo/data/sock_raw_v4v6_prefer_v4.exp b/lib/libc/tests/net/getaddrinfo/data/sock_raw_v4v6_prefer_v4.exp
new file mode 100644
index 000000000000..932c1faab0d3
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/sock_raw_v4v6_prefer_v4.exp
@@ -0,0 +1,15 @@
+arg: flags 0x2 family 0 socktype 3 protocol 0 addrlen 0 host localhost serv (empty)
+ai1: flags 0x2 family 2 socktype 3 protocol 0 addrlen 16 host 127.0.0.1 serv 0
+ai2: flags 0x2 family 28 socktype 3 protocol 0 addrlen 28 host ::1 serv 0
+
+arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host localhost serv (empty)
+ai1: flags 0x2 family 2 socktype 3 protocol 59 addrlen 16 host 127.0.0.1 serv 0
+ai2: flags 0x2 family 28 socktype 3 protocol 59 addrlen 28 host ::1 serv 0
+
+arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host localhost serv 80
+Service was not recognized for socket type
+arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host localhost serv www
+Service was not recognized for socket type
+arg: flags 0x2 family 0 socktype 3 protocol 59 addrlen 0 host ::1 serv (empty)
+ai1: flags 0x2 family 28 socktype 3 protocol 59 addrlen 28 host ::1 serv 0
+
diff --git a/lib/libc/tests/net/getaddrinfo/data/spec_fam_v4_only.exp b/lib/libc/tests/net/getaddrinfo/data/spec_fam_v4_only.exp
new file mode 100644
index 000000000000..af3506938503
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/spec_fam_v4_only.exp
@@ -0,0 +1,10 @@
+arg: flags 0x2 family 2 socktype 0 protocol 0 addrlen 0 host localhost serv http
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv http
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv http
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv http
+
+arg: flags 0x2 family 28 socktype 0 protocol 0 addrlen 0 host localhost serv http
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv http
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv http
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv http
+
diff --git a/lib/libc/tests/net/getaddrinfo/data/spec_fam_v4v6_prefer_v4.exp b/lib/libc/tests/net/getaddrinfo/data/spec_fam_v4v6_prefer_v4.exp
new file mode 100644
index 000000000000..af3506938503
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/spec_fam_v4v6_prefer_v4.exp
@@ -0,0 +1,10 @@
+arg: flags 0x2 family 2 socktype 0 protocol 0 addrlen 0 host localhost serv http
+ai1: flags 0x2 family 2 socktype 2 protocol 17 addrlen 16 host 127.0.0.1 serv http
+ai2: flags 0x2 family 2 socktype 1 protocol 6 addrlen 16 host 127.0.0.1 serv http
+ai3: flags 0x2 family 2 socktype 5 protocol 132 addrlen 16 host 127.0.0.1 serv http
+
+arg: flags 0x2 family 28 socktype 0 protocol 0 addrlen 0 host localhost serv http
+ai1: flags 0x2 family 28 socktype 2 protocol 17 addrlen 28 host ::1 serv http
+ai2: flags 0x2 family 28 socktype 1 protocol 6 addrlen 28 host ::1 serv http
+ai3: flags 0x2 family 28 socktype 5 protocol 132 addrlen 28 host ::1 serv http
+
diff --git a/lib/libc/tests/net/getaddrinfo/data/unsup_fam_v4_only.exp b/lib/libc/tests/net/getaddrinfo/data/unsup_fam_v4_only.exp
new file mode 100644
index 000000000000..69e6b48a854b
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/unsup_fam_v4_only.exp
@@ -0,0 +1,2 @@
+arg: flags 0x2 family 99 socktype 0 protocol 0 addrlen 0 host localhost serv (empty)
+Address family not recognized
diff --git a/lib/libc/tests/net/getaddrinfo/data/unsup_fam_v4v6_prefer_v4.exp b/lib/libc/tests/net/getaddrinfo/data/unsup_fam_v4v6_prefer_v4.exp
new file mode 100644
index 000000000000..69e6b48a854b
--- /dev/null
+++ b/lib/libc/tests/net/getaddrinfo/data/unsup_fam_v4v6_prefer_v4.exp
@@ -0,0 +1,2 @@
+arg: flags 0x2 family 99 socktype 0 protocol 0 addrlen 0 host localhost serv (empty)
+Address family not recognized
diff --git a/lib/libc/tests/net/getaddrinfo/t_getaddrinfo.sh b/lib/libc/tests/net/getaddrinfo/t_getaddrinfo.sh
index 79997a9a1631..bd2aa8d94fa0 100755
--- a/lib/libc/tests/net/getaddrinfo/t_getaddrinfo.sh
+++ b/lib/libc/tests/net/getaddrinfo/t_getaddrinfo.sh
@@ -29,43 +29,97 @@
 # SUCH DAMAGE.
 #
 
+IP6ADDRCTL_CMD="/usr/sbin/ip6addrctl"
+CURRENT_POLICY_FILE="current.conf"
+
+policy_backup()
+{
+    "${IP6ADDRCTL_CMD}" > "${CURRENT_POLICY_FILE}"
+}
+
+policy_cleanup()
+{
+    if [ -f "${CURRENT_POLICY_FILE}" ]; then
+        "${IP6ADDRCTL_CMD}" flush
+        cat "${CURRENT_POLICY_FILE}" | tail -n +2 | "${IP6ADDRCTL_CMD}" install /dev/stdin
+    fi
+}
+
 check_output()
 {
-	if [ "$2" = "none" ] ; then
-		exp="${1}.exp"
-	elif [ "$2" = "hosts" ] ; then
-		# Determine if localhost has an IPv6 address or not
-		lcl=$( cat /etc/hosts					| \
-			 sed -e 's/#.*$//' -e 's/[ 	][ 	]*/ /g'	| \
-			 awk '/ localhost($| )/ {printf "%s ", $1}' )
-		if [ "${lcl%*::*}" = "${lcl}" ] ; then
-			exp="${1}_v4.exp"
+	if [ "$2" = "none" ]; then
+		if [ "$3" = "prefer_v6" ]; then
+			exp="${1}.exp"
+		else
+			exp="${1}_v4_only.exp"
+		fi
+	elif [ "$2" = "hosts" ]; then
+		lcl=$(cat /etc/hosts | sed -e 's/#.*$//' -e 's/[ 	][ 	]*/ /g' | awk '/ localhost($| )/ {printf "%s ", $1}')
+		if [ "${lcl%*::*}" = "${lcl}" ]; then
+			exp="${1}_v4_only.exp"
 		else
-			exp="${1}_v4v6.exp"
+			if [ "$3" = "prefer_v6" ]; then
+				exp="${1}_v4v6.exp"
+			else
+				exp="${1}_v4v6_prefer_v4.exp"
+			fi
 		fi
-	elif [ "$2" = "ifconfig" ] ; then
-		lcl=$( ifconfig lo0 | grep inet6 )
-		if [ -n "${lcl}" ] ; then
-			exp="${1}_v4v6.exp"
+	elif [ "$2" = "ifconfig" ]; then
+		lcl=$(ifconfig lo0 | grep inet6)
+		if [ -n "${lcl}" ]; then
+			if [ "$3" = "prefer_v6" ]; then
+				exp="${1}_v4v6.exp"
+			else
+				exp="${1}_v4v6_prefer_v4.exp"
+			fi
 		else
-			exp="${1}_v4.exp"
+			exp="${1}_v4_only.exp"
 		fi
 	else
 		atf_fail "Invalid family_match_type $2 requested."
 	fi
 
-	cmp  -s $(atf_get_srcdir)/data/${exp} out && return
-	diff -u $(atf_get_srcdir)/data/${exp} out || \
-	atf_fail "Actual output does not match expected output"
+	cmp -s "$(atf_get_srcdir)/data/${exp}" out && return
+	diff -u "$(atf_get_srcdir)/data/${exp}" out || atf_fail "Actual output does not match expected output"
+}
+
+atf_test_case basic_prefer_v4 cleanup
+basic_prefer_v4_head()
+{
+	atf_set "descr" "Testing basic ones with prefer_v4"
+}
+basic_prefer_v4_body()
+{
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv4
+	TEST=$(atf_get_srcdir)/h_gai
+
+	( $TEST ::1 http
+	  $TEST 127.0.0.1 http
+	  $TEST localhost http
+	  $TEST ::1 tftp
+	  $TEST 127.0.0.1 tftp
+	  $TEST localhost tftp
+	  $TEST ::1 echo
+	  $TEST 127.0.0.1 echo
+	  $TEST localhost echo ) > out 2>&1
+
+	check_output basics hosts prefer_v4
+}
+basic_prefer_v4_cleanup()
+{
+	policy_cleanup
 }
 
-atf_test_case basic
+atf_test_case basic cleanup
 basic_head()
 {
-	atf_set "descr" "Testing basic ones"
+	atf_set "descr" "Testing basic ones with prefer_v6"
 }
 basic_body()
 {
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv6
 	TEST=$(atf_get_srcdir)/h_gai
 
 	( $TEST ::1 http
@@ -78,31 +132,93 @@ basic_body()
 	  $TEST 127.0.0.1 echo
 	  $TEST localhost echo ) > out 2>&1
 
-	check_output basics hosts
+	check_output basics ifconfig prefer_v6
+}
+basic_cleanup()
+{
+	policy_cleanup
+}
+
+atf_test_case specific_prefer_v4 cleanup
+specific_prefer_v4_head()
+{
+	atf_set "descr" "Testing specific address family with prefer_v4"
+}
+specific_prefer_v4_body()
+{
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv4
+	TEST=$(atf_get_srcdir)/h_gai
+
+	( $TEST -4 localhost http
+	  $TEST -6 localhost http ) > out 2>&1
+
+	check_output spec_fam hosts prefer_v4
+}
+specific_prefer_v4_cleanup()
+{
+	policy_cleanup
 }
 
-atf_test_case specific
+atf_test_case specific cleanup
 specific_head()
 {
-	atf_set "descr" "Testing specific address family"
+	atf_set "descr" "Testing specific address family with prefer_v6"
 }
 specific_body()
 {
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv6
 	TEST=$(atf_get_srcdir)/h_gai
 
 	( $TEST -4 localhost http
 	  $TEST -6 localhost http ) > out 2>&1
 
-	check_output spec_fam hosts
+	check_output spec_fam hosts prefer_v6
+}
+specific_cleanup()
+{
+	policy_cleanup
+}
+
+atf_test_case empty_hostname_prefer_v4 cleanup
+empty_hostname_prefer_v4_head()
+{
+	atf_set "descr" "Testing empty hostname with prefer_v4"
+}
+empty_hostname_prefer_v4_body()
+{
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv4
+	TEST=$(atf_get_srcdir)/h_gai
+
+	( $TEST '' http
+	  $TEST '' echo
+	  $TEST '' tftp
+	  $TEST '' 80
+	  $TEST -P '' http
+	  $TEST -P '' echo
+	  $TEST -P '' tftp
+	  $TEST -P '' 80
+	  $TEST -S '' 80
+	  $TEST -D '' 80 ) > out 2>&1
+
+	check_output no_host ifconfig prefer_v4
+}
+empty_hostname_prefer_v4_cleanup()
+{
+	policy_cleanup
 }
 
-atf_test_case empty_hostname
+atf_test_case empty_hostname cleanup
 empty_hostname_head()
 {
-	atf_set "descr" "Testing empty hostname"
+	atf_set "descr" "Testing empty hostname with prefer_v6"
 }
 empty_hostname_body()
 {
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv6
 	TEST=$(atf_get_srcdir)/h_gai
 
 	( $TEST '' http
@@ -116,16 +232,45 @@ empty_hostname_body()
 	  $TEST -S '' 80
 	  $TEST -D '' 80 ) > out 2>&1
 
-	check_output no_host ifconfig
+	check_output no_host ifconfig prefer_v6
+}
+empty_hostname_cleanup()
+{
+	policy_cleanup
+}
+
+atf_test_case empty_servname_prefer_v4 cleanup
+empty_servname_prefer_v4_head()
+{
+	atf_set "descr" "Testing empty service name with prefer_v4"
+}
+empty_servname_prefer_v4_body()
+{
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv4
+	TEST=$(atf_get_srcdir)/h_gai
+
+	( $TEST ::1 ''
+	  $TEST 127.0.0.1 ''
+	  $TEST localhost ''
+	  $TEST '' '' ) > out 2>&1
+
+	check_output no_serv hosts prefer_v4
+}
+empty_servname_prefer_v4_cleanup()
+{
+	policy_cleanup
 }
 
-atf_test_case empty_servname
+atf_test_case empty_servname cleanup
 empty_servname_head()
 {
-	atf_set "descr" "Testing empty service name"
+	atf_set "descr" "Testing empty service name with prefer_v6"
 }
 empty_servname_body()
 {
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv6
 	TEST=$(atf_get_srcdir)/h_gai
 
 	( $TEST ::1 ''
@@ -133,16 +278,46 @@ empty_servname_body()
 	  $TEST localhost ''
 	  $TEST '' '' ) > out 2>&1
 
-	check_output no_serv hosts
+	check_output no_serv ifconfig prefer_v6
+}
+empty_servname_cleanup()
+{
+	policy_cleanup
+}
+
+atf_test_case sock_raw_prefer_v4 cleanup
+sock_raw_prefer_v4_head()
+{
+	atf_set "descr" "Testing raw socket with prefer_v4"
+}
+sock_raw_prefer_v4_body()
+{
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv4
+	TEST=$(atf_get_srcdir)/h_gai
+
+	( $TEST -R -p 0 localhost ''
+	  $TEST -R -p 59 localhost ''
+	  $TEST -R -p 59 localhost 80
+	  $TEST -R -p 59 localhost www
+	  $TEST -R -p 59 ::1 '' ) > out 2>&1
+
+	check_output sock_raw hosts prefer_v4
+}
+sock_raw_prefer_v4_cleanup()
+{
+	policy_cleanup
 }
 
-atf_test_case sock_raw
+atf_test_case sock_raw cleanup
 sock_raw_head()
 {
-	atf_set "descr" "Testing raw socket"
+	atf_set "descr" "Testing raw socket with prefer_v6"
 }
 sock_raw_body()
 {
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv6
 	TEST=$(atf_get_srcdir)/h_gai
 
 	( $TEST -R -p 0 localhost ''
@@ -151,44 +326,109 @@ sock_raw_body()
 	  $TEST -R -p 59 localhost www
 	  $TEST -R -p 59 ::1 '' ) > out 2>&1
 
-	check_output sock_raw hosts
+	check_output sock_raw ifconfig prefer_v6
+}
+sock_raw_cleanup()
+{
+	policy_cleanup
+}
+
+atf_test_case unsupported_family_prefer_v4 cleanup
+unsupported_family_prefer_v4_head()
+{
+	atf_set "descr" "Testing unsupported family with prefer_v4"
+}
+unsupported_family_prefer_v4_body()
+{
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv4
+	TEST=$(atf_get_srcdir)/h_gai
+
+	( $TEST -f 99 localhost '' ) > out 2>&1
+
+	check_output unsup_fam ifconfig prefer_v4
+}
+unsupported_family_prefer_v4_cleanup()
+{
+	policy_cleanup
 }
 
-atf_test_case unsupported_family
+atf_test_case unsupported_family cleanup
 unsupported_family_head()
 {
-	atf_set "descr" "Testing unsupported family"
+	atf_set "descr" "Testing unsupported family with prefer_v6"
 }
 unsupported_family_body()
 {
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv6
 	TEST=$(atf_get_srcdir)/h_gai
 
 	( $TEST -f 99 localhost '' ) > out 2>&1
 
-	check_output unsup_fam none
+	check_output unsup_fam none prefer_v6
+}
+unsupported_family_cleanup()
+{
+	policy_cleanup
+}
+
+atf_test_case scopeaddr_prefer_v4 cleanup
+scopeaddr_prefer_v4_head()
+{
+	atf_set "descr" "Testing scoped address format with prefer_v4"
+}
+scopeaddr_prefer_v4_body()
+{
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv4
+	TEST=$(atf_get_srcdir)/h_gai
+
+	( $TEST fe80::1%lo0 http
+#	  IF=`ifconfig -a | grep -v '^	' | sed -e 's/:.*//' | head -1 | awk '{print $1}'`
+#	  $TEST fe80::1%$IF http
+	) > out 2>&1
+
+	check_output scoped ifconfig prefer_v4
+}
+scopeaddr_prefer_v4_cleanup()
+{
+	policy_cleanup
 }
 
-atf_test_case scopeaddr
+atf_test_case scopeaddr cleanup
 scopeaddr_head()
 {
-	atf_set "descr" "Testing scoped address format"
+	atf_set "descr" "Testing scoped address format with prefer_v6"
 }
 scopeaddr_body()
 {
+	policy_backup
+	/etc/rc.d/ip6addrctl prefer_ipv6
 	TEST=$(atf_get_srcdir)/h_gai
 
 	( $TEST fe80::1%lo0 http
-#	  IF=`ifconfig -a | grep -v '^	' | \
-#		sed -e 's/:.*//' | head -1 | awk '{print $1}'`
+#	  IF=`ifconfig -a | grep -v '^	' | sed -e 's/:.*//' | head -1 | awk '{print $1}'`
 #	  $TEST fe80::1%$IF http
 	) > out 2>&1
 
-	check_output scoped none
+	check_output scoped none prefer_v6
+}
+scopeaddr_cleanup()
+{
+	policy_cleanup
 }
 
 atf_init_test_cases()
 {
-	service ip6addrctl prefer_ipv6
+	atf_add_test_case basic_prefer_v4
+	atf_add_test_case specific_prefer_v4
+	atf_add_test_case empty_hostname_prefer_v4
+	atf_add_test_case empty_servname_prefer_v4
+	atf_add_test_case sock_raw_prefer_v4
+	atf_add_test_case unsupported_family_prefer_v4
+	atf_add_test_case scopeaddr_prefer_v4
+
 	atf_add_test_case basic
 	atf_add_test_case specific
 	atf_add_test_case empty_hostname