blob: e40e07eb6d7ae1d07cc9aae0178d9b1431e9242f [file] [log] [blame]
Paul Stewartc2350ee2011-10-19 12:28:40 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SHILL_DNS_CLIENT_
6#define SHILL_DNS_CLIENT_
7
8#include <string>
9#include <vector>
10
Eric Shienbrood3e20a232012-02-16 11:35:56 -050011#include <base/callback.h>
Paul Stewartf582b502012-04-04 21:39:22 -070012#include <base/cancelable_callback.h>
Paul Stewartc2350ee2011-10-19 12:28:40 -070013#include <base/memory/scoped_ptr.h>
Eric Shienbrood3e20a232012-02-16 11:35:56 -050014#include <base/memory/weak_ptr.h>
Paul Stewartc2350ee2011-10-19 12:28:40 -070015#include <gtest/gtest_prod.h> // for FRIEND_TEST
16
Paul Stewartbdb02e62012-02-22 16:24:33 -080017#include "shill/error.h"
Paul Stewartc2350ee2011-10-19 12:28:40 -070018#include "shill/event_dispatcher.h"
19#include "shill/ip_address.h"
20#include "shill/refptr_types.h"
21
22struct hostent;
23
24namespace shill {
25
26class Ares;
27class Time;
28struct DNSClientState;
29
Paul Stewartbdb02e62012-02-22 16:24:33 -080030// Implements a DNS resolution client that can run asynchronously.
Paul Stewartc2350ee2011-10-19 12:28:40 -070031class DNSClient {
32 public:
Eric Shienbrood3e20a232012-02-16 11:35:56 -050033 typedef base::Callback<void(const Error &, const IPAddress &)> ClientCallback;
Paul Stewartbdb02e62012-02-22 16:24:33 -080034
Paul Stewartc2350ee2011-10-19 12:28:40 -070035 static const char kErrorNoData[];
36 static const char kErrorFormErr[];
37 static const char kErrorServerFail[];
38 static const char kErrorNotFound[];
39 static const char kErrorNotImp[];
40 static const char kErrorRefused[];
41 static const char kErrorBadQuery[];
42 static const char kErrorNetRefused[];
43 static const char kErrorTimedOut[];
44 static const char kErrorUnknown[];
45
46 DNSClient(IPAddress::Family family,
47 const std::string &interface_name,
48 const std::vector<std::string> &dns_servers,
49 int timeout_ms,
50 EventDispatcher *dispatcher,
Eric Shienbrood3e20a232012-02-16 11:35:56 -050051 const ClientCallback &callback);
Paul Stewartf65320c2011-10-13 14:34:52 -070052 virtual ~DNSClient();
Paul Stewartc2350ee2011-10-19 12:28:40 -070053
Paul Stewartbdb02e62012-02-22 16:24:33 -080054 // Returns true if the DNS client started successfully, false otherwise.
55 // If successful, the callback will be called with the result of the
56 // request. If Start() fails and returns false, the callback will not
57 // be called, but the error that caused the failure will be returned in
58 // |error|.
59 virtual bool Start(const std::string &hostname, Error *error);
60
61 // Aborts any running DNS client transaction. This will cancel any callback
62 // invocation.
Paul Stewartf65320c2011-10-13 14:34:52 -070063 virtual void Stop();
Paul Stewartc2350ee2011-10-19 12:28:40 -070064
Prathmesh Prabhu3e452f82013-04-10 16:31:44 -070065 virtual bool IsActive() const;
66
Paul Stewartc2350ee2011-10-19 12:28:40 -070067 private:
68 friend class DNSClientTest;
69
Paul Stewartbdb02e62012-02-22 16:24:33 -080070 void HandleCompletion();
Paul Stewartc2350ee2011-10-19 12:28:40 -070071 void HandleDNSRead(int fd);
72 void HandleDNSWrite(int fd);
73 void HandleTimeout();
74 void ReceiveDNSReply(int status, struct hostent *hostent);
75 static void ReceiveDNSReplyCB(void *arg, int status, int timeouts,
76 struct hostent *hostent);
77 bool RefreshHandles();
78
Paul Stewartbdb02e62012-02-22 16:24:33 -080079 Error error_;
Paul Stewartc2350ee2011-10-19 12:28:40 -070080 IPAddress address_;
81 std::string interface_name_;
82 std::vector<std::string> dns_servers_;
83 EventDispatcher *dispatcher_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -050084 ClientCallback callback_;
Paul Stewartc2350ee2011-10-19 12:28:40 -070085 int timeout_ms_;
86 bool running_;
Paul Stewartc2350ee2011-10-19 12:28:40 -070087 scoped_ptr<DNSClientState> resolver_state_;
Paul Stewartf582b502012-04-04 21:39:22 -070088 base::CancelableClosure timeout_closure_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -050089 base::WeakPtrFactory<DNSClient> weak_ptr_factory_;
Paul Stewartc2350ee2011-10-19 12:28:40 -070090 Ares *ares_;
91 Time *time_;
92
93 DISALLOW_COPY_AND_ASSIGN(DNSClient);
94};
95
96} // namespace shill
97
98#endif // SHILL_DNS_CLIENT_