X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=server%2FDnsProxyListener.h;h=ec6c262b9c1f5dcc3cf0c8bcf7a21c1d948e5587;hb=6c97716e41d751cb0ebf49c93943923a356d3a96;hp=bd7251d62e5785eec5f958de27073820dd9b2143;hpb=699aa99dd9bdf850fc70b1a531eb11224304c766;p=android-x86%2Fsystem-netd.git diff --git a/server/DnsProxyListener.h b/server/DnsProxyListener.h index bd7251d..ec6c262 100644 --- a/server/DnsProxyListener.h +++ b/server/DnsProxyListener.h @@ -18,8 +18,10 @@ #define _DNSPROXYLISTENER_H__ #include // struct android_net_context +#include #include +#include "android/net/metrics/IDnsEventListener.h" #include "NetdCommand.h" class NetworkController; @@ -29,15 +31,24 @@ public: explicit DnsProxyListener(const NetworkController* netCtrl); virtual ~DnsProxyListener() {} + // Returns the binder reference to the DNS listener service, attempting to fetch it if we do not + // have it already. This method mutates internal state without taking a lock and must only be + // called on one thread. This is safe because we only call this in the runCommand methods of our + // commands, which are only called by FrameworkListener::onDataAvailable, which is only called + // from SocketListener::runListener, which is a single-threaded select loop. + android::sp getDnsEventListener(); + private: const NetworkController *mNetCtrl; + android::sp mDnsEventListener; + class GetAddrInfoCmd : public NetdCommand { public: - GetAddrInfoCmd(const DnsProxyListener* dnsProxyListener); + GetAddrInfoCmd(DnsProxyListener* dnsProxyListener); virtual ~GetAddrInfoCmd() {} int runCommand(SocketClient *c, int argc, char** argv); private: - const DnsProxyListener* mDnsProxyListener; + DnsProxyListener* mDnsProxyListener; }; class GetAddrInfoHandler { @@ -47,7 +58,8 @@ private: char* host, char* service, struct addrinfo* hints, - const struct android_net_context& netcontext); + const struct android_net_context& netcontext, + const android::sp& listener); ~GetAddrInfoHandler(); static void* threadStart(void* handler); @@ -60,16 +72,17 @@ private: char* mService; // owned struct addrinfo* mHints; // owned struct android_net_context mNetContext; + android::sp mDnsEventListener; }; /* ------ gethostbyname ------*/ class GetHostByNameCmd : public NetdCommand { public: - GetHostByNameCmd(const DnsProxyListener* dnsProxyListener); + GetHostByNameCmd(DnsProxyListener* dnsProxyListener); virtual ~GetHostByNameCmd() {} int runCommand(SocketClient *c, int argc, char** argv); private: - const DnsProxyListener* mDnsProxyListener; + DnsProxyListener* mDnsProxyListener; }; class GetHostByNameHandler { @@ -78,7 +91,8 @@ private: char *name, int af, unsigned netId, - uint32_t mark); + uint32_t mark, + const android::sp& listener); ~GetHostByNameHandler(); static void* threadStart(void* handler); void start(); @@ -89,6 +103,7 @@ private: int mAf; unsigned mNetId; uint32_t mMark; + android::sp mDnsEventListener; }; /* ------ gethostbyaddr ------*/