// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.net.name;

using fuchsia.net;
using zx;

/// Provides administration controls over name resolution settings.
@discoverable
protocol LookupAdmin {
    /// Sets the DNS servers to `servers`
    ///
    /// + request `servers` The list of servers to use for domain name resolution, in priority
    /// order. An empty list means no servers will be used and name resolution may fail. Each
    /// `SocketAddress` in `servers` must be a valid unicast socket address. The list of servers
    /// will be deduplicated.
    /// * error Returns `ZX_ERR_INVALID_ARGS` if any of the provided addresses does not meet the
    /// conditions above.
    SetDnsServers(struct {
        servers vector<fuchsia.net.SocketAddress>:MAX;
    }) -> (struct {}) error zx.status;

    /// Gets the DNS servers currently in use to resolve name lookups.
    /// - response `servers` The list of servers in use by `LookupAdmin`, in priority order.
    GetDnsServers() -> (struct {
        servers vector<fuchsia.net.SocketAddress>:MAX;
    });
};
