Removing the --disable-nbdns config option.

- Asynchronous DNS resolver support assumed by default
- HAVE_ASYNC_DNS, HAVE_NB_DNS, and USE_NB_DNS preprocessor definitions
  removed
- In the process, I added FindBIND and CheckNameserCompat CMake modules
This commit is contained in:
Jon Siwek 2010-10-19 15:13:28 -05:00
parent 13569aaab7
commit 570ee48cd9
11 changed files with 111 additions and 86 deletions

View file

@ -37,16 +37,16 @@ set(ENABLE_DEBUG false
set(ENABLE_PERFTOOLS false set(ENABLE_PERFTOOLS false
CACHE STRING "use Google's perftools" FORCE) CACHE STRING "use Google's perftools" FORCE)
set(USE_NB_DNS true
CACHE BOOL "Use non-blocking DNS support" FORCE)
## ##
## Configure Dependencies for Non-Standard Paths ## Configure Dependencies for Non-Standard Paths
## ##
# Uncomment to specific a custom prefix containing the OpenSSL installation. # Uncomment to specify a custom prefix containing the OpenSSL installation.
#set(OPENSSL_ROOT_DIR path/to/your/openssl) #set(OPENSSL_ROOT_DIR path/to/your/openssl)
# Uncomment to specify a custom prefix containing the BIND installation.
#set(BIND_ROOT_DIR path/to/your/bind)
# Uncomment to specify a custom prefix that contains the libpcap installation. # Uncomment to specify a custom prefix that contains the libpcap installation.
#set(PCAP_ROOT path/to/your/pcap) #set(PCAP_ROOT path/to/your/pcap)
@ -59,7 +59,6 @@ set(USE_NB_DNS true
# TODO: more dependencies: # TODO: more dependencies:
# Flex # Flex
# Bison # Bison
# BIND8
# Perl? # Perl?
# BinPAC # BinPAC
# #

View file

@ -43,11 +43,13 @@ file(STRINGS "${CMAKE_SOURCE_DIR}/VERSION" VERSION LIMIT_COUNT 1)
find_package(FLEX REQUIRED) find_package(FLEX REQUIRED)
find_package(BISON REQUIRED) find_package(BISON REQUIRED)
find_package(PCAP REQUIRED) find_package(PCAP REQUIRED)
include_directories(BEFORE ${PCAP_INCLUDE_DIR})
find_package(OpenSSL REQUIRED) find_package(OpenSSL REQUIRED)
include_directories(BEFORE ${OPENSSL_INCLUDE_DIR}) find_package(BIND REQUIRED)
include_directories(BEFORE
${PCAP_INCLUDE_DIR}
${OPENSSL_INCLUDE_DIR}
${BIND_INCLUDE_DIR})
# TODO: find bind8 lib?
# TODO: optional libmagic # TODO: optional libmagic
# TODO: optional libGeoIP # TODO: optional libGeoIP
# TODO: optional libz # TODO: optional libz
@ -64,12 +66,8 @@ include(CheckHeaders)
include(CheckFunctions) include(CheckFunctions)
include(MiscTests) include(MiscTests)
include(PCAPTests) include(PCAPTests)
#TODO: use/integrate find_package(OpenSSL)
include(OpenSSLTests) include(OpenSSLTests)
include(CheckNameserCompat)
#TODO: NB_DNS tests
set(HAVE_NB_DNS ${USE_NB_DNS})
set(HAVE_ASYNC_DNS ${USE_NB_DNS}) #TODO: should make consistent w/ HAVE_NB_DNS
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
${CMAKE_CURRENT_BINARY_DIR}/config.h) ${CMAKE_CURRENT_BINARY_DIR}/config.h)

View file

@ -0,0 +1,21 @@
include(CheckCSourcecompiles)
# Check whether the namser compatibility header is required
# This can be the case on the Darwin platform
check_c_source_compiles("
#include <arpa/nameser.h>
int main() { HEADER *hdr; int d = NS_IN6ADDRSZ; return 0; }"
have_nameser_header)
if (NOT have_nameser_header)
check_c_source_compiles("
#include <arpa/nameser.h>
#include <arpa/nameser_compat.h>
int main() { HEADER *hdr; int d = NS_IN6ADDRSZ; return 0; }"
NEED_NAMESER_COMPAT_H)
if (NOT NEED_NAMESER_COMPAT_H)
message(FATAL_ERROR
"Asynchronous DNS support compatibility check failed.")
endif ()
endif ()

