blob: dd7afa62bd2153a35c031f79dd1095c655cf2b74 [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
65 private:
66 friend class DNSClientTest;
67
Paul Stewartbdb02e62012-02-22 16:24:33 -080068 void HandleCompletion();
Paul Stewartc2350ee2011-10-19 12:28:40 -070069 void HandleDNSRead(int fd);
70 void HandleDNSWrite(int fd);
71 void HandleTimeout();
72 void ReceiveDNSReply(int status, struct hostent *hostent);
73 static void ReceiveDNSReplyCB(void *arg, int status, int timeouts,
74 struct hostent *hostent);
75 bool RefreshHandles();
76
Paul Stewartbdb02e62012-02-22 16:24:33 -080077 Error error_;
Paul Stewartc2350ee2011-10-19 12:28:40 -070078 IPAddress address_;
79 std::string interface_name_;
80 std::vector<std::string> dns_servers_;
81 EventDispatcher *dispatcher_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -050082 ClientCallback callback_;
Paul Stewartc2350ee2011-10-19 12:28:40 -070083 int timeout_ms_;
84 bool running_;
Paul Stewartc2350ee2011-10-19 12:28:40 -070085 scoped_ptr<DNSClientState> resolver_state_;
Paul Stewartf582b502012-04-04 21:39:22 -070086 base::CancelableClosure timeout_closure_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -050087 base::WeakPtrFactory<DNSClient> weak_ptr_factory_;
Paul Stewartc2350ee2011-10-19 12:28:40 -070088 Ares *ares_;
89 Time *time_;
90
91 DISALLOW_COPY_AND_ASSIGN(DNSClient);
92};
93
94} // namespace shill
95
96#endif // SHILL_DNS_CLIENT_