307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉/*
bd911976d51f102751848568ccf56592fd5f6d77Tinderbox User * Copyright (C) 2009, 2011-2014, 2016, 2017 Internet Systems Consortium, Inc. ("ISC")
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉/*! \file */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉/*
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * All rights reserved.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 *
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * Redistribution and use in source and binary forms, with or without
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * modification, are permitted provided that the following conditions
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * are met:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * 1. Redistributions of source code must retain the above copyright
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * notice, this list of conditions and the following disclaimer.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * 2. Redistributions in binary form must reproduce the above copyright
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * notice, this list of conditions and the following disclaimer in the
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * documentation and/or other materials provided with the distribution.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * 3. Neither the name of the project nor the names of its contributors
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * may be used to endorse or promote products derived from this software
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * without specific prior written permission.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 *
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * SUCH DAMAGE.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉/**
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * getnameinfo() returns the hostname for the struct sockaddr sa which is
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * salen bytes long. The hostname is of length hostlen and is returned via
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * *host. The maximum length of the hostname is 1025 bytes: #NI_MAXHOST.
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater *
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * The name of the service associated with the port number in sa is
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * returned in *serv. It is servlen bytes long. The maximum length of the
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * service name is #NI_MAXSERV - 32 bytes.
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater *
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * The flags argument sets the following bits:
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater *
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * \li #NI_NOFQDN:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * A fully qualified domain name is not required for local hosts.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * The local part of the fully qualified domain name is returned
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * instead.
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater *
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * \li #NI_NUMERICHOST
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * Return the address in numeric form, as if calling inet_ntop(),
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * instead of a host name.
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater *
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * \li #NI_NAMEREQD
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * A name is required. If the hostname cannot be found in the DNS
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * and this flag is set, a non-zero error code is returned. If the
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * hostname is not found and the flag is not set, the address is
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * returned in numeric form.
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater *
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * \li #NI_NUMERICSERV
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * The service name is returned as a digit string representing the
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * port number.
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater *
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * \li #NI_DGRAM
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * Specifies that the service being looked up is a datagram
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * service, and causes getservbyport() to be called with a second
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * argument of "udp" instead of its default of "tcp". This is
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * required for the few ports (512-514) that have different
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * services for UDP and TCP.
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater *
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * \section getnameinfo_return Return Values
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater *
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * getnameinfo() returns 0 on success or a non-zero error code if
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * an error occurs.
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater *
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * \section getname_see See Also
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater *
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater * RFC3493, getservbyport(),
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * getnamebyaddr(). inet_ntop().
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <config.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <stdio.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <string.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <isc/netaddr.h>
e2a61b7bb2ae967530552a2f829e07494555e886Mark Andrews#include <isc/print.h>
e2a61b7bb2ae967530552a2f829e07494555e886Mark Andrews#include <isc/sockaddr.h>
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt#include <isc/string.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <isc/util.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <dns/byaddr.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <dns/client.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <dns/fixedname.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <dns/name.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <dns/rdata.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <dns/rdataset.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <dns/rdatastruct.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <dns/result.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <irs/context.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <irs/netdb.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#define SUCCESS 0
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉/*% afd structure definition */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉static struct afd {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 int a_af;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 size_t a_addrlen;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 size_t a_socklen;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉} afdl [] = {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /*!
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * First entry is linked last...
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 { AF_INET, sizeof(struct in_addr), sizeof(struct sockaddr_in) },
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 { AF_INET6, sizeof(struct in6_addr), sizeof(struct sockaddr_in6) },
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 {0, 0, 0},
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉};
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉/*!
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * The test against 0 is there to keep the Solaris compiler
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * from complaining about "end-of-loop code not reached".
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#define ERR(code) \
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 do { result = (code); \
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (result != 0) goto cleanup; \
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 } while (0)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉int
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrewsgetnameinfo(const struct sockaddr *sa, IRS_GETNAMEINFO_SOCKLEN_T salen,
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews char *host, IRS_GETNAMEINFO_BUFLEN_T hostlen,
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews char *serv, IRS_GETNAMEINFO_BUFLEN_T servlen,
d8f2dd46cba3a16c2433e85657a5b15543013ca6Mark Andrews IRS_GETNAMEINFO_FLAGS_T flags)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉{
33c14ca653cfa827aef8b236d3110a6bce8fb6cfMark Andrews struct afd *afd = NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 struct servent *sp;
0874abad14e3e9ecfc3dc1a1a2b9969f2f027724Mark Andrews unsigned short port = 0;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#ifdef IRS_PLATFORM_HAVESALEN
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 size_t len;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#endif
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 int family, i;
0874abad14e3e9ecfc3dc1a1a2b9969f2f027724Mark Andrews const void *addr = NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 char *p;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#if 0
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 unsigned long v4a;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 unsigned char pfx;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#endif
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 char numserv[sizeof("65000")];
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 char numaddr[sizeof("abcd:abcd:abcd:abcd:abcd:abcd:255.255.255.255")
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 + 1 + sizeof("4294967295")];
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 const char *proto;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 int result = SUCCESS;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (sa == NULL)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_FAIL);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#ifdef IRS_PLATFORM_HAVESALEN
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 len = sa->sa_len;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (len != salen)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_FAIL);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#endif
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 family = sa->sa_family;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 for (i = 0; afdl[i].a_af; i++)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (afdl[i].a_af == family) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 afd = &afdl[i];
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 goto found;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_FAMILY);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 found:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (salen != afd->a_socklen)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_FAIL);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 switch (family) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case AF_INET:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 port = ((const struct sockaddr_in *)sa)->sin_port;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 addr = &((const struct sockaddr_in *)sa)->sin_addr.s_addr;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 break;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case AF_INET6:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 port = ((const struct sockaddr_in6 *)sa)->sin6_port;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 addr = ((const struct sockaddr_in6 *)sa)->sin6_addr.s6_addr;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 break;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 default:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 INSIST(0);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 proto = (flags & NI_DGRAM) ? "udp" : "tcp";
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (serv == NULL || servlen == 0U) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /*
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * Caller does not want service.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 } else if ((flags & NI_NUMERICSERV) != 0 ||
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 (sp = getservbyport(port, proto)) == NULL) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 snprintf(numserv, sizeof(numserv), "%d", ntohs(port));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if ((strlen(numserv) + 1) > servlen)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_OVERFLOW);
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt strlcpy(serv, numserv, servlen);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 } else {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if ((strlen(sp->s_name) + 1) > servlen)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_OVERFLOW);
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt strlcpy(serv, sp->s_name, servlen);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#if 0
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 switch (sa->sa_family) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case AF_INET:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 v4a = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 flags |= NI_NUMERICHOST;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 v4a >>= IN_CLASSA_NSHIFT;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (v4a == 0 || v4a == IN_LOOPBACKNET)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 flags |= NI_NUMERICHOST;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 break;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case AF_INET6:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 pfx = ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr[0];
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (pfx == 0 || pfx == 0xfe || pfx == 0xff)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 flags |= NI_NUMERICHOST;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 break;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#endif
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (host == NULL || hostlen == 0U) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /*
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * do nothing in this case.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * in case you are wondering if "&&" is more correct than
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * "||" here: RFC3493 says that host == NULL or hostlen == 0
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * means that the caller does not want the result.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 } else if ((flags & NI_NUMERICHOST) != 0) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (inet_ntop(afd->a_af, addr, numaddr, sizeof(numaddr))
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 == NULL)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_SYSTEM);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#if defined(IRS_HAVE_SIN6_SCOPE_ID)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (afd->a_af == AF_INET6 &&
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ((const struct sockaddr_in6 *)sa)->sin6_scope_id) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 char *p = numaddr + strlen(numaddr);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 const char *stringscope = NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#ifdef VENDOR_SPECIFIC
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /*
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * Vendors may want to add support for
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * non-numeric scope identifier.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 stringscope = foo;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#endif
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (stringscope == NULL) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 snprintf(p, sizeof(numaddr) - (p - numaddr),
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 "%%%u",
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ((const struct sockaddr_in6 *)sa)->sin6_scope_id);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 } else {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 snprintf(p, sizeof(numaddr) - (p - numaddr),
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 "%%%s", stringscope);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#endif
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (strlen(numaddr) + 1 > hostlen)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_OVERFLOW);
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt strlcpy(host, numaddr, hostlen);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 } else {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_netaddr_t netaddr;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_fixedname_t ptrfname;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_name_t *ptrname;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 irs_context_t *irsctx = NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_client_t *client;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_boolean_t found = ISC_FALSE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_namelist_t answerlist;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_rdataset_t *rdataset;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_region_t hostregion;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 char hoststr[1024]; /* is this enough? */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_result_t iresult;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /* Get IRS context and the associated DNS client object */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 iresult = irs_context_get(&irsctx);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (iresult != ISC_R_SUCCESS)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_FAIL);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 client = irs_context_getdnsclient(irsctx);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /* Make query name */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_netaddr_fromsockaddr(&netaddr, (const isc_sockaddr_t *)sa);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_fixedname_init(&ptrfname);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ptrname = dns_fixedname_name(&ptrfname);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 iresult = dns_byaddr_createptrname2(&netaddr, 0, ptrname);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (iresult != ISC_R_SUCCESS)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_FAIL);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /* Get the PTR RRset */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ISC_LIST_INIT(answerlist);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 iresult = dns_client_resolve(client, ptrname,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_rdataclass_in,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_rdatatype_ptr,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 DNS_CLIENTRESOPT_ALLOWRUN,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 &answerlist);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 switch (iresult) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case ISC_R_SUCCESS:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /*
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * a 'non-existent' error is not necessarily fatal for
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * getnameinfo().
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case DNS_R_NCACHENXDOMAIN:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case DNS_R_NCACHENXRRSET:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 break;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case DNS_R_SIGINVALID:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case DNS_R_SIGEXPIRED:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case DNS_R_SIGFUTURE:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case DNS_R_KEYUNAUTHORIZED:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case DNS_R_MUSTBESECURE:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case DNS_R_COVERINGNSEC:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case DNS_R_NOTAUTHORITATIVE:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case DNS_R_NOVALIDKEY:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case DNS_R_NOVALIDDS:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 case DNS_R_NOVALIDSIG:
0401db53f9f3481ea859f37845772dd3209e0f8aMark Andrews /*
0401db53f9f3481ea859f37845772dd3209e0f8aMark Andrews * Don't use ERR as GCC 7 wants to raise a
0401db53f9f3481ea859f37845772dd3209e0f8aMark Andrews * warning with ERR about possible falling
0401db53f9f3481ea859f37845772dd3209e0f8aMark Andrews * through which is impossible.
0401db53f9f3481ea859f37845772dd3209e0f8aMark Andrews */
0401db53f9f3481ea859f37845772dd3209e0f8aMark Andrews result = EAI_INSECUREDATA;
0401db53f9f3481ea859f37845772dd3209e0f8aMark Andrews goto cleanup;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 default:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_FAIL);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /* Parse the answer for the hostname */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 for (ptrname = ISC_LIST_HEAD(answerlist); ptrname != NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ptrname = ISC_LIST_NEXT(ptrname, link)) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 for (rdataset = ISC_LIST_HEAD(ptrname->list);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 rdataset != NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 rdataset = ISC_LIST_NEXT(rdataset, link)) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (!dns_rdataset_isassociated(rdataset))
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 continue;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (rdataset->type != dns_rdatatype_ptr)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 continue;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 for (iresult = dns_rdataset_first(rdataset);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 iresult == ISC_R_SUCCESS;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 iresult = dns_rdataset_next(rdataset)) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_rdata_t rdata;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_rdata_ptr_t rdata_ptr;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_buffer_t b;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_rdata_init(&rdata);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_rdataset_current(rdataset, &rdata);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_rdata_tostruct(&rdata, &rdata_ptr,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 NULL);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_buffer_init(&b, hoststr,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 sizeof(hoststr));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 iresult =
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_name_totext(&rdata_ptr.ptr,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ISC_TRUE, &b);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_rdata_freestruct(&rdata_ptr);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (iresult == ISC_R_SUCCESS) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /*
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * We ignore the rest of the
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * answer. After all,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * getnameinfo() can return
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * at most one hostname.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 found = ISC_TRUE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_buffer_usedregion(
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 &b, &hostregion);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 goto ptrfound;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ptrfound:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_client_freeresanswer(client, &answerlist);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (found) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if ((flags & NI_NOFQDN) != 0) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 p = strchr(hoststr, '.');
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (p)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 *p = '\0';
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (hostregion.length + 1 > hostlen)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_OVERFLOW);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 snprintf(host, hostlen, "%.*s",
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 (int)hostregion.length,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 (char *)hostregion.base);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 } else {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if ((flags & NI_NAMEREQD) != 0)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_NONAME);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (inet_ntop(afd->a_af, addr, numaddr,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 sizeof(numaddr)) == NULL)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_SYSTEM);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if ((strlen(numaddr) + 1) > hostlen)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ERR(EAI_OVERFLOW);
7cd594b8427fe742d44295790ba367e1de22a47dEvan Hunt strlcpy(host, numaddr, hostlen);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 result = SUCCESS;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 cleanup:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (result);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}