CHECK_SYMBOL_EXISTS(__u64 "sys/types.h;linux/types.h" HAVE___U64)
CHECK_SYMBOL_EXISTS(__s64 "sys/types.h;linux/types.h" HAVE___S64)
+CHECK_SYMBOL_EXISTS(res_nquery "resolv.h" HAVE_RES_NQUERY)
+
set(CEPH_MAN_DIR "share/man" CACHE STRING "Install location for man pages (relative to prefix).")
option(ENABLE_SHARED "build shared libraries" ON)
#option for CephFS
option(WITH_CEPHFS "CephFS is enabled" ON)
+option(WITH_THREAD_SAFE_RES_QUERY "res_query is thread safe" OFF)
+if(WITH_THREAD_SAFE_RES_QUERY)
+ set(HAVE_THREAD_SAFE_RES_QUERY 1 CACHE INTERNAL "Thread safe res_query supported.")
+endif(WITH_THREAD_SAFE_RES_QUERY)
+
# Now create a useable config.h
configure_file(
${PROJECT_SOURCE_DIR}/src/include/config-h.in.cmake
#cmakedefine HAVE_GPERFTOOLS_MALLOC_EXTENSION_H
#cmakedefine HAVE_GPERFTOOLS_PROFILER_H
+/* res_nquery is supported */
+#cmakedefine HAVE_RES_NQUERY
+
+/* res_query is thread safe */
+#cmakedefine HAVE_THREAD_SAFE_RES_QUERY
+
#endif /* CONFIG_H */
#define dout_subsys ceph_subsys_rgw
class RGWDNSResolver {
- list<res_state> states;
Mutex lock;
+#ifdef HAVE_RES_NQUERY
+ list<res_state> states;
int get_state(res_state *ps);
void put_state(res_state s);
-
+#endif
public:
~RGWDNSResolver();
RGWDNSResolver::~RGWDNSResolver()
{
+#ifdef HAVE_RES_NQUERY
list<res_state>::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();
Mutex::Locker l(lock);
states.push_back(s);
}
-
+#endif
int RGWDNSResolver::resolve_cname(const string& hostname, string& cname, bool *found)
{
- res_state res;
-
*found = false;
+#ifdef HAVE_RES_NQUERY
+ res_state res;
int r = get_state(&res);
if (r < 0) {
return r;
}
+#endif
int ret;
const char *origname = hostname.c_str();
unsigned char *pt, *answer;
unsigned char *answend;
- int len = res_nquery(res, origname, C_IN, T_CNAME, buf, sizeof(buf));
+ 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;
*found = true;
ret = 0;
done:
+#ifdef HAVE_RES_NQUERY
put_state(res);
+#endif
return ret;
}