Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2230367/?format=api
{ "id": 2230367, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2230367/?format=api", "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=api", "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=api", "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=api", "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" ] }