/* Extended resolver state separate from struct __res_state.
   Copyright (C) 2017-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef RESOLV_STATE_H
#define RESOLV_STATE_H

#include <netinet/in.h>
#include <stdbool.h>
#include <stddef.h>

/* This type corresponds to members of the _res.sort_list array.  */
struct resolv_sortlist_entry
{
  struct in_addr addr;
  uint32_t mask;
};

/* Extended resolver state associated with res_state objects.  Client
   code can reach this state through a struct resolv_context
   object.  */
struct resolv_conf
{
  /* Reference counter.  The object is deallocated once it reaches
     zero.  For internal use within resolv_conf only.  */
  size_t __refcount;

  /* List of IPv4 and IPv6 name server addresses.  */
  const struct sockaddr **nameserver_list;
  size_t nameserver_list_size;

  /* The domain names forming the search list.  */
  const char *const *search_list;
  size_t search_list_size;

  /* IPv4 address preference rules.  */
  const struct resolv_sortlist_entry *sort_list;
  size_t sort_list_size;

  /* _res.options has type unsigned long, but we can only use 32 bits
     for portability across all architectures.  */
  unsigned int options;
  unsigned int retrans;         /* Timeout.  */
  unsigned int retry;           /* Number of times to retry.  */
  unsigned int ndots; /* Dots needed for initial non-search query.  */
};

/* The functions below are for use by the res_init resolv.conf parser
   and the struct resolv_context facility.  */

struct __res_state;

/* Read /etc/resolv.conf and return a configuration object, or NULL if
   /etc/resolv.conf cannot be read due to memory allocation errors.
   If PREINIT is not NULL, some configuration values are taken from the
   struct __res_state object.  */
struct resolv_conf *__resolv_conf_load (struct __res_state *preinit)
  attribute_hidden __attribute__ ((warn_unused_result));

/* Return a configuration object for the current /etc/resolv.conf
   settings, or NULL on failure.  The object is cached.  */
struct resolv_conf *__resolv_conf_get_current (void)
  attribute_hidden __attribute__ ((warn_unused_result));

/* Return the extended resolver state for *RESP, or NULL if it cannot
   be determined.  A call to this function must be paired with a call
   to __resolv_conf_put.  */
struct resolv_conf *__resolv_conf_get (struct __res_state *) attribute_hidden;

/* Converse of __resolv_conf_get.  */
void __resolv_conf_put (struct resolv_conf *) attribute_hidden;

/* Allocate a new struct resolv_conf object and copy the
   pre-configured values from *INIT.  Return NULL on allocation
   failure.  The object must be deallocated using
   __resolv_conf_put.  */
struct resolv_conf *__resolv_conf_allocate (const struct resolv_conf *init)
  attribute_hidden __attribute__ ((nonnull (1), warn_unused_result));

/* Associate an existing extended resolver state with *RESP.  Return
   false on allocation failure.  In addition, update *RESP with the
   overlapping non-extended resolver state.  */
bool __resolv_conf_attach (struct __res_state *, struct resolv_conf *)
  attribute_hidden;

/* Detach the extended resolver state from *RESP.  */
void __resolv_conf_detach (struct __res_state *resp) attribute_hidden;

#endif /* RESOLV_STATE_H */
