1d3bfc725SMariusz Zaborski /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 328b6f7c8SMariusz Zaborski * 4d3bfc725SMariusz Zaborski * Copyright (c) 2013 The FreeBSD Foundation 5d3bfc725SMariusz Zaborski * 6d3bfc725SMariusz Zaborski * This software was developed by Pawel Jakub Dawidek under sponsorship from 7d3bfc725SMariusz Zaborski * the FreeBSD Foundation. 8d3bfc725SMariusz Zaborski * 9d3bfc725SMariusz Zaborski * Redistribution and use in source and binary forms, with or without 10d3bfc725SMariusz Zaborski * modification, are permitted provided that the following conditions 11d3bfc725SMariusz Zaborski * are met: 12d3bfc725SMariusz Zaborski * 1. Redistributions of source code must retain the above copyright 13d3bfc725SMariusz Zaborski * notice, this list of conditions and the following disclaimer. 14d3bfc725SMariusz Zaborski * 2. Redistributions in binary form must reproduce the above copyright 15d3bfc725SMariusz Zaborski * notice, this list of conditions and the following disclaimer in the 16d3bfc725SMariusz Zaborski * documentation and/or other materials provided with the distribution. 17d3bfc725SMariusz Zaborski * 18d3bfc725SMariusz Zaborski * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 19d3bfc725SMariusz Zaborski * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20d3bfc725SMariusz Zaborski * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21d3bfc725SMariusz Zaborski * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 22d3bfc725SMariusz Zaborski * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23d3bfc725SMariusz Zaborski * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24d3bfc725SMariusz Zaborski * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25d3bfc725SMariusz Zaborski * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26d3bfc725SMariusz Zaborski * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27d3bfc725SMariusz Zaborski * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28d3bfc725SMariusz Zaborski * SUCH DAMAGE. 29d3bfc725SMariusz Zaborski */ 30d3bfc725SMariusz Zaborski 31d3bfc725SMariusz Zaborski #include <sys/capsicum.h> 32ceb36bc9SMariusz Zaborski #include <sys/nv.h> 33d3bfc725SMariusz Zaborski 34d3bfc725SMariusz Zaborski #include <arpa/inet.h> 35d3bfc725SMariusz Zaborski #include <netinet/in.h> 36d3bfc725SMariusz Zaborski 37d3bfc725SMariusz Zaborski #include <assert.h> 38d3bfc725SMariusz Zaborski #include <err.h> 39d3bfc725SMariusz Zaborski #include <errno.h> 40d3bfc725SMariusz Zaborski #include <netdb.h> 41d3bfc725SMariusz Zaborski #include <stdio.h> 42d3bfc725SMariusz Zaborski #include <stdlib.h> 43d3bfc725SMariusz Zaborski #include <string.h> 44d3bfc725SMariusz Zaborski #include <unistd.h> 45d3bfc725SMariusz Zaborski 46d3bfc725SMariusz Zaborski #include <libcasper.h> 47d3bfc725SMariusz Zaborski #include <casper/cap_dns.h> 48d3bfc725SMariusz Zaborski 49615bf03eSMark Johnston #include <atf-c.h> 50d3bfc725SMariusz Zaborski 51d3bfc725SMariusz Zaborski #define GETHOSTBYNAME 0x01 52d3bfc725SMariusz Zaborski #define GETHOSTBYNAME2_AF_INET 0x02 53d3bfc725SMariusz Zaborski #define GETHOSTBYNAME2_AF_INET6 0x04 54d3bfc725SMariusz Zaborski #define GETHOSTBYADDR_AF_INET 0x08 55d3bfc725SMariusz Zaborski #define GETHOSTBYADDR_AF_INET6 0x10 56d3bfc725SMariusz Zaborski #define GETADDRINFO_AF_UNSPEC 0x20 57d3bfc725SMariusz Zaborski #define GETADDRINFO_AF_INET 0x40 58d3bfc725SMariusz Zaborski #define GETADDRINFO_AF_INET6 0x80 59d3bfc725SMariusz Zaborski 60d3bfc725SMariusz Zaborski static bool 61d3bfc725SMariusz Zaborski addrinfo_compare(struct addrinfo *ai0, struct addrinfo *ai1) 62d3bfc725SMariusz Zaborski { 63d3bfc725SMariusz Zaborski struct addrinfo *at0, *at1; 64d3bfc725SMariusz Zaborski 65d3bfc725SMariusz Zaborski if (ai0 == NULL && ai1 == NULL) 66d3bfc725SMariusz Zaborski return (true); 67d3bfc725SMariusz Zaborski if (ai0 == NULL || ai1 == NULL) 68d3bfc725SMariusz Zaborski return (false); 69d3bfc725SMariusz Zaborski 70d3bfc725SMariusz Zaborski at0 = ai0; 71d3bfc725SMariusz Zaborski at1 = ai1; 72d3bfc725SMariusz Zaborski while (true) { 73d3bfc725SMariusz Zaborski if ((at0->ai_flags == at1->ai_flags) && 74d3bfc725SMariusz Zaborski (at0->ai_family == at1->ai_family) && 75d3bfc725SMariusz Zaborski (at0->ai_socktype == at1->ai_socktype) && 76d3bfc725SMariusz Zaborski (at0->ai_protocol == at1->ai_protocol) && 77d3bfc725SMariusz Zaborski (at0->ai_addrlen == at1->ai_addrlen) && 78d3bfc725SMariusz Zaborski (memcmp(at0->ai_addr, at1->ai_addr, 79d3bfc725SMariusz Zaborski at0->ai_addrlen) == 0)) { 80d3bfc725SMariusz Zaborski if (at0->ai_canonname != NULL && 81d3bfc725SMariusz Zaborski at1->ai_canonname != NULL) { 82d3bfc725SMariusz Zaborski if (strcmp(at0->ai_canonname, 83d3bfc725SMariusz Zaborski at1->ai_canonname) != 0) { 84d3bfc725SMariusz Zaborski return (false); 85d3bfc725SMariusz Zaborski } 86d3bfc725SMariusz Zaborski } 87d3bfc725SMariusz Zaborski 88d3bfc725SMariusz Zaborski if (at0->ai_canonname == NULL && 89d3bfc725SMariusz Zaborski at1->ai_canonname != NULL) { 90d3bfc725SMariusz Zaborski return (false); 91d3bfc725SMariusz Zaborski } 92d3bfc725SMariusz Zaborski if (at0->ai_canonname != NULL && 93d3bfc725SMariusz Zaborski at1->ai_canonname == NULL) { 94d3bfc725SMariusz Zaborski return (false); 95d3bfc725SMariusz Zaborski } 96d3bfc725SMariusz Zaborski 97d3bfc725SMariusz Zaborski if (at0->ai_next == NULL && at1->ai_next == NULL) 98d3bfc725SMariusz Zaborski return (true); 99d3bfc725SMariusz Zaborski if (at0->ai_next == NULL || at1->ai_next == NULL) 100d3bfc725SMariusz Zaborski return (false); 101d3bfc725SMariusz Zaborski 102d3bfc725SMariusz Zaborski at0 = at0->ai_next; 103d3bfc725SMariusz Zaborski at1 = at1->ai_next; 104d3bfc725SMariusz Zaborski } else { 105d3bfc725SMariusz Zaborski return (false); 106d3bfc725SMariusz Zaborski } 107d3bfc725SMariusz Zaborski } 108d3bfc725SMariusz Zaborski 109d3bfc725SMariusz Zaborski /* NOTREACHED */ 110d3bfc725SMariusz Zaborski fprintf(stderr, "Dead code reached in addrinfo_compare()\n"); 111d3bfc725SMariusz Zaborski exit(1); 112d3bfc725SMariusz Zaborski } 113d3bfc725SMariusz Zaborski 114d3bfc725SMariusz Zaborski static bool 115d3bfc725SMariusz Zaborski hostent_aliases_compare(char **aliases0, char **aliases1) 116d3bfc725SMariusz Zaborski { 117d3bfc725SMariusz Zaborski int i0, i1; 118d3bfc725SMariusz Zaborski 119d3bfc725SMariusz Zaborski if (aliases0 == NULL && aliases1 == NULL) 120d3bfc725SMariusz Zaborski return (true); 121d3bfc725SMariusz Zaborski if (aliases0 == NULL || aliases1 == NULL) 122d3bfc725SMariusz Zaborski return (false); 123d3bfc725SMariusz Zaborski 124d3bfc725SMariusz Zaborski for (i0 = 0; aliases0[i0] != NULL; i0++) { 125d3bfc725SMariusz Zaborski for (i1 = 0; aliases1[i1] != NULL; i1++) { 126d3bfc725SMariusz Zaborski if (strcmp(aliases0[i0], aliases1[i1]) == 0) 127d3bfc725SMariusz Zaborski break; 128d3bfc725SMariusz Zaborski } 129d3bfc725SMariusz Zaborski if (aliases1[i1] == NULL) 130d3bfc725SMariusz Zaborski return (false); 131d3bfc725SMariusz Zaborski } 132d3bfc725SMariusz Zaborski 133d3bfc725SMariusz Zaborski return (true); 134d3bfc725SMariusz Zaborski } 135d3bfc725SMariusz Zaborski 136d3bfc725SMariusz Zaborski static bool 137d3bfc725SMariusz Zaborski hostent_addr_list_compare(char **addr_list0, char **addr_list1, int length) 138d3bfc725SMariusz Zaborski { 139d3bfc725SMariusz Zaborski int i0, i1; 140d3bfc725SMariusz Zaborski 141d3bfc725SMariusz Zaborski if (addr_list0 == NULL && addr_list1 == NULL) 142d3bfc725SMariusz Zaborski return (true); 143d3bfc725SMariusz Zaborski if (addr_list0 == NULL || addr_list1 == NULL) 144d3bfc725SMariusz Zaborski return (false); 145d3bfc725SMariusz Zaborski 146d3bfc725SMariusz Zaborski for (i0 = 0; addr_list0[i0] != NULL; i0++) { 147d3bfc725SMariusz Zaborski for (i1 = 0; addr_list1[i1] != NULL; i1++) { 148d3bfc725SMariusz Zaborski if (memcmp(addr_list0[i0], addr_list1[i1], length) == 0) 149d3bfc725SMariusz Zaborski break; 150d3bfc725SMariusz Zaborski } 151d3bfc725SMariusz Zaborski if (addr_list1[i1] == NULL) 152d3bfc725SMariusz Zaborski return (false); 153d3bfc725SMariusz Zaborski } 154d3bfc725SMariusz Zaborski 155d3bfc725SMariusz Zaborski return (true); 156d3bfc725SMariusz Zaborski } 157d3bfc725SMariusz Zaborski 158d3bfc725SMariusz Zaborski static bool 159d3bfc725SMariusz Zaborski hostent_compare(const struct hostent *hp0, const struct hostent *hp1) 160d3bfc725SMariusz Zaborski { 161d3bfc725SMariusz Zaborski 162d3bfc725SMariusz Zaborski if (hp0 == NULL && hp1 != NULL) 163d3bfc725SMariusz Zaborski return (true); 164d3bfc725SMariusz Zaborski 165d3bfc725SMariusz Zaborski if (hp0 == NULL || hp1 == NULL) 166d3bfc725SMariusz Zaborski return (false); 167d3bfc725SMariusz Zaborski 168d3bfc725SMariusz Zaborski if (hp0->h_name != NULL || hp1->h_name != NULL) { 169d3bfc725SMariusz Zaborski if (hp0->h_name == NULL || hp1->h_name == NULL) 170d3bfc725SMariusz Zaborski return (false); 171d3bfc725SMariusz Zaborski if (strcmp(hp0->h_name, hp1->h_name) != 0) 172d3bfc725SMariusz Zaborski return (false); 173d3bfc725SMariusz Zaborski } 174d3bfc725SMariusz Zaborski 175d3bfc725SMariusz Zaborski if (!hostent_aliases_compare(hp0->h_aliases, hp1->h_aliases)) 176d3bfc725SMariusz Zaborski return (false); 177d3bfc725SMariusz Zaborski if (!hostent_aliases_compare(hp1->h_aliases, hp0->h_aliases)) 178d3bfc725SMariusz Zaborski return (false); 179d3bfc725SMariusz Zaborski 180d3bfc725SMariusz Zaborski if (hp0->h_addrtype != hp1->h_addrtype) 181d3bfc725SMariusz Zaborski return (false); 182d3bfc725SMariusz Zaborski 183d3bfc725SMariusz Zaborski if (hp0->h_length != hp1->h_length) 184d3bfc725SMariusz Zaborski return (false); 185d3bfc725SMariusz Zaborski 186d3bfc725SMariusz Zaborski if (!hostent_addr_list_compare(hp0->h_addr_list, hp1->h_addr_list, 187d3bfc725SMariusz Zaborski hp0->h_length)) { 188d3bfc725SMariusz Zaborski return (false); 189d3bfc725SMariusz Zaborski } 190d3bfc725SMariusz Zaborski if (!hostent_addr_list_compare(hp1->h_addr_list, hp0->h_addr_list, 191d3bfc725SMariusz Zaborski hp0->h_length)) { 192d3bfc725SMariusz Zaborski return (false); 193d3bfc725SMariusz Zaborski } 194d3bfc725SMariusz Zaborski 195d3bfc725SMariusz Zaborski return (true); 196d3bfc725SMariusz Zaborski } 197d3bfc725SMariusz Zaborski 198615bf03eSMark Johnston static void 199615bf03eSMark Johnston runtest(cap_channel_t *capdns, unsigned int expected) 200d3bfc725SMariusz Zaborski { 201615bf03eSMark Johnston unsigned int result, failure; 202d3bfc725SMariusz Zaborski struct addrinfo *ais, *aic, hints, *hintsp; 203d3bfc725SMariusz Zaborski struct hostent *hps, *hpc; 204d3bfc725SMariusz Zaborski struct in_addr ip4; 205d3bfc725SMariusz Zaborski struct in6_addr ip6; 206615bf03eSMark Johnston int caperr, syserr; 207d3bfc725SMariusz Zaborski 208615bf03eSMark Johnston failure = result = 0; 209d3bfc725SMariusz Zaborski 210d3bfc725SMariusz Zaborski hps = gethostbyname("example.com"); 211615bf03eSMark Johnston if (hps == NULL) { 212615bf03eSMark Johnston failure |= GETHOSTBYNAME; 213d3bfc725SMariusz Zaborski fprintf(stderr, "Unable to resolve %s IPv4.\n", "example.com"); 214615bf03eSMark Johnston } else { 215d3bfc725SMariusz Zaborski hpc = cap_gethostbyname(capdns, "example.com"); 216d3bfc725SMariusz Zaborski if (hostent_compare(hps, hpc)) 217d3bfc725SMariusz Zaborski result |= GETHOSTBYNAME; 218615bf03eSMark Johnston } 219d3bfc725SMariusz Zaborski 220d3bfc725SMariusz Zaborski hps = gethostbyname2("example.com", AF_INET); 221615bf03eSMark Johnston if (hps == NULL) { 222615bf03eSMark Johnston failure |= GETHOSTBYNAME2_AF_INET; 223d3bfc725SMariusz Zaborski fprintf(stderr, "Unable to resolve %s IPv4.\n", "example.com"); 224615bf03eSMark Johnston } else { 225d3bfc725SMariusz Zaborski hpc = cap_gethostbyname2(capdns, "example.com", AF_INET); 226d3bfc725SMariusz Zaborski if (hostent_compare(hps, hpc)) 227d3bfc725SMariusz Zaborski result |= GETHOSTBYNAME2_AF_INET; 228615bf03eSMark Johnston } 229d3bfc725SMariusz Zaborski 230d3bfc725SMariusz Zaborski hps = gethostbyname2("example.com", AF_INET6); 231615bf03eSMark Johnston if (hps == NULL) { 232615bf03eSMark Johnston failure |= GETHOSTBYNAME2_AF_INET6; 233d3bfc725SMariusz Zaborski fprintf(stderr, "Unable to resolve %s IPv6.\n", "example.com"); 234615bf03eSMark Johnston } else { 235d3bfc725SMariusz Zaborski hpc = cap_gethostbyname2(capdns, "example.com", AF_INET6); 236d3bfc725SMariusz Zaborski if (hostent_compare(hps, hpc)) 237d3bfc725SMariusz Zaborski result |= GETHOSTBYNAME2_AF_INET6; 238615bf03eSMark Johnston } 239d3bfc725SMariusz Zaborski 240d3bfc725SMariusz Zaborski hints.ai_flags = 0; 241d3bfc725SMariusz Zaborski hints.ai_family = AF_UNSPEC; 242d3bfc725SMariusz Zaborski hints.ai_socktype = 0; 243d3bfc725SMariusz Zaborski hints.ai_protocol = 0; 244d3bfc725SMariusz Zaborski hints.ai_addrlen = 0; 245d3bfc725SMariusz Zaborski hints.ai_addr = NULL; 246d3bfc725SMariusz Zaborski hints.ai_canonname = NULL; 247d3bfc725SMariusz Zaborski hints.ai_next = NULL; 248d3bfc725SMariusz Zaborski 249d3bfc725SMariusz Zaborski hintsp = &hints; 250d3bfc725SMariusz Zaborski 251615bf03eSMark Johnston syserr = getaddrinfo("freebsd.org", "25", hintsp, &ais); 252615bf03eSMark Johnston if (syserr != 0) { 253615bf03eSMark Johnston failure |= GETADDRINFO_AF_UNSPEC; 254d3bfc725SMariusz Zaborski fprintf(stderr, 255d3bfc725SMariusz Zaborski "Unable to issue [system] getaddrinfo() for AF_UNSPEC: %s\n", 256615bf03eSMark Johnston gai_strerror(syserr)); 257615bf03eSMark Johnston } else { 258615bf03eSMark Johnston caperr = cap_getaddrinfo(capdns, "freebsd.org", "25", hintsp, 259615bf03eSMark Johnston &aic); 260615bf03eSMark Johnston if (caperr == 0) { 261d3bfc725SMariusz Zaborski if (addrinfo_compare(ais, aic)) 262d3bfc725SMariusz Zaborski result |= GETADDRINFO_AF_UNSPEC; 263d3bfc725SMariusz Zaborski freeaddrinfo(ais); 264d3bfc725SMariusz Zaborski freeaddrinfo(aic); 265d3bfc725SMariusz Zaborski } 266615bf03eSMark Johnston } 267d3bfc725SMariusz Zaborski 268d3bfc725SMariusz Zaborski hints.ai_family = AF_INET; 269615bf03eSMark Johnston syserr = getaddrinfo("freebsd.org", "25", hintsp, &ais); 270615bf03eSMark Johnston if (syserr != 0) { 271615bf03eSMark Johnston failure |= GETADDRINFO_AF_INET; 272d3bfc725SMariusz Zaborski fprintf(stderr, 273d3bfc725SMariusz Zaborski "Unable to issue [system] getaddrinfo() for AF_UNSPEC: %s\n", 274615bf03eSMark Johnston gai_strerror(syserr)); 275615bf03eSMark Johnston } else { 276615bf03eSMark Johnston caperr = cap_getaddrinfo(capdns, "freebsd.org", "25", hintsp, 277615bf03eSMark Johnston &aic); 278615bf03eSMark Johnston if (caperr == 0) { 279d3bfc725SMariusz Zaborski if (addrinfo_compare(ais, aic)) 280d3bfc725SMariusz Zaborski result |= GETADDRINFO_AF_INET; 281d3bfc725SMariusz Zaborski freeaddrinfo(ais); 282d3bfc725SMariusz Zaborski freeaddrinfo(aic); 283d3bfc725SMariusz Zaborski } 284615bf03eSMark Johnston } 285d3bfc725SMariusz Zaborski 286d3bfc725SMariusz Zaborski hints.ai_family = AF_INET6; 287615bf03eSMark Johnston syserr = getaddrinfo("freebsd.org", "25", hintsp, &ais); 288615bf03eSMark Johnston if (syserr != 0) { 289615bf03eSMark Johnston failure |= GETADDRINFO_AF_INET6; 290d3bfc725SMariusz Zaborski fprintf(stderr, 291d3bfc725SMariusz Zaborski "Unable to issue [system] getaddrinfo() for AF_UNSPEC: %s\n", 292615bf03eSMark Johnston gai_strerror(syserr)); 293615bf03eSMark Johnston } else { 294615bf03eSMark Johnston caperr = cap_getaddrinfo(capdns, "freebsd.org", "25", hintsp, 295615bf03eSMark Johnston &aic); 296615bf03eSMark Johnston if (caperr == 0) { 297d3bfc725SMariusz Zaborski if (addrinfo_compare(ais, aic)) 298d3bfc725SMariusz Zaborski result |= GETADDRINFO_AF_INET6; 299d3bfc725SMariusz Zaborski freeaddrinfo(ais); 300d3bfc725SMariusz Zaborski freeaddrinfo(aic); 301d3bfc725SMariusz Zaborski } 302615bf03eSMark Johnston } 303d3bfc725SMariusz Zaborski 304191d976fSEnji Cooper /* XXX: hardcoded addresses for "google-public-dns-a.google.com". */ 305191d976fSEnji Cooper #define GOOGLE_DNS_IPV4 "8.8.8.8" 306191d976fSEnji Cooper #define GOOGLE_DNS_IPV6 "2001:4860:4860::8888" 307191d976fSEnji Cooper 308191d976fSEnji Cooper inet_pton(AF_INET, GOOGLE_DNS_IPV4, &ip4); 309d3bfc725SMariusz Zaborski hps = gethostbyaddr(&ip4, sizeof(ip4), AF_INET); 310615bf03eSMark Johnston if (hps == NULL) { 311615bf03eSMark Johnston failure |= GETHOSTBYADDR_AF_INET; 312191d976fSEnji Cooper fprintf(stderr, "Unable to resolve %s.\n", GOOGLE_DNS_IPV4); 313615bf03eSMark Johnston } else { 314d3bfc725SMariusz Zaborski hpc = cap_gethostbyaddr(capdns, &ip4, sizeof(ip4), AF_INET); 315d3bfc725SMariusz Zaborski if (hostent_compare(hps, hpc)) 316d3bfc725SMariusz Zaborski result |= GETHOSTBYADDR_AF_INET; 317615bf03eSMark Johnston } 318d3bfc725SMariusz Zaborski 319191d976fSEnji Cooper inet_pton(AF_INET6, GOOGLE_DNS_IPV6, &ip6); 320d3bfc725SMariusz Zaborski hps = gethostbyaddr(&ip6, sizeof(ip6), AF_INET6); 321d3bfc725SMariusz Zaborski if (hps == NULL) { 322615bf03eSMark Johnston failure |= GETHOSTBYADDR_AF_INET6; 323191d976fSEnji Cooper fprintf(stderr, "Unable to resolve %s.\n", GOOGLE_DNS_IPV6); 324615bf03eSMark Johnston } else { 325d3bfc725SMariusz Zaborski hpc = cap_gethostbyaddr(capdns, &ip6, sizeof(ip6), AF_INET6); 326615bf03eSMark Johnston if (hostent_compare(hps, hpc)) { 327615bf03eSMark Johnston caperr = h_errno; 328d3bfc725SMariusz Zaborski result |= GETHOSTBYADDR_AF_INET6; 329615bf03eSMark Johnston } 330d3bfc725SMariusz Zaborski } 331d3bfc725SMariusz Zaborski 332615bf03eSMark Johnston /* 333615bf03eSMark Johnston * If we had any failures, make sure that all lookups failed. If some 334615bf03eSMark Johnston * succeeded and some failed, there's a problem with the test or the DNS 335615bf03eSMark Johnston * and we should not fail silently. 336615bf03eSMark Johnston */ 337615bf03eSMark Johnston if (failure != 0) { 338615bf03eSMark Johnston ATF_REQUIRE_MSG(failure == (GETHOSTBYNAME | 339615bf03eSMark Johnston GETHOSTBYNAME2_AF_INET | GETHOSTBYNAME2_AF_INET6 | 340615bf03eSMark Johnston GETADDRINFO_AF_UNSPEC | GETADDRINFO_AF_INET | 341615bf03eSMark Johnston GETADDRINFO_AF_INET6 | 342615bf03eSMark Johnston GETHOSTBYADDR_AF_INET | GETHOSTBYADDR_AF_INET6), 343615bf03eSMark Johnston "expected all tests to fail, got 0x%x", failure); 344615bf03eSMark Johnston atf_tc_skip( 345615bf03eSMark Johnston "no name lookups succeeded, tests require Internet access"); 346615bf03eSMark Johnston } 347615bf03eSMark Johnston ATF_REQUIRE_MSG(result == expected, 348615bf03eSMark Johnston "expected 0x%x, got 0x%x", expected, result); 349615bf03eSMark Johnston } 350d3bfc725SMariusz Zaborski 351615bf03eSMark Johnston static cap_channel_t * 352615bf03eSMark Johnston cap_dns_init(void) 353615bf03eSMark Johnston { 354615bf03eSMark Johnston cap_channel_t *capcas, *capdns; 355d3bfc725SMariusz Zaborski 356d3bfc725SMariusz Zaborski capcas = cap_init(); 357615bf03eSMark Johnston ATF_REQUIRE(capcas != NULL); 358d3bfc725SMariusz Zaborski 359615bf03eSMark Johnston capdns = cap_service_open(capcas, "system.dns"); 360615bf03eSMark Johnston ATF_REQUIRE(capdns != NULL); 361d3bfc725SMariusz Zaborski 362d3bfc725SMariusz Zaborski cap_close(capcas); 363d3bfc725SMariusz Zaborski 364615bf03eSMark Johnston return (capdns); 365615bf03eSMark Johnston } 366d3bfc725SMariusz Zaborski 367615bf03eSMark Johnston ATF_TC(dns_no_limits); 368615bf03eSMark Johnston ATF_TC_HEAD(dns_no_limits, tc) 369615bf03eSMark Johnston { 370615bf03eSMark Johnston } 371615bf03eSMark Johnston ATF_TC_BODY(dns_no_limits, tc) 372615bf03eSMark Johnston { 373615bf03eSMark Johnston cap_channel_t *capdns; 374615bf03eSMark Johnston 375615bf03eSMark Johnston capdns = cap_dns_init(); 376615bf03eSMark Johnston 377615bf03eSMark Johnston runtest(capdns, 378d3bfc725SMariusz Zaborski (GETHOSTBYNAME | GETHOSTBYNAME2_AF_INET | GETHOSTBYNAME2_AF_INET6 | 379d3bfc725SMariusz Zaborski GETHOSTBYADDR_AF_INET | GETHOSTBYADDR_AF_INET6 | 380615bf03eSMark Johnston GETADDRINFO_AF_UNSPEC | GETADDRINFO_AF_INET | 381615bf03eSMark Johnston GETADDRINFO_AF_INET6)); 382d3bfc725SMariusz Zaborski 383615bf03eSMark Johnston cap_close(capdns); 384615bf03eSMark Johnston } 385d3bfc725SMariusz Zaborski 386615bf03eSMark Johnston ATF_TC(dns_all_limits); 387615bf03eSMark Johnston ATF_TC_HEAD(dns_all_limits, tc) 388615bf03eSMark Johnston { 389615bf03eSMark Johnston } 390615bf03eSMark Johnston ATF_TC_BODY(dns_all_limits, tc) 391615bf03eSMark Johnston { 392615bf03eSMark Johnston cap_channel_t *capdns; 393615bf03eSMark Johnston const char *types[2]; 394615bf03eSMark Johnston int families[2]; 395615bf03eSMark Johnston 396615bf03eSMark Johnston capdns = cap_dns_init(); 397d3bfc725SMariusz Zaborski 398752d135eSMariusz Zaborski types[0] = "NAME2ADDR"; 399752d135eSMariusz Zaborski types[1] = "ADDR2NAME"; 400615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0); 401d3bfc725SMariusz Zaborski families[0] = AF_INET; 402d3bfc725SMariusz Zaborski families[1] = AF_INET6; 403615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0); 404615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 405615bf03eSMark Johnston cap_dns_family_limit(capdns, NULL, 0) == -1); 406615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 407615bf03eSMark Johnston cap_dns_type_limit(capdns, NULL, 0) == -1); 408d3bfc725SMariusz Zaborski 409615bf03eSMark Johnston runtest(capdns, 410d3bfc725SMariusz Zaborski (GETHOSTBYNAME | GETHOSTBYNAME2_AF_INET | GETHOSTBYNAME2_AF_INET6 | 411d3bfc725SMariusz Zaborski GETHOSTBYADDR_AF_INET | GETHOSTBYADDR_AF_INET6 | 412d3bfc725SMariusz Zaborski GETADDRINFO_AF_INET | GETADDRINFO_AF_INET6)); 413d3bfc725SMariusz Zaborski 414d3bfc725SMariusz Zaborski cap_close(capdns); 415615bf03eSMark Johnston } 416d3bfc725SMariusz Zaborski 417615bf03eSMark Johnston ATF_TC(dns_name_limit); 418615bf03eSMark Johnston ATF_TC_HEAD(dns_name_limit, tc) 419615bf03eSMark Johnston { 420615bf03eSMark Johnston } 421615bf03eSMark Johnston ATF_TC_BODY(dns_name_limit, tc) 422615bf03eSMark Johnston { 423615bf03eSMark Johnston cap_channel_t *capdns; 424615bf03eSMark Johnston const char *types[2]; 425615bf03eSMark Johnston int families[2]; 426d3bfc725SMariusz Zaborski 427615bf03eSMark Johnston capdns = cap_dns_init(); 428d3bfc725SMariusz Zaborski 429752d135eSMariusz Zaborski types[0] = "NAME2ADDR"; 430615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 1) == 0); 431752d135eSMariusz Zaborski types[1] = "ADDR2NAME"; 432615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 433615bf03eSMark Johnston cap_dns_type_limit(capdns, types, 2) == -1); 434752d135eSMariusz Zaborski types[0] = "ADDR2NAME"; 435615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 436615bf03eSMark Johnston cap_dns_type_limit(capdns, types, 1) == -1); 437d3bfc725SMariusz Zaborski families[0] = AF_INET; 438d3bfc725SMariusz Zaborski families[1] = AF_INET6; 439615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0); 440d3bfc725SMariusz Zaborski 441615bf03eSMark Johnston runtest(capdns, 442577dff6aSMariusz Zaborski (GETHOSTBYNAME | GETHOSTBYNAME2_AF_INET | GETHOSTBYNAME2_AF_INET6 | 443577dff6aSMariusz Zaborski GETADDRINFO_AF_INET | GETADDRINFO_AF_INET6)); 444d3bfc725SMariusz Zaborski 445d3bfc725SMariusz Zaborski cap_close(capdns); 446615bf03eSMark Johnston } 447d3bfc725SMariusz Zaborski 448615bf03eSMark Johnston ATF_TC(dns_addr_limit); 449615bf03eSMark Johnston ATF_TC_HEAD(dns_addr_limit, tc) 450615bf03eSMark Johnston { 451615bf03eSMark Johnston } 452615bf03eSMark Johnston ATF_TC_BODY(dns_addr_limit, tc) 453615bf03eSMark Johnston { 454615bf03eSMark Johnston cap_channel_t *capdns; 455615bf03eSMark Johnston const char *types[2]; 456615bf03eSMark Johnston int families[2]; 457d3bfc725SMariusz Zaborski 458615bf03eSMark Johnston capdns = cap_dns_init(); 459d3bfc725SMariusz Zaborski 460752d135eSMariusz Zaborski types[0] = "ADDR2NAME"; 461615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 1) == 0); 462752d135eSMariusz Zaborski types[1] = "NAME2ADDR"; 463615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 464615bf03eSMark Johnston cap_dns_type_limit(capdns, types, 2) == -1); 465752d135eSMariusz Zaborski types[0] = "NAME2ADDR"; 466615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 467615bf03eSMark Johnston cap_dns_type_limit(capdns, types, 1) == -1); 468d3bfc725SMariusz Zaborski families[0] = AF_INET; 469d3bfc725SMariusz Zaborski families[1] = AF_INET6; 470615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0); 471d3bfc725SMariusz Zaborski 472615bf03eSMark Johnston runtest(capdns, 473577dff6aSMariusz Zaborski (GETHOSTBYADDR_AF_INET | GETHOSTBYADDR_AF_INET6)); 474615bf03eSMark Johnston 475d3bfc725SMariusz Zaborski cap_close(capdns); 476615bf03eSMark Johnston } 477d3bfc725SMariusz Zaborski 478615bf03eSMark Johnston ATF_TC(dns_inet_limit); 479615bf03eSMark Johnston ATF_TC_HEAD(dns_inet_limit, tc) 480615bf03eSMark Johnston { 481615bf03eSMark Johnston } 482615bf03eSMark Johnston ATF_TC_BODY(dns_inet_limit, tc) 483615bf03eSMark Johnston { 484615bf03eSMark Johnston cap_channel_t *capdns; 485615bf03eSMark Johnston const char *types[2]; 486615bf03eSMark Johnston int families[2]; 487d3bfc725SMariusz Zaborski 488615bf03eSMark Johnston capdns = cap_dns_init(); 489d3bfc725SMariusz Zaborski 490752d135eSMariusz Zaborski types[0] = "NAME2ADDR"; 491752d135eSMariusz Zaborski types[1] = "ADDR2NAME"; 492615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0); 493d3bfc725SMariusz Zaborski families[0] = AF_INET; 494615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 1) == 0); 495d3bfc725SMariusz Zaborski families[1] = AF_INET6; 496615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 497615bf03eSMark Johnston cap_dns_family_limit(capdns, families, 2) == -1); 498d3bfc725SMariusz Zaborski families[0] = AF_INET6; 499615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 500615bf03eSMark Johnston cap_dns_family_limit(capdns, families, 1) == -1); 501d3bfc725SMariusz Zaborski 502615bf03eSMark Johnston runtest(capdns, 503d3bfc725SMariusz Zaborski (GETHOSTBYNAME | GETHOSTBYNAME2_AF_INET | GETHOSTBYADDR_AF_INET | 504d3bfc725SMariusz Zaborski GETADDRINFO_AF_INET)); 505d3bfc725SMariusz Zaborski 506d3bfc725SMariusz Zaborski cap_close(capdns); 507615bf03eSMark Johnston } 508d3bfc725SMariusz Zaborski 509615bf03eSMark Johnston ATF_TC(dns_inet6_limit); 510615bf03eSMark Johnston ATF_TC_HEAD(dns_inet6_limit, tc) 511615bf03eSMark Johnston { 512615bf03eSMark Johnston } 513615bf03eSMark Johnston ATF_TC_BODY(dns_inet6_limit, tc) 514615bf03eSMark Johnston { 515615bf03eSMark Johnston cap_channel_t *capdns; 516615bf03eSMark Johnston const char *types[2]; 517615bf03eSMark Johnston int families[2]; 518d3bfc725SMariusz Zaborski 519615bf03eSMark Johnston capdns = cap_dns_init(); 520d3bfc725SMariusz Zaborski 521752d135eSMariusz Zaborski types[0] = "NAME2ADDR"; 522752d135eSMariusz Zaborski types[1] = "ADDR2NAME"; 523615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0); 524d3bfc725SMariusz Zaborski families[0] = AF_INET6; 525615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 1) == 0); 526d3bfc725SMariusz Zaborski families[1] = AF_INET; 527615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 528615bf03eSMark Johnston cap_dns_family_limit(capdns, families, 2) == -1); 529d3bfc725SMariusz Zaborski families[0] = AF_INET; 530615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 531615bf03eSMark Johnston cap_dns_family_limit(capdns, families, 1) == -1); 532d3bfc725SMariusz Zaborski 533615bf03eSMark Johnston runtest(capdns, 534d3bfc725SMariusz Zaborski (GETHOSTBYNAME2_AF_INET6 | GETHOSTBYADDR_AF_INET6 | 535d3bfc725SMariusz Zaborski GETADDRINFO_AF_INET6)); 536d3bfc725SMariusz Zaborski 537d3bfc725SMariusz Zaborski cap_close(capdns); 538615bf03eSMark Johnston } 539d3bfc725SMariusz Zaborski 540615bf03eSMark Johnston ATF_TC(dns_name_inet_limit); 541615bf03eSMark Johnston ATF_TC_HEAD(dns_name_inet_limit, tc) 542615bf03eSMark Johnston { 543615bf03eSMark Johnston } 544615bf03eSMark Johnston ATF_TC_BODY(dns_name_inet_limit, tc) 545615bf03eSMark Johnston { 546615bf03eSMark Johnston cap_channel_t *capdns; 547615bf03eSMark Johnston const char *types[2]; 548615bf03eSMark Johnston int families[2]; 549d3bfc725SMariusz Zaborski 550615bf03eSMark Johnston capdns = cap_dns_init(); 551d3bfc725SMariusz Zaborski 552752d135eSMariusz Zaborski types[0] = "NAME2ADDR"; 553752d135eSMariusz Zaborski types[1] = "ADDR2NAME"; 554615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0); 555d3bfc725SMariusz Zaborski families[0] = AF_INET; 556d3bfc725SMariusz Zaborski families[1] = AF_INET6; 557615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0); 558752d135eSMariusz Zaborski types[0] = "NAME2ADDR"; 559615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 1) == 0); 560752d135eSMariusz Zaborski types[1] = "ADDR2NAME"; 561615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 562615bf03eSMark Johnston cap_dns_type_limit(capdns, types, 2) == -1); 563752d135eSMariusz Zaborski types[0] = "ADDR2NAME"; 564615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 565615bf03eSMark Johnston cap_dns_type_limit(capdns, types, 1) == -1); 566d3bfc725SMariusz Zaborski families[0] = AF_INET; 567615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 1) == 0); 568d3bfc725SMariusz Zaborski families[1] = AF_INET6; 569615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 570615bf03eSMark Johnston cap_dns_family_limit(capdns, families, 2) == -1); 571d3bfc725SMariusz Zaborski families[0] = AF_INET6; 572615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 573615bf03eSMark Johnston cap_dns_family_limit(capdns, families, 1) == -1); 574d3bfc725SMariusz Zaborski 575615bf03eSMark Johnston runtest(capdns, 576577dff6aSMariusz Zaborski (GETHOSTBYNAME | GETHOSTBYNAME2_AF_INET | GETADDRINFO_AF_INET)); 577d3bfc725SMariusz Zaborski 578d3bfc725SMariusz Zaborski cap_close(capdns); 579615bf03eSMark Johnston } 580d3bfc725SMariusz Zaborski 581615bf03eSMark Johnston ATF_TC(dns_name_inet6_limit); 582615bf03eSMark Johnston ATF_TC_HEAD(dns_name_inet6_limit, tc) 583615bf03eSMark Johnston { 584615bf03eSMark Johnston } 585615bf03eSMark Johnston ATF_TC_BODY(dns_name_inet6_limit, tc) 586615bf03eSMark Johnston { 587615bf03eSMark Johnston cap_channel_t *capdns; 588615bf03eSMark Johnston const char *types[2]; 589615bf03eSMark Johnston int families[2]; 590d3bfc725SMariusz Zaborski 591615bf03eSMark Johnston capdns = cap_dns_init(); 592d3bfc725SMariusz Zaborski 593752d135eSMariusz Zaborski types[0] = "NAME2ADDR"; 594752d135eSMariusz Zaborski types[1] = "ADDR2NAME"; 595615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0); 596d3bfc725SMariusz Zaborski families[0] = AF_INET6; 597d3bfc725SMariusz Zaborski families[1] = AF_INET; 598615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0); 599615bf03eSMark Johnston types[0] = "NAME2ADDR"; 600615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 1) == 0); 601615bf03eSMark Johnston types[1] = "ADDR2NAME"; 602615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 603615bf03eSMark Johnston cap_dns_type_limit(capdns, types, 2) == -1); 604615bf03eSMark Johnston types[0] = "ADDR2NAME"; 605615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 606615bf03eSMark Johnston cap_dns_type_limit(capdns, types, 1) == -1); 607615bf03eSMark Johnston families[0] = AF_INET6; 608615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 1) == 0); 609615bf03eSMark Johnston families[1] = AF_INET; 610615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 611615bf03eSMark Johnston cap_dns_family_limit(capdns, families, 2) == -1); 612d3bfc725SMariusz Zaborski families[0] = AF_INET; 613615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 614615bf03eSMark Johnston cap_dns_family_limit(capdns, families, 1) == -1); 615d3bfc725SMariusz Zaborski 616615bf03eSMark Johnston runtest(capdns, 617577dff6aSMariusz Zaborski (GETHOSTBYNAME2_AF_INET6 | GETADDRINFO_AF_INET6)); 618d3bfc725SMariusz Zaborski 619d3bfc725SMariusz Zaborski cap_close(capdns); 620615bf03eSMark Johnston } 621d3bfc725SMariusz Zaborski 622615bf03eSMark Johnston ATF_TC(dns_addr_inet_limit); 623615bf03eSMark Johnston ATF_TC_HEAD(dns_addr_inet_limit, tc) 624615bf03eSMark Johnston { 625615bf03eSMark Johnston } 626615bf03eSMark Johnston ATF_TC_BODY(dns_addr_inet_limit, tc) 627615bf03eSMark Johnston { 628615bf03eSMark Johnston cap_channel_t *capdns; 629615bf03eSMark Johnston const char *types[2]; 630615bf03eSMark Johnston int families[2]; 631d3bfc725SMariusz Zaborski 632615bf03eSMark Johnston capdns = cap_dns_init(); 633d3bfc725SMariusz Zaborski 634752d135eSMariusz Zaborski types[0] = "NAME2ADDR"; 635752d135eSMariusz Zaborski types[1] = "ADDR2NAME"; 636615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0); 637d3bfc725SMariusz Zaborski families[0] = AF_INET; 638d3bfc725SMariusz Zaborski families[1] = AF_INET6; 639615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0); 640752d135eSMariusz Zaborski types[0] = "ADDR2NAME"; 641615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 1) == 0); 642752d135eSMariusz Zaborski types[1] = "NAME2ADDR"; 643615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 644615bf03eSMark Johnston cap_dns_type_limit(capdns, types, 2) == -1); 645752d135eSMariusz Zaborski types[0] = "NAME2ADDR"; 646615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 647615bf03eSMark Johnston cap_dns_type_limit(capdns, types, 1) == -1); 648d3bfc725SMariusz Zaborski families[0] = AF_INET; 649615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 1) == 0); 650d3bfc725SMariusz Zaborski families[1] = AF_INET6; 651615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 652615bf03eSMark Johnston cap_dns_family_limit(capdns, families, 2) == -1); 653d3bfc725SMariusz Zaborski families[0] = AF_INET6; 654615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 655615bf03eSMark Johnston cap_dns_family_limit(capdns, families, 1) == -1); 656d3bfc725SMariusz Zaborski 657615bf03eSMark Johnston runtest(capdns, GETHOSTBYADDR_AF_INET); 658d3bfc725SMariusz Zaborski 659d3bfc725SMariusz Zaborski cap_close(capdns); 660615bf03eSMark Johnston } 661d3bfc725SMariusz Zaborski 662615bf03eSMark Johnston ATF_TC(dns_addr_inet6_limit); 663615bf03eSMark Johnston ATF_TC_HEAD(dns_addr_inet6_limit, tc) 664615bf03eSMark Johnston { 665615bf03eSMark Johnston } 666615bf03eSMark Johnston ATF_TC_BODY(dns_addr_inet6_limit, tc) 667615bf03eSMark Johnston { 668615bf03eSMark Johnston cap_channel_t *capdns; 669615bf03eSMark Johnston const char *types[2]; 670615bf03eSMark Johnston int families[2]; 671d3bfc725SMariusz Zaborski 672615bf03eSMark Johnston capdns = cap_dns_init(); 673d3bfc725SMariusz Zaborski 674752d135eSMariusz Zaborski types[0] = "NAME2ADDR"; 675752d135eSMariusz Zaborski types[1] = "ADDR2NAME"; 676615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0); 677d3bfc725SMariusz Zaborski families[0] = AF_INET6; 678d3bfc725SMariusz Zaborski families[1] = AF_INET; 679615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0); 680752d135eSMariusz Zaborski types[0] = "ADDR2NAME"; 681615bf03eSMark Johnston ATF_REQUIRE(cap_dns_type_limit(capdns, types, 1) == 0); 682615bf03eSMark Johnston types[1] = "NAME2ADDR"; 683615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 684615bf03eSMark Johnston cap_dns_type_limit(capdns, types, 2) == -1); 685615bf03eSMark Johnston types[0] = "NAME2ADDR"; 686615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 687615bf03eSMark Johnston cap_dns_type_limit(capdns, types, 1) == -1); 688d3bfc725SMariusz Zaborski families[0] = AF_INET6; 689615bf03eSMark Johnston ATF_REQUIRE(cap_dns_family_limit(capdns, families, 1) == 0); 690615bf03eSMark Johnston families[1] = AF_INET; 691615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 692615bf03eSMark Johnston cap_dns_family_limit(capdns, families, 2) == -1); 693615bf03eSMark Johnston families[0] = AF_INET; 694615bf03eSMark Johnston ATF_REQUIRE_ERRNO(ENOTCAPABLE, 695615bf03eSMark Johnston cap_dns_family_limit(capdns, families, 1) == -1); 696d3bfc725SMariusz Zaborski 697615bf03eSMark Johnston runtest(capdns, GETHOSTBYADDR_AF_INET6); 698d3bfc725SMariusz Zaborski 699d3bfc725SMariusz Zaborski cap_close(capdns); 700615bf03eSMark Johnston } 701d3bfc725SMariusz Zaborski 702615bf03eSMark Johnston ATF_TP_ADD_TCS(tp) 703615bf03eSMark Johnston { 704615bf03eSMark Johnston ATF_TP_ADD_TC(tp, dns_no_limits); 705615bf03eSMark Johnston ATF_TP_ADD_TC(tp, dns_all_limits); 706615bf03eSMark Johnston ATF_TP_ADD_TC(tp, dns_name_limit); 707615bf03eSMark Johnston ATF_TP_ADD_TC(tp, dns_addr_limit); 708615bf03eSMark Johnston ATF_TP_ADD_TC(tp, dns_inet_limit); 709615bf03eSMark Johnston ATF_TP_ADD_TC(tp, dns_inet6_limit); 710615bf03eSMark Johnston ATF_TP_ADD_TC(tp, dns_name_inet_limit); 711615bf03eSMark Johnston ATF_TP_ADD_TC(tp, dns_name_inet6_limit); 712615bf03eSMark Johnston ATF_TP_ADD_TC(tp, dns_addr_inet_limit); 713615bf03eSMark Johnston ATF_TP_ADD_TC(tp, dns_addr_inet6_limit); 714d3bfc725SMariusz Zaborski 715615bf03eSMark Johnston return atf_no_error(); 716d3bfc725SMariusz Zaborski } 717