blob: bd2d1d482ea805df62ecc76626b8c0e884817e1a [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 int kDefaultTimeoutMS;
36 static const char kErrorNoData[];
37 static const char kErrorFormErr[];
38 static const char kErrorServerFail[];
39 static const char kErrorNotFound[];
40 static const char kErrorNotImp[];
41 static const char kErrorRefused[];
42 static const char kErrorBadQuery[];
43 static const char kErrorNetRefused[];
44 static const char kErrorTimedOut[];
45 static const char kErrorUnknown[];
46
47 DNSClient(IPAddress::Family family,
48 const std::string &interface_name,
49 const std::vector<std::string> &dns_servers,
50 int timeout_ms,
51 EventDispatcher *dispatcher,
Eric Shienbrood3e20a232012-02-16 11:35:56 -050052 const ClientCallback &callback);
Paul Stewartf65320c2011-10-13 14:34:52 -070053 virtual ~DNSClient();
Paul Stewartc2350ee2011-10-19 12:28:40 -070054
Paul Stewartbdb02e62012-02-22 16:24:33 -080055 // Returns true if the DNS client started successfully, false otherwise.
56 // If successful, the callback will be called with the result of the
57 // request. If Start() fails and returns false, the callback will not
58 // be called, but the error that caused the failure will be returned in
59 // |error|.
60 virtual bool Start(const std::string &hostname, Error *error);
61
62 // Aborts any running DNS client transaction. This will cancel any callback
63 // invocation.
Paul Stewartf65320c2011-10-13 14:34:52 -070064 virtual void Stop();
Paul Stewartc2350ee2011-10-19 12:28:40 -070065
66 private:
67 friend class DNSClientTest;
68
Paul Stewartbdb02e62012-02-22 16:24:33 -080069 void HandleCompletion();
Paul Stewartc2350ee2011-10-19 12:28:40 -070070 void HandleDNSRead(int fd);
71 void HandleDNSWrite(int fd);
72 void HandleTimeout();
73 void ReceiveDNSReply(int status, struct hostent *hostent);
74 static void ReceiveDNSReplyCB(void *arg, int status, int timeouts,
75 struct hostent *hostent);
76 bool RefreshHandles();
77
Paul Stewartbdb02e62012-02-22 16:24:33 -080078 Error error_;
Paul Stewartc2350ee2011-10-19 12:28:40 -070079 IPAddress address_;
80 std::string interface_name_;
81 std::vector<std::string> dns_servers_;
82 EventDispatcher *dispatcher_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -050083 ClientCallback callback_;
Paul Stewartc2350ee2011-10-19 12:28:40 -070084 int timeout_ms_;
85 bool running_;
Paul Stewartc2350ee2011-10-19 12:28:40 -070086 scoped_ptr<DNSClientState> resolver_state_;
Paul Stewartf582b502012-04-04 21:39:22 -070087 base::CancelableClosure timeout_closure_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -050088 base::WeakPtrFactory<DNSClient> weak_ptr_factory_;
Paul Stewartc2350ee2011-10-19 12:28:40 -070089 Ares *ares_;
90 Time *time_;
91
92 DISALLOW_COPY_AND_ASSIGN(DNSClient);
93};
94
95} // namespace shill
96
97#endif // SHILL_DNS_CLIENT_