77
cmake/FindBIND.cmake Normal file
View file

@ -0,0 +1,77 @@
# - Try to find libpcap include dirs and libraries
#
# Usage of this module as follows:
#
# find_package(BIND)
#
# Variables used by this module, they can change the default behaviour and need
# to be set before calling find_package:
#
# BIND_ROOT_DIR Set this variable to the root installation of BIND
# if the module has problems finding the proper
# installation path.
#
# Variables defined by this module:
#
# BIND_FOUND System has BIND, include and library dirs found
# BIND_INCLUDE_DIR The BIND include directories.
# BIND_LIBRARIES All BIND libraries found.
# BIND_LIBRARY The BIND library required for ns_inittab and
# res_mkquery symbols.
find_path(BIND_ROOT_DIR
NAMES include/resolv.h
)
mark_as_advanced(BIND_ROOT_DIR)
if (BIND_ROOT_DIR)
set(BIND_INCLUDE_DIR ${BIND_ROOT_DIR}/include)
endif ()
find_library(BIND_LIBRARIES
NAMES resolv bind
HINTS ${BIND_ROOT_DIR}/lib
)
include(CheckCSourceCompiles)
# Find which library has the res_mkquery and ns_initparse symbols
set(CMAKE_REQUIRED_INCLUDES ${BIND_INCLUDE_DIR})
foreach (bindlib ${BIND_LIBRARIES})
set(CMAKE_REQUIRED_LIBRARIES ${bindlib})
check_c_source_compiles("
#include <arpa/nameser.h>
int main() {
ns_initparse(0, 0, 0);
return 0;
}
" ns_initparse_works)
check_c_source_compiles("
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
int main() {
int (*p)() = res_mkquery;
}
" res_mkquery_works)
unset(CMAKE_REQUIRED_LIBRARIES)
if (ns_initparse_works AND res_mkquery_works)
set(BIND_LIBRARY ${bindlib})
break ()
endif ()
endforeach ()
unset(CMAKE_REQUIRED_INCLUDES)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(BIND DEFAULT_MSG
BIND_LIBRARY
BIND_INCLUDE_DIR
)
mark_as_advanced(BIND_LIBRARIES BIND_LIBRARY BIND_INCLUDE_DIR)

View file

@ -6,29 +6,6 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
set(USE_NMALLOC true) set(USE_NMALLOC true)
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
if (USE_NB_DNS)
include(CheckCSourceCompiles)
check_c_source_compiles("
#include <arpa/nameser.h>
int main() {
HEADER *hdr; int d = NS_IN6ADDRSZ; return 0;
}
" ns_header_defined)
if (NOT ns_header_defined)
check_c_source_compiles("
#include <arpa/nameser.h>
#include <arpa/nameser_compat.h>
int main() {
HEADER *hdr; int d = NS_IN6ADDRSZ; return 0;
}
" NEED_NAMESER_COMPAT_H)
if (NOT NEED_NAMESER_COMPAT_H)
message(WARNING "Darwin nameser compatibility check failed."
"Non-blocking DNS support disabled.")
set(USE_NB_DNS false)
endif ()
endif ()
endif ()
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(HAVE_LINUX true) set(HAVE_LINUX true)

View file

@ -38,9 +38,6 @@
/* Define if you have the <memory.h> header file. */ /* Define if you have the <memory.h> header file. */
#cmakedefine HAVE_MEMORY_H #cmakedefine HAVE_MEMORY_H
/* async dns support */
#cmakedefine HAVE_NB_DNS
/* Define if you have the <netinet/ether.h> header file. */ /* Define if you have the <netinet/ether.h> header file. */
#cmakedefine HAVE_NETINET_ETHER_H #cmakedefine HAVE_NETINET_ETHER_H

View file

@ -189,9 +189,7 @@ endforeach(binpact)
########### next target ############### ########### next target ###############
if (HAVE_NB_DNS)
set(dns_SRCS nb_dns.c nb_dns.h) set(dns_SRCS nb_dns.c nb_dns.h)
endif ()
set(openssl_SRCS X509.cc SSLCiphers.cc SSLInterpreter.cc SSLProxy.cc set(openssl_SRCS X509.cc SSLCiphers.cc SSLInterpreter.cc SSLProxy.cc
SSLv2.cc SSLv3.cc SSLv3Automaton.cc) SSLv2.cc SSLv3.cc SSLv3Automaton.cc)
@ -382,10 +380,10 @@ add_dependencies(bro make_dbg_constants)
target_link_libraries(bro target_link_libraries(bro
m m
resolv
binpac_lib binpac_lib
${PCAP_LIBRARY} ${PCAP_LIBRARY}
${OPENSSL_LIBRARIES} ${OPENSSL_LIBRARIES}
${BIND_LIBRARY}
) )
install(TARGETS bro DESTINATION bin) install(TARGETS bro DESTINATION bin)

View file

@ -53,9 +53,7 @@ public:
const char* ReqHost() const { return host; } const char* ReqHost() const { return host; }
uint32 ReqAddr() const { return addr; } uint32 ReqAddr() const { return addr; }
#ifdef HAVE_NB_DNS
int MakeRequest(nb_dns_info* nb_dns); int MakeRequest(nb_dns_info* nb_dns);
#endif
int RequestPending() const { return request_pending; } int RequestPending() const { return request_pending; }
void RequestDone() { request_pending = 0; } void RequestDone() { request_pending = 0; }
@ -66,7 +64,6 @@ protected:
int request_pending; int request_pending;
}; };
#ifdef HAVE_NB_DNS
int DNS_Mgr_Request::MakeRequest(nb_dns_info* nb_dns) int DNS_Mgr_Request::MakeRequest(nb_dns_info* nb_dns)
{ {
if ( ! nb_dns ) if ( ! nb_dns )
@ -80,7 +77,6 @@ int DNS_Mgr_Request::MakeRequest(nb_dns_info* nb_dns)
else else
return nb_dns_addr_request(nb_dns, addr, (void*) this, err) >= 0; return nb_dns_addr_request(nb_dns, addr, (void*) this, err) >= 0;
} }
#endif
class DNS_Mapping { class DNS_Mapping {
public: public:
@ -350,13 +346,11 @@ DNS_Mgr::DNS_Mgr(DNS_MgrMode arg_mode)
host_mappings.SetDeleteFunc(DNS_Mgr_mapping_delete_func); host_mappings.SetDeleteFunc(DNS_Mgr_mapping_delete_func);
addr_mappings.SetDeleteFunc(DNS_Mgr_mapping_delete_func); addr_mappings.SetDeleteFunc(DNS_Mgr_mapping_delete_func);
#ifdef HAVE_NB_DNS
char err[NB_DNS_ERRSIZE]; char err[NB_DNS_ERRSIZE];
nb_dns = nb_dns_init(err); nb_dns = nb_dns_init(err);
if ( ! nb_dns ) if ( ! nb_dns )
warn(fmt("problem initializing NB-DNS: %s", err)); warn(fmt("problem initializing NB-DNS: %s", err));
#endif
dns_mapping_valid = dns_mapping_unverified = dns_mapping_new_name = dns_mapping_valid = dns_mapping_unverified = dns_mapping_new_name =
dns_mapping_lost_name = dns_mapping_name_changed = dns_mapping_lost_name = dns_mapping_name_changed =
@ -372,10 +366,8 @@ DNS_Mgr::DNS_Mgr(DNS_MgrMode arg_mode)
DNS_Mgr::~DNS_Mgr() DNS_Mgr::~DNS_Mgr()
{ {
#ifdef HAVE_NB_DNS
if ( nb_dns ) if ( nb_dns )
nb_dns_finish(nb_dns); nb_dns_finish(nb_dns);
#endif
delete [] cache_name; delete [] cache_name;
delete [] dir; delete [] dir;
@ -410,14 +402,12 @@ bool DNS_Mgr::Init()
did_init = 1; did_init = 1;
#ifdef HAVE_NB_DNS
io_sources.Register(this, true); io_sources.Register(this, true);
// We never set idle to false, having the main loop only calling us from // We never set idle to false, having the main loop only calling us from
// time to time. If we're issuing more DNS requests than we can handle // time to time. If we're issuing more DNS requests than we can handle
// in this way, we are having problems anyway ... // in this way, we are having problems anyway ...
idle = true; idle = true;
#endif
return true; return true;
} }
@ -531,7 +521,6 @@ void DNS_Mgr::Resolve()
int i; int i;
#ifdef HAVE_NB_DNS
int first_req = 0; int first_req = 0;
int num_pending = min(requests.length(), MAX_PENDING_REQUESTS); int num_pending = min(requests.length(), MAX_PENDING_REQUESTS);
int last_req = num_pending - 1; int last_req = num_pending - 1;
@ -597,7 +586,6 @@ void DNS_Mgr::Resolve()
--num_pending; --num_pending;
} }
} }
#endif
// All done with the list of requests. // All done with the list of requests.
for ( i = requests.length() - 1; i >= 0; --i ) for ( i = requests.length() - 1; i >= 0; --i )
@ -860,7 +848,6 @@ TableVal* DNS_Mgr::LookupNameInCache(string name)
return d->AddrsSet(); return d->AddrsSet();
} }
#ifdef HAVE_NB_DNS
void DNS_Mgr::AsyncLookupAddr(dns_mgr_addr_type host, LookupCallback* callback) void DNS_Mgr::AsyncLookupAddr(dns_mgr_addr_type host, LookupCallback* callback)
{ {
if ( ! did_init ) if ( ! did_init )
@ -956,13 +943,10 @@ void DNS_Mgr::IssueAsyncRequests()
++asyncs_pending; ++asyncs_pending;
} }
} }
#endif
void DNS_Mgr::GetFds(int* read, int* write, int* except) void DNS_Mgr::GetFds(int* read, int* write, int* except)
{ {
#ifdef HAVE_NB_DNS
*read = nb_dns_fd(nb_dns); *read = nb_dns_fd(nb_dns);
#endif
} }
double DNS_Mgr::NextTimestamp(double* network_time) double DNS_Mgr::NextTimestamp(double* network_time)
@ -971,7 +955,6 @@ double DNS_Mgr::NextTimestamp(double* network_time)
return asyncs_timeouts.size() ? timer_mgr->Time() : -1.0; return asyncs_timeouts.size() ? timer_mgr->Time() : -1.0;
} }
#ifdef HAVE_NB_DNS
void DNS_Mgr::CheckAsyncAddrRequest(dns_mgr_addr_type addr, bool timeout) void DNS_Mgr::CheckAsyncAddrRequest(dns_mgr_addr_type addr, bool timeout)
{ {
// Note that this code is a mirror of that for CheckAsyncHostRequest. // Note that this code is a mirror of that for CheckAsyncHostRequest.
@ -1030,13 +1013,9 @@ void DNS_Mgr::CheckAsyncHostRequest(const char* host, bool timeout)
// eventually times out. // eventually times out.
} }
} }
#endif
void DNS_Mgr::Process() void DNS_Mgr::Process()
{ {
#ifndef HAVE_NB_DNS
internal_error("DNS_Mgr::Process(): should never be reached");
#else
while ( asyncs_timeouts.size() > 0 ) while ( asyncs_timeouts.size() > 0 )
{ {
@ -1084,9 +1063,8 @@ void DNS_Mgr::Process()
IssueAsyncRequests(); IssueAsyncRequests();
} }
#endif
} }
#ifdef HAVE_NB_DNS
int DNS_Mgr::AnswerAvailable(int timeout) int DNS_Mgr::AnswerAvailable(int timeout)
{ {
int fd = nb_dns_fd(nb_dns); int fd = nb_dns_fd(nb_dns);
@ -1116,4 +1094,3 @@ int DNS_Mgr::AnswerAvailable(int timeout)
return status; return status;
} }
#endif

