/* Copyright (C) 2015 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program 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 General Public License for more details.
*/

#pragma once

#include "android/utils/compiler.h"

#include <stddef.h>
#include <stdint.h>

ANDROID_BEGIN_HEADER

// Maximum number of DNS servers supported by the Android emulator.
#define ANDROID_MAX_DNS_SERVERS 4

// List of values returned by android_dns_get_servers() to indicate an
// error:
//
// kAndroidDnsErrorBadServer
//    Either that the server list is malformed
//    or that one of the server names could not be resolved.
//
// kAndroidDnsErrorTooManyServers
//    There are too many servers in the list.
//
enum {
    kAndroidDnsErrorBadServer = -1,
    kAndroidDnsErrorTooManyServers = -2,
};

// Retrieve the IP addresses of DNS servers to be used during emulation.
// |dnsServersOption| is an optional string that corresponds to the -dns-server
// command-line option. If not empty, this must be a comma-separated list of
// DNS server names or addresses. If the list is invalid or the parameter
// NULL or empty, the list of system DNS servers will be probed instead.
// |dnsServerIps| is an array of ANDROID_MAX_DNS_SERVERS 32-bit IP addresses
// that will be filled by the function on success. Return the number of
// IP addresses filled in the array, or a negative kAndroidDnsErrorXXX value
// on error. A return value of 0 is possible and means no DNS server was found.
// A negative value corresponds to a severe error which should stop emulation
// (the function will have printed a message to the console to explain why
// before returning).
int android_dns_get_servers(const char* dnsServersOption,
                            uint32_t* dnsServerIps);

// TODO: Remove the declarations below once QEMU2 uses
//       android_dns_get_servers().

/* Retrieve DNS servers configured by the host system and place them in a
 * provided |buffer|. Up to |bufferSize| DNS servers are retrieved. On success
 * the number of servers is returned, on failure a negative value is returned.
 */
int android_dns_get_system_servers(uint32_t* buffer, size_t bufferSize);

/* Parse a string containing a list of DNS servers separated by comma and place
 * the servers into the provided |buffer|. Up to |bufferSize| servers are
 * parsed. Returns the number of servers added to |buffer| or a negative value
 * on error. Currently the following negative return values have special
 * meaning:
 * -2 Number of servers in |servers| string exceeds |bufferSize|
 */
int android_dns_parse_servers(const char* servers,
                              uint32_t* buffer,
                              size_t bufferSize);

ANDROID_END_HEADER
