// 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;

/// Provides a hanging get interface to watch for DNS servers configuration.
@discoverable
closed protocol DnsServerWatcher {
    /// Returns a list of DNS servers.
    ///
    /// First call always returns a snapshot of the current list of servers or blocks if an empty
    /// list would be returned. Subsequent calls will block until the list of servers changes.
    ///
    /// The list of servers changes over time by configuration or network topology changes,
    /// expiration, etc. Callers must repeatedly call `WatchServers` and replace any previously
    /// returned `servers` with new ones to avoid using stale or expired entries.
    ///
    /// It is invalid to call this method while a previous call is pending. Doing so will cause the
    /// server end of the protocol to be closed.
    ///
    /// - response `servers` The list of servers to use for DNS resolution, in priority order.
    strict WatchServers() -> (struct {
        servers vector<DnsServer>:MAX;
    });
};