View file

@ -79,10 +79,8 @@ public:
virtual void Timeout() = 0; virtual void Timeout() = 0;
}; };
#ifdef HAVE_NB_DNS
void AsyncLookupAddr(dns_mgr_addr_type host, LookupCallback* callback); void AsyncLookupAddr(dns_mgr_addr_type host, LookupCallback* callback);
void AsyncLookupName(string name, LookupCallback* callback); void AsyncLookupName(string name, LookupCallback* callback);
#endif
protected: protected:
friend class LookupCallback; friend class LookupCallback;
@ -102,7 +100,6 @@ protected:
void LoadCache(FILE* f); void LoadCache(FILE* f);
void Save(FILE* f, PDict(DNS_Mapping)& m); void Save(FILE* f, PDict(DNS_Mapping)& m);
#ifdef HAVE_NB_DNS
// Selects on the fd to see if there is an answer available (timeout is // Selects on the fd to see if there is an answer available (timeout is
// secs). Returns 0 on timeout, -1 on EINTR, and 1 if answer is ready. // secs). Returns 0 on timeout, -1 on EINTR, and 1 if answer is ready.
int AnswerAvailable(int timeout); int AnswerAvailable(int timeout);
@ -115,8 +112,6 @@ protected:
void CheckAsyncAddrRequest(dns_mgr_addr_type addr, bool timeout); void CheckAsyncAddrRequest(dns_mgr_addr_type addr, bool timeout);
void CheckAsyncHostRequest(const char* host, bool timeout); void CheckAsyncHostRequest(const char* host, bool timeout);
#endif
// IOSource interface. // IOSource interface.
virtual void GetFds(int* read, int* write, int* except); virtual void GetFds(int* read, int* write, int* except);
virtual double NextTimestamp(double* network_time); virtual double NextTimestamp(double* network_time);

