{"id":2230367,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2230367/?format=json","web_url":"http://patchwork.ozlabs.org/project/glibc/patch/20260429170104.2378474-2-pemensik@redhat.com/","project":{"id":41,"url":"http://patchwork.ozlabs.org/api/1.1/projects/41/?format=json","name":"GNU C Library","link_name":"glibc","list_id":"libc-alpha.sourceware.org","list_email":"libc-alpha@sourceware.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260429170104.2378474-2-pemensik@redhat.com>","date":"2026-04-29T17:00:49","name":"[v7,2/2] resolv: Create test for ipv4 and ipv6 resolv.conf flags","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"24c87b6d3b99102d88a909d087830caa54c21880","submitter":{"id":86150,"url":"http://patchwork.ozlabs.org/api/1.1/people/86150/?format=json","name":"Petr Menšík","email":"pemensik@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/glibc/patch/20260429170104.2378474-2-pemensik@redhat.com/mbox/","series":[{"id":502111,"url":"http://patchwork.ozlabs.org/api/1.1/series/502111/?format=json","web_url":"http://patchwork.ozlabs.org/project/glibc/list/?series=502111","date":"2026-04-29T17:00:48","name":"[v7,1/2] resolv: implement ipv4+ipv6 flags in resolv.conf (bug 30544)","version":7,"mbox":"http://patchwork.ozlabs.org/series/502111/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2230367/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2230367/checks/","tags":{},"headers":{"Return-Path":"<libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org>","X-Original-To":["incoming@patchwork.ozlabs.org","libc-alpha@sourceware.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","libc-alpha@sourceware.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=C8fMlEA5;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=C8fMlEA5","sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","sourceware.org; spf=pass smtp.mailfrom=redhat.com","server2.sourceware.org;\n arc=none smtp.remote-ip=170.10.129.124"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g5Nrl6sRHz1yHX\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 03:02:15 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 6DF094BB58B6\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 29 Apr 2026 17:02:13 +0000 (GMT)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by sourceware.org (Postfix) with ESMTP id 83F6F4BBCD92\n for <libc-alpha@sourceware.org>; Wed, 29 Apr 2026 17:01:50 +0000 (GMT)","from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-297-8smnobTHM2esBdBdTZlGsw-1; Wed,\n 29 Apr 2026 13:01:48 -0400","from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 996551800652\n for <libc-alpha@sourceware.org>; Wed, 29 Apr 2026 17:01:47 +0000 (UTC)","from pemensik-tp1g4 (pemensik-tp1g4.brq.redhat.com [10.43.2.231])\n by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with\n ESMTPS\n id 889221800349; Wed, 29 Apr 2026 17:01:46 +0000 (UTC)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 6DF094BB58B6","OpenDKIM Filter v2.11.0 sourceware.org 83F6F4BBCD92"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 83F6F4BBCD92","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 83F6F4BBCD92","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777482110; cv=none;\n b=Rsrdm+drFpAVyZCo9o91viybf7prnmwjPlO5inS4kTbXA8vVgLaPjuXkkHZ+VDbdc+Nf68DfSQv19qVahWBf7F28oqys0oK3ZO/WZwZKmEKKuxicN1hXgE5RQsnWvGkWQZU5bXxj2w6UBUXbt9W4EXbbq/srnyc7MVJ6ZNXLXjk=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777482110; c=relaxed/simple;\n bh=Y3X/6Cn1mK7UU2E7XjP6Kx205Hyq7ZtH1pKtKIpaSzw=;\n h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version;\n b=IcR26A1FX7MgmIWjivwgK1rNYgsTrCCwU2KmPbdsfZzK7scbqL1qUqDHYr/IQEaFEJYcWMzMv6EoAHLSbkalKtxbsm289TIGj/XLE9KOdGZlR8FF7JKqBP05OtoW7nAyk8RTv4j6uB1hHLvE3Y1FRrUUZ50t4eva11WQqzXgLTI=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777482110;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=Mu8iunUgFc40aXMxAqB0zfGRGwneRl151iTmDbUw5Ts=;\n b=C8fMlEA5pERQbTSzqndp8nXfdgEKmHCvu0cPIAI6ZwMot8s82oRdrTBKrbo/c/TCioNukQ\n 4oU2RCIzr6+0aWCcWUUbMk1kuxNgQTyD00KkLjATQkyc+9o8PoHKX6lWsiv21keJkqHOs6\n EUMieQAyXh4eRYoIcy/FIYul41VzXU8=","X-MC-Unique":"8smnobTHM2esBdBdTZlGsw-1","X-Mimecast-MFC-AGG-ID":"8smnobTHM2esBdBdTZlGsw_1777482108","From":"=?utf-8?b?UGV0ciBNZW7FocOtaw==?= <pemensik@redhat.com>","To":"libc-alpha@sourceware.org","Cc":"=?utf-8?b?UGV0ciBNZW7FocOtaw==?= <pemensik@redhat.com>","Subject":"[PATCH v7 2/2] resolv: Create test for ipv4 and ipv6 resolv.conf\n flags","Date":"Wed, 29 Apr 2026 19:00:49 +0200","Message-ID":"<20260429170104.2378474-2-pemensik@redhat.com>","In-Reply-To":"<20260429170104.2378474-1-pemensik@redhat.com>","References":"<20251020160017.1574993-4-pemensik@redhat.com>\n <20260429170104.2378474-1-pemensik@redhat.com>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 3.4.1 on 10.30.177.93","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"wpG7RViWVuh-9ejK9X8-SsWr93qHJ1RyhB7--XJmSq8_1777482108","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","X-BeenThere":"libc-alpha@sourceware.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Libc-alpha mailing list <libc-alpha.sourceware.org>","List-Unsubscribe":"<https://sourceware.org/mailman/options/libc-alpha>,\n <mailto:libc-alpha-request@sourceware.org?subject=unsubscribe>","List-Archive":"<https://sourceware.org/pipermail/libc-alpha/>","List-Post":"<mailto:libc-alpha@sourceware.org>","List-Help":"<mailto:libc-alpha-request@sourceware.org?subject=help>","List-Subscribe":"<https://sourceware.org/mailman/listinfo/libc-alpha>,\n <mailto:libc-alpha-request@sourceware.org?subject=subscribe>","Errors-To":"libc-alpha-bounces~incoming=patchwork.ozlabs.org@sourceware.org"},"content":"Test newly added resolv.conf options ipv4 and ipv6. Derived from noaaa\ntest. Count query counts after the test, because it varies depending on\nused flags.\n\nFixed ai re-initialization on each attempt.\n\nSigned-off-by: Petr Menšík <pemensik@redhat.com>\n---\n resolv/Makefile               |   2 +\n resolv/tst-resolv-ipv4-ipv6.c | 639 ++++++++++++++++++++++++++++++++++\n 2 files changed, 641 insertions(+)\n create mode 100644 resolv/tst-resolv-ipv4-ipv6.c","diff":"diff --git a/resolv/Makefile b/resolv/Makefile\nindex 971608eff5..841720cf25 100644\n--- a/resolv/Makefile\n+++ b/resolv/Makefile\n@@ -116,6 +116,7 @@ tests += \\\n   tst-resolv-byaddr \\\n   tst-resolv-dns-section \\\n   tst-resolv-edns \\\n+  tst-resolv-ipv4-ipv6 \\\n   tst-resolv-invalid-cname \\\n   tst-resolv-invalid-ptr \\\n   tst-resolv-network \\\n@@ -311,6 +312,7 @@ $(objpfx)tst-resolv-res_init-multi: $(objpfx)libresolv.so \\\n   $(shared-thread-library)\n $(objpfx)tst-resolv-res_init-thread: $(objpfx)libresolv.so \\\n   $(shared-thread-library)\n+$(objpfx)tst-resolv-ipv4-ipv6: $(objpfx)libresolv.so $(shared-thread-library)\n $(objpfx)tst-resolv-invalid-cname: $(objpfx)libresolv.so \\\n   $(shared-thread-library)\n $(objpfx)tst-resolv-invalid-ptr: $(objpfx)libresolv.so \\\ndiff --git a/resolv/tst-resolv-ipv4-ipv6.c b/resolv/tst-resolv-ipv4-ipv6.c\nnew file mode 100644\nindex 0000000000..d375a0989e\n--- /dev/null\n+++ b/resolv/tst-resolv-ipv4-ipv6.c\n@@ -0,0 +1,639 @@\n+/* Test RES_IPV4 and RES_IPV6 resolver option.\n+   Copyright (C) 2025 Free Software Foundation, Inc.\n+   This file is part of the GNU C Library.\n+\n+   The GNU C Library is free software; you can redistribute it and/or\n+   modify it under the terms of the GNU Lesser General Public\n+   License as published by the Free Software Foundation; either\n+   version 2.1 of the License, or (at your option) any later version.\n+\n+   The GNU C Library is distributed in the hope that it will be useful,\n+   but WITHOUT ANY WARRANTY; without even the implied warranty of\n+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n+   Lesser General Public License for more details.\n+\n+   You should have received a copy of the GNU Lesser General Public\n+   License along with the GNU C Library; if not, see\n+   <https://www.gnu.org/licenses/>.  */\n+\n+#include <errno.h>\n+#include <netdb.h>\n+#include <resolv.h>\n+#include <stdlib.h>\n+#include <support/check.h>\n+#include <support/check_nss.h>\n+#include <support/resolv_test.h>\n+#include <support/support.h>\n+\n+/* Used to keep track of the number of queries.  */\n+static volatile unsigned int queries;\n+\n+static void\n+response (const struct resolv_response_context *ctx,\n+          struct resolv_response_builder *b,\n+          const char *qname, uint16_t qclass, uint16_t qtype)\n+{\n+  /* Each test should only send one query.  */\n+  ++queries;\n+  if (queries < 1 || queries > 2)\n+    FAIL_EXIT1 (\"Unexpected number of queries %d on %s\\n\", queries, qname);\n+  TEST_COMPARE (qclass, C_IN);\n+\n+  /* The only other query type besides A is PTR.  */\n+  if (qtype != T_A && qtype != T_AAAA)\n+    TEST_COMPARE (qtype, T_PTR);\n+\n+  int an, ns, ar;\n+  char *tail;\n+  if (sscanf (qname, \"an%d.ns%d.ar%d.%ms\", &an, &ns, &ar, &tail) != 4)\n+    FAIL_EXIT1 (\"invalid QNAME: %s\\n\", qname);\n+  TEST_COMPARE_STRING (tail, \"example\");\n+  free (tail);\n+\n+  if (an < 0 || ns < 0 || ar < 0)\n+    {\n+      struct resolv_response_flags flags = { .rcode = NXDOMAIN, };\n+      resolv_response_init (b, flags);\n+      resolv_response_add_question (b, qname, qclass, qtype);\n+      return;\n+    }\n+\n+  struct resolv_response_flags flags = {};\n+  resolv_response_init (b, flags);\n+  resolv_response_add_question (b, qname, qclass, qtype);\n+\n+  resolv_response_section (b, ns_s_an);\n+  for (int i = 0; i < an; ++i)\n+    {\n+      resolv_response_open_record (b, qname, qclass, qtype, 60);\n+      switch (qtype)\n+        {\n+        case T_A:\n+          {\n+            char ipv4[4] = {192, 0, 2, i + 1};\n+            resolv_response_add_data (b, &ipv4, sizeof (ipv4));\n+          }\n+          break;\n+\n+        case T_AAAA:\n+          {   \n+            char addr_ipv6[16] =\n+              { 0x20, 1, 0x0d, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, i + 1 };\n+            resolv_response_add_data (b, addr_ipv6, sizeof (addr_ipv6));\n+          }\n+          break;\n+\n+        case T_PTR:\n+          {\n+            char *name = xasprintf (\"ptr-%d\", i);\n+            resolv_response_add_name (b, name);\n+            free (name);\n+          }\n+          break;\n+        }\n+      resolv_response_close_record (b);\n+    }\n+\n+  resolv_response_section (b, ns_s_ns);\n+  for (int i = 0; i < ns; ++i)\n+    {\n+      resolv_response_open_record (b, qname, qclass, T_NS, 60);\n+      char *name = xasprintf (\"ns%d.example.net\", i);\n+      resolv_response_add_name (b, name);\n+      free (name);\n+      resolv_response_close_record (b);\n+    }\n+\n+  resolv_response_section (b, ns_s_ar);\n+  int addr = 1;\n+  for (int i = 0; i < ns; ++i)\n+    {\n+      char *name = xasprintf (\"ns%d.example.net\", i);\n+      for (int j = 0; j < ar; ++j)\n+        {\n+          resolv_response_open_record (b, name, qclass, T_A, 60);\n+          char ipv4[4] = {192, 0, 2, addr};\n+          resolv_response_add_data (b, &ipv4, sizeof (ipv4));\n+          resolv_response_close_record (b);\n+\n+          resolv_response_open_record (b, name, qclass, T_AAAA, 60);\n+          char ipv6[16]\n+            = {0x20, 0x01, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, addr};\n+          resolv_response_add_data (b, &ipv6, sizeof (ipv6));\n+          resolv_response_close_record (b);\n+\n+          ++addr;\n+        }\n+      free (name);\n+    }\n+}\n+\n+/* Number of modes.  Lowest bit encodes *n* function vs implicit _res\n+   argument.  The mode numbers themselves are arbitrary.  */\n+enum { mode_count = 8 };\n+\n+/* res_send-like modes do not perform error translation.  */\n+enum { first_send_mode = 6 };\n+\n+static int\n+libresolv_query (unsigned int mode, const char *qname, uint16_t qtype,\n+                 unsigned char *buf, size_t buflen)\n+{\n+  int saved_errno = errno;\n+\n+  TEST_VERIFY_EXIT (mode < mode_count);\n+\n+  switch (mode)\n+    {\n+    case 0:\n+      return res_query (qname, C_IN, qtype, buf, buflen);\n+    case 1:\n+      return res_nquery (&_res, qname, C_IN, qtype, buf, buflen);\n+    case 2:\n+      return res_search (qname, C_IN, qtype, buf, buflen);\n+    case 3:\n+      return res_nsearch (&_res, qname, C_IN, qtype, buf, buflen);\n+    case 4:\n+      return res_querydomain (qname, \"\", C_IN, qtype, buf, buflen);\n+    case 5:\n+      return res_nquerydomain (&_res, qname, \"\", C_IN, qtype, buf, buflen);\n+    case 6:\n+      {\n+        unsigned char querybuf[512];\n+        int ret = res_mkquery (QUERY, qname, C_IN, qtype,\n+                               NULL, 0, NULL, querybuf, sizeof (querybuf));\n+        TEST_VERIFY_EXIT (ret > 0);\n+        errno = saved_errno;\n+        return res_send (querybuf, ret, buf, buflen);\n+      }\n+    case 7:\n+      {\n+        unsigned char querybuf[512];\n+        int ret = res_nmkquery (&_res, QUERY, qname, C_IN, qtype,\n+                                NULL, 0, NULL, querybuf, sizeof (querybuf));\n+        TEST_VERIFY_EXIT (ret > 0);\n+        errno = saved_errno;\n+        return res_nsend (&_res, querybuf, ret, buf, buflen);\n+      }\n+    }\n+  __builtin_unreachable ();\n+}\n+\n+/* Common parts should not change behaviour whatever flag is used. */\n+static int\n+do_test_common(void)\n+{\n+  queries = 0;\n+\n+  /* getaddrinfo checks with one address.  */\n+  struct addrinfo *ai = NULL;\n+  int ret;\n+  ret = getaddrinfo (\"an1.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_INET,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an1.ns2.ar1.example (AF_INET)\", ai, ret,\n+                  \"address: STREAM/TCP 192.0.2.1 80\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  TEST_COMPARE (queries, 1);\n+\n+  queries = 0;\n+  ret = getaddrinfo (\"an1.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_INET6,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an1.ns2.ar1.example (AF_INET6)\", ai, ret,\n+                  \"address: STREAM/TCP 2001:db8::1 80\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  TEST_COMPARE (queries, 1);\n+  queries = 0;\n+\n+  /* getaddrinfo checks with three addresses.  */\n+  ret = getaddrinfo (\"an3.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_INET,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an3.ns2.ar1.example (AF_INET)\", ai, ret,\n+                  \"address: STREAM/TCP 192.0.2.1 80\\n\"\n+                  \"address: STREAM/TCP 192.0.2.2 80\\n\"\n+                  \"address: STREAM/TCP 192.0.2.3 80\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  TEST_COMPARE (queries, 1);\n+  queries = 0;\n+  ret = getaddrinfo (\"an3.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_INET6,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an3.ns2.ar1.example (AF_INET6)\", ai, ret,\n+                  \"address: STREAM/TCP 2001:db8::1 80\\n\"\n+                  \"address: STREAM/TCP 2001:db8::2 80\\n\"\n+                  \"address: STREAM/TCP 2001:db8::3 80\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  TEST_COMPARE (queries, 1);\n+  queries = 0;\n+\n+  return ret;\n+}\n+\n+/* test IPV4 flag */\n+static int\n+do_test_ipv4 (int options)\n+{\n+  int ret;\n+  struct addrinfo *ai = NULL;\n+\n+  _res.options = options;\n+  queries = 0;\n+\n+  ret = do_test_common();\n+\n+  /* getaddrinfo checks with one address.  */\n+  ret = getaddrinfo (\"an1.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_UNSPEC,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an1.ns2.ar1.example (AF_UNSPEC) ipv4\", ai, ret,\n+                  \"address: STREAM/TCP 192.0.2.1 80\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  TEST_COMPARE (queries, 1);\n+\n+  queries = 0;\n+  ret = getaddrinfo (\"an3.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_UNSPEC,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an3.ns2.ar1.example (AF_UNSPEC) ipv4\", ai, ret,\n+                  \"address: STREAM/TCP 192.0.2.1 80\\n\"\n+                  \"address: STREAM/TCP 192.0.2.2 80\\n\"\n+                  \"address: STREAM/TCP 192.0.2.3 80\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  TEST_COMPARE (queries, 1);\n+  queries = 0;\n+\n+  return ret;\n+}\n+\n+static int\n+do_test_ipv6 (int options)\n+{\n+  int ret;\n+  struct addrinfo *ai = NULL;\n+\n+  _res.options = options;\n+  queries = 0;\n+\n+  ret = do_test_common();\n+\n+  /* getaddrinfo checks with one address.  */\n+  ret = getaddrinfo (\"an1.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_UNSPEC,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an1.ns2.ar1.example (AF_UNSPEC) ipv6\", ai, ret,\n+                  \"address: STREAM/TCP 2001:db8::1 80\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  TEST_COMPARE (queries, 1);\n+  queries = 0;\n+\n+  /* getaddrinfo checks with three addresses.  */\n+  ret = getaddrinfo (\"an3.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_UNSPEC,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an3.ns2.ar1.example (AF_UNSPEC) ipv6\", ai, ret,\n+                  \"address: STREAM/TCP 2001:db8::1 80\\n\"\n+                  \"address: STREAM/TCP 2001:db8::2 80\\n\"\n+                  \"address: STREAM/TCP 2001:db8::3 80\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  TEST_COMPARE (queries, 1);\n+  queries = 0;\n+\n+  return ret;\n+}\n+\n+/* When both flags are applied */\n+static int\n+do_test_ipv4_ipv6 (int options)\n+{\n+  int ret;\n+  struct addrinfo *ai = NULL;\n+\n+  _res.options = options;\n+  queries = 0;\n+\n+  ret = do_test_common();\n+\n+  /* getaddrinfo checks with one address.  */\n+  ret = getaddrinfo (\"an1.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_UNSPEC,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an1.ns2.ar1.example (AF_UNSPEC) ipv4 ipv6\", ai, ret,\n+                  \"address: STREAM/TCP 192.0.2.1 80\\n\"\n+                  \"address: STREAM/TCP 2001:db8::1 80\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  TEST_COMPARE (queries, 2);\n+  queries = 0;\n+\n+  /* getaddrinfo checks with three addresses.  */\n+  ret = getaddrinfo (\"an3.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_UNSPEC,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an3.ns2.ar1.example (AF_UNSPEC) ipv4 ipv6\", ai, ret,\n+                  \"address: STREAM/TCP 192.0.2.1 80\\n\"\n+                  \"address: STREAM/TCP 192.0.2.2 80\\n\"\n+                  \"address: STREAM/TCP 192.0.2.3 80\\n\"\n+                  \"address: STREAM/TCP 2001:db8::1 80\\n\"\n+                  \"address: STREAM/TCP 2001:db8::2 80\\n\"\n+                  \"address: STREAM/TCP 2001:db8::3 80\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  TEST_COMPARE (queries, 2);\n+  queries = 0;\n+\n+  return ret;\n+}\n+\n+static int\n+do_test (void)\n+{\n+  int baseoptions;\n+  int ret;\n+  struct addrinfo *ai = NULL;\n+  struct resolv_test *obj = resolv_test_start\n+    ((struct resolv_redirect_config)\n+     {\n+       .response_callback = response\n+     });\n+\n+  baseoptions = _res.options;\n+\n+  ret = do_test_ipv4(baseoptions | RES_IPV4);\n+  ret = do_test_ipv6(baseoptions | RES_IPV6);\n+  ret = do_test_ipv4_ipv6(baseoptions);\n+  ret = do_test_ipv4_ipv6(baseoptions | RES_IPV4 | RES_IPV6);\n+\n+  /* getaddrinfo checks with no address.  */\n+  ret = getaddrinfo (\"an0.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_INET,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an0.ns2.ar1.example (AF_INET)\", ai, ret,\n+                  \"error: No address associated with hostname\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  queries = 0;\n+  ret = getaddrinfo (\"an0.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_INET6,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an0.ns2.ar1.example (AF_INET6)\", ai, ret,\n+                  \"error: No address associated with hostname\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  queries = 0;\n+  ret = getaddrinfo (\"an0.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_UNSPEC,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an-1.ns2.ar1.example (AF_UNSPEC)\", ai, ret,\n+                  \"error: No address associated with hostname\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  queries = 0;\n+\n+  /* getaddrinfo checks with NXDOMAIN.  */\n+  ret = getaddrinfo (\"an-1.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_INET,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an-1.ns2.ar1.example (AF_INET)\", ai, ret,\n+                  \"error: Name or service not known\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  queries = 0;\n+  ret = getaddrinfo (\"an-1.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_INET6,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an-1.ns2.ar1.example (AF_INET6)\", ai, ret,\n+                  \"error: Name or service not known\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  queries = 0;\n+  ret = getaddrinfo (\"an-1.ns2.ar1.example\", \"80\",\n+                     &(struct addrinfo)\n+                     {\n+                       .ai_family = AF_UNSPEC,\n+                       .ai_socktype = SOCK_STREAM,\n+                     }, &ai);\n+  check_addrinfo (\"an-1.ns2.ar1.example (AF_UNSPEC)\", ai, ret,\n+                  \"error: Name or service not known\\n\");\n+  freeaddrinfo (ai);\n+  ai = NULL;\n+  queries = 0;\n+\n+  for (unsigned int mode = 0; mode < mode_count; ++mode)\n+    {\n+      unsigned char *buf;\n+      int ret;\n+\n+      /* Response for A.  */\n+      buf = malloc (512);\n+      ret = libresolv_query (mode, \"an1.ns2.ar1.example\", T_A, buf, 512);\n+      TEST_VERIFY_EXIT (ret > 0);\n+      check_dns_packet (\"an1.ns2.ar1.example A\", buf, ret,\n+                        \"name: an1.ns2.ar1.example\\n\"\n+                        \"address: 192.0.2.1\\n\");\n+      free (buf);\n+      queries = 0;\n+\n+      /* NODATA response for A.  */\n+      buf = malloc (512);\n+      errno = 0;\n+      ret = libresolv_query (mode, \"an0.ns2.ar1.example\", T_A, buf, 512);\n+      if (mode < first_send_mode)\n+        {\n+          TEST_COMPARE (ret, -1);\n+          TEST_COMPARE (errno, 0);\n+          TEST_COMPARE (h_errno, NO_ADDRESS);\n+        }\n+      else\n+        {\n+          TEST_VERIFY_EXIT (ret > 0);\n+          TEST_COMPARE (((HEADER *)buf)->rcode, 0);\n+          check_dns_packet (\"an1.ns2.ar1.example A\", buf, ret,\n+                            \"name: an0.ns2.ar1.example\\n\");\n+        }\n+      free (buf);\n+      queries = 0;\n+\n+      /* NXDOMAIN response for A.  */\n+      buf = malloc (512);\n+      errno = 0;\n+      ret = libresolv_query (mode, \"an-1.ns2.ar1.example\", T_A, buf, 512);\n+      if (mode < first_send_mode)\n+        {\n+          TEST_COMPARE (ret, -1);\n+          TEST_COMPARE (errno, 0);\n+          TEST_COMPARE (h_errno, HOST_NOT_FOUND);\n+        }\n+      else\n+        {\n+          TEST_VERIFY_EXIT (ret > 0);\n+          TEST_COMPARE (((HEADER *)buf)->rcode, NXDOMAIN);\n+          check_dns_packet (\"an1.ns2.ar1.example A\", buf, ret,\n+                            \"name: an-1.ns2.ar1.example\\n\");\n+        }\n+      free (buf);\n+      queries = 0;\n+\n+      /* Response for PTR.  */\n+      buf = malloc (512);\n+      ret = libresolv_query (mode, \"an1.ns2.ar1.example\", T_PTR, buf, 512);\n+      TEST_VERIFY_EXIT (ret > 0);\n+      check_dns_packet (\"an1.ns2.ar1.example PTR\", buf, ret,\n+                        \"name: an1.ns2.ar1.example\\n\"\n+                        \"data: an1.ns2.ar1.example PTR ptr-0\\n\");\n+      free (buf);\n+      queries = 0;\n+\n+      /* NODATA response for PTR.  */\n+      buf = malloc (512);\n+      errno = 0;\n+      ret = libresolv_query (mode, \"an0.ns2.ar1.example\", T_PTR, buf, 512);\n+      if (mode < first_send_mode)\n+        {\n+          TEST_COMPARE (ret, -1);\n+          TEST_COMPARE (errno, 0);\n+          TEST_COMPARE (h_errno, NO_ADDRESS);\n+        }\n+      else\n+        {\n+          TEST_VERIFY_EXIT (ret > 0);\n+          TEST_COMPARE (((HEADER *)buf)->rcode, 0);\n+          check_dns_packet (\"an1.ns2.ar1.example PTR\", buf, ret,\n+                            \"name: an0.ns2.ar1.example\\n\");\n+        }\n+      free (buf);\n+      queries = 0;\n+\n+      /* NXDOMAIN response for PTR.  */\n+      buf = malloc (512);\n+      errno = 0;\n+      ret = libresolv_query (mode, \"an-1.ns2.ar1.example\", T_PTR, buf, 512);\n+      if (mode < first_send_mode)\n+        {\n+          TEST_COMPARE (ret, -1);\n+          TEST_COMPARE (errno, 0);\n+          TEST_COMPARE (h_errno, HOST_NOT_FOUND);\n+        }\n+      else\n+        {\n+          TEST_VERIFY_EXIT (ret > 0);\n+          TEST_COMPARE (((HEADER *)buf)->rcode, NXDOMAIN);\n+          check_dns_packet (\"an1.ns2.ar1.example PTR\", buf, ret,\n+                            \"name: an-1.ns2.ar1.example\\n\");\n+        }\n+      free (buf);\n+      queries = 0;\n+\n+      /* NODATA response for AAAA.  */\n+      buf = malloc (512);\n+      errno = 0;\n+      ret = libresolv_query (mode, \"an1.ns2.ar1.example\", T_AAAA, buf, 512);\n+      TEST_VERIFY_EXIT (ret > 0);\n+      check_dns_packet (\"an1.ns2.ar1.example AAAA\", buf, ret,\n+                        \"name: an1.ns2.ar1.example\\n\"\n+                        \"address: 2001:db8::1\\n\");\n+      TEST_VERIFY_EXIT (ret > 0);\n+      free (buf);\n+      queries = 0;\n+\n+      /* NODATA response for AAAA (original is already NODATA).  */\n+      buf = malloc (512);\n+      errno = 0;\n+      ret = libresolv_query (mode, \"an0.ns2.ar1.example\", T_AAAA, buf, 512);\n+      if (mode < first_send_mode)\n+        {\n+          TEST_COMPARE (ret, -1);\n+          TEST_COMPARE (errno, 0);\n+          TEST_COMPARE (h_errno, NO_ADDRESS);\n+        }\n+      else\n+        {\n+          TEST_VERIFY_EXIT (ret > 0);\n+          TEST_COMPARE (((HEADER *)buf)->rcode, 0);\n+          check_dns_packet (\"an0.ns2.ar1.example A\", buf, ret,\n+                            \"name: an0.ns2.ar1.example\\n\");\n+        }\n+      free (buf);\n+      queries = 0;\n+\n+      /* NXDOMAIN response.  */\n+      buf = malloc (512);\n+      errno = 0;\n+      ret = libresolv_query (mode, \"an-1.ns2.ar1.example\", T_AAAA, buf, 512);\n+      if (mode < first_send_mode)\n+        {\n+          TEST_COMPARE (ret, -1);\n+          TEST_COMPARE (errno, 0);\n+          TEST_COMPARE (h_errno, HOST_NOT_FOUND);\n+        }\n+      else\n+        {\n+          TEST_VERIFY_EXIT (ret > 0);\n+          TEST_COMPARE (((HEADER *)buf)->rcode, NXDOMAIN);\n+          check_dns_packet (\"an-1.ns2.ar1.example A\", buf, ret,\n+                            \"name: an-1.ns2.ar1.example\\n\");\n+        }\n+      free (buf);\n+      queries = 0;\n+    }\n+\n+  resolv_test_end (obj);\n+\n+  return 0;\n+}\n+\n+#include <support/test-driver.c>\n","prefixes":["v7","2/2"]}