From 2b6f6d6ce6e6371df91470af2777950a22c9ec62 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 16 Sep 2005 00:15:47 +0200 Subject: compare host names by address lookup instead of simple string comparison --- ndb/tools/ndb_config.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) (limited to 'ndb/tools') diff --git a/ndb/tools/ndb_config.cpp b/ndb/tools/ndb_config.cpp index 725249a5af5..290dd440479 100644 --- a/ndb/tools/ndb_config.cpp +++ b/ndb/tools/ndb_config.cpp @@ -23,6 +23,8 @@ #include #include +#include + #include #include #include @@ -127,6 +129,11 @@ struct Match virtual int eval(NdbMgmHandle, const Iter&); }; +struct HostMatch : public Match +{ + virtual int eval(NdbMgmHandle, const Iter&); +}; + struct Apply { Apply() {} @@ -297,9 +304,10 @@ parse_where(Vector& where, int &argc, char**& argv) Match m; if(g_host) { - m.m_key = CFG_NODE_HOST; - m.m_value.assfmt("%s", g_host); - where.push_back(new Match(m)); + HostMatch *m = new HostMatch; + m->m_key = CFG_NODE_HOST; + m->m_value.assfmt("%s", g_host); + where.push_back(m); } if(g_type) @@ -375,6 +383,40 @@ Match::eval(NdbMgmHandle h, const Iter& iter) return 1; } +int +HostMatch::eval(NdbMgmHandle h, const Iter& iter) +{ + const char* valc; + + if(iter.get(m_key, &valc) == 0) + { + struct hostent *h1, *h2; + + h1 = gethostbyname(m_value.c_str()); + if (h1 == NULL) { + return 0; + } + + h2 = gethostbyname(valc); + if (h2 == NULL) { + return 0; + } + + if (h1->h_addrtype != h2->h_addrtype) { + return 0; + } + + if (h1->h_length != h2->h_length) + { + return 0; + } + + return 0 == memcmp(h1->h_addr, h2->h_addr, h1->h_length); + } + + return 0; +} + int Apply::apply(NdbMgmHandle h, const Iter& iter) { -- cgit v1.2.1