View file

@ -2808,10 +2808,6 @@ private:
# function result. Therefore, they can only be called inside a when-condition. # function result. Therefore, they can only be called inside a when-condition.
function lookup_addr%(host: addr%) : string function lookup_addr%(host: addr%) : string
%{ %{
#ifndef HAVE_NB_DNS
run_time("lookup_addr(): not configured for asynchronous DNS lookups");
return new StringVal("<error>");
#else
// FIXME: Is should be easy to adapt the function to synchronous // FIXME: Is should be easy to adapt the function to synchronous
// lookups if we're reading a trace. // lookups if we're reading a trace.
Trigger* trigger = frame->GetTrigger(); Trigger* trigger = frame->GetTrigger();
@ -2839,15 +2835,10 @@ function lookup_addr%(host: addr%) : string
new LookupHostCallback(trigger, frame->GetCall(), true)); new LookupHostCallback(trigger, frame->GetCall(), true));
#endif #endif
return 0; return 0;
#endif
%} %}
function lookup_hostname%(host: string%) : addr_set function lookup_hostname%(host: string%) : addr_set
%{ %{
#ifndef HAVE_NB_DNS
run_time("lookup_hostname(): not configured for asynchronous DNS lookups");
return new StringVal("<error>");
#else
// FIXME: Is should be easy to adapt the function to synchronous // FIXME: Is should be easy to adapt the function to synchronous
// lookups if we're reading a trace. // lookups if we're reading a trace.
Trigger* trigger = frame->GetTrigger(); Trigger* trigger = frame->GetTrigger();
@ -2864,7 +2855,6 @@ function lookup_hostname%(host: string%) : addr_set
dns_mgr->AsyncLookupName(host->CheckString(), dns_mgr->AsyncLookupName(host->CheckString(),
new LookupHostCallback(trigger, frame->GetCall(), false)); new LookupHostCallback(trigger, frame->GetCall(), false));
return 0; return 0;
#endif
%} %}
# Stop Bro's packet processing. # Stop Bro's packet processing.

View file

@ -406,11 +406,7 @@ int main(int argc, char** argv)
enum DNS_MgrMode dns_type = DNS_DEFAULT; enum DNS_MgrMode dns_type = DNS_DEFAULT;
#ifdef HAVE_NB_DNS
dns_type = getenv("BRO_DNS_FAKE") ? DNS_FAKE : DNS_DEFAULT; dns_type = getenv("BRO_DNS_FAKE") ? DNS_FAKE : DNS_DEFAULT;
#else
dns_type = DNS_FAKE;
#endif
RETSIGTYPE (*oldhandler)(int); RETSIGTYPE (*oldhandler)(int);