From d97311a020253193480a110d43429d64f02436bf Mon Sep 17 00:00:00 2001 From: Ricardo Dias Date: Fri, 12 Feb 2016 16:05:44 +0000 Subject: [PATCH] rgw: updated RGWResolver to use the new DNSResolver class. Signed-off-by: Ricardo Dias --- src/rgw/rgw_resolve.cc | 167 +---------------------------------------- src/rgw/rgw_resolve.h | 6 +- 2 files changed, 8 insertions(+), 165 deletions(-) diff --git a/src/rgw/rgw_resolve.cc b/src/rgw/rgw_resolve.cc index f29a0059849e6..0e5159628cb0a 100644 --- a/src/rgw/rgw_resolve.cc +++ b/src/rgw/rgw_resolve.cc @@ -14,179 +14,20 @@ #include "rgw_common.h" #include "rgw_resolve.h" +#include "common/dns_resolve.h" #define dout_subsys ceph_subsys_rgw -class RGWDNSResolver { - Mutex lock; -#ifdef HAVE_RES_NQUERY - list states; - - int get_state(res_state *ps); - void put_state(res_state s); -#endif - -public: - ~RGWDNSResolver(); - RGWDNSResolver() : lock("RGWDNSResolver") {} - int resolve_cname(const string& hostname, string& cname, bool *found); -}; - -RGWDNSResolver::~RGWDNSResolver() -{ -#ifdef HAVE_RES_NQUERY - list::iterator iter; - for (iter = states.begin(); iter != states.end(); ++iter) { - struct __res_state *s = *iter; - delete s; - } -#endif -} - -#ifdef HAVE_RES_NQUERY -int RGWDNSResolver::get_state(res_state *ps) -{ - lock.Lock(); - if (!states.empty()) { - res_state s = states.front(); - states.pop_front(); - lock.Unlock(); - *ps = s; - return 0; - } - lock.Unlock(); - struct __res_state *s = new struct __res_state; - s->options = 0; - if (res_ninit(s) < 0) { - delete s; - dout(0) << "ERROR: failed to call res_ninit()" << dendl; - return -EINVAL; - } - *ps = s; - return 0; -} - -void RGWDNSResolver::put_state(res_state s) -{ - Mutex::Locker l(lock); - states.push_back(s); -} -#endif - -int RGWDNSResolver::resolve_cname(const string& hostname, string& cname, bool *found) -{ - *found = false; - -#ifdef HAVE_RES_NQUERY - res_state res; - int r = get_state(&res); - if (r < 0) { - return r; - } -#endif - - int ret; - -#define LARGE_ENOUGH_DNS_BUFSIZE 1024 - unsigned char buf[LARGE_ENOUGH_DNS_BUFSIZE]; - -#define MAX_FQDN_SIZE 255 - char host[MAX_FQDN_SIZE + 1]; - const char *origname = hostname.c_str(); - unsigned char *pt, *answer; - unsigned char *answend; - int len; - -#ifdef HAVE_RES_NQUERY - len = res_nquery(res, origname, C_IN, T_CNAME, buf, sizeof(buf)); -#else - { -# ifndef HAVE_THREAD_SAFE_RES_QUERY - Mutex::Locker l(lock); -# endif - len = res_query(origname, C_IN, T_CNAME, buf, sizeof(buf)); - } -#endif - if (len < 0) { - dout(20) << "res_query() failed" << dendl; - ret = 0; - goto done; - } - - answer = buf; - pt = answer + sizeof(HEADER); - answend = answer + len; - - /* read query */ - if ((len = dn_expand(answer, answend, pt, host, sizeof(host))) < 0) { - dout(0) << "ERROR: dn_expand() failed" << dendl; - ret = -EINVAL; - goto done; - } - pt += len; - - if (pt + 4 > answend) { - dout(0) << "ERROR: bad reply" << dendl; - ret = -EIO; - goto done; - } - - int type; - GETSHORT(type, pt); - - if (type != T_CNAME) { - dout(0) << "ERROR: failed response type: type=%d (was expecting " << T_CNAME << ")" << dendl; - ret = -EIO; - goto done; - } - - pt += INT16SZ; /* class */ - - /* read answer */ - - if ((len = dn_expand(answer, answend, pt, host, sizeof(host))) < 0) { - ret = 0; - goto done; - } - pt += len; - dout(20) << "name=" << host << dendl; - - if (pt + 10 > answend) { - dout(0) << "ERROR: bad reply" << dendl; - ret = -EIO; - goto done; - } - - GETSHORT(type, pt); - pt += INT16SZ; /* class */ - pt += INT32SZ; /* ttl */ - pt += INT16SZ; /* size */ - - if ((len = dn_expand(answer, answend, pt, host, sizeof(host))) < 0) { - ret = 0; - goto done; - } - dout(20) << "cname host=" << host << dendl; - cname = host; - - *found = true; - ret = 0; -done: -#ifdef HAVE_RES_NQUERY - put_state(res); -#endif - return ret; -} RGWResolver::~RGWResolver() { - delete resolver; } + RGWResolver::RGWResolver() { - resolver = new RGWDNSResolver; + resolver = DNSResolver::get_instance(); } int RGWResolver::resolve_cname(const string& hostname, string& cname, bool *found) { - return resolver->resolve_cname(hostname, cname, found); + return resolver->resolve_cname(g_ceph_context, hostname, &cname, found); } RGWResolver *rgw_resolver; diff --git a/src/rgw/rgw_resolve.h b/src/rgw/rgw_resolve.h index 7e127f8554b3f..6e00aaa63c456 100644 --- a/src/rgw/rgw_resolve.h +++ b/src/rgw/rgw_resolve.h @@ -6,10 +6,12 @@ #include "rgw_common.h" -class RGWDNSResolver; +namespace ceph { + class DNSResolver; +} class RGWResolver { - RGWDNSResolver *resolver; + DNSResolver *resolver; public: ~RGWResolver(); -- 2.39.5