#include "hosts.h"
#include <arpa/inet.h>
#include <netdb.h>
namespace Security {
namespace IPPlusPlus {
class NamedHost : public Host::Spec {
public:
NamedHost(const char *name);
string name() const;
set<IPAddress> addresses() const;
bool operator == (const NamedHost &other) const
{ return mName == other.mName; }
private:
string mName;
set<IPAddress> mAddrs;
};
class IPv4NumberHost : public Host::Spec {
public:
IPv4NumberHost(IPAddress addr) : mAddr(addr) { }
string name() const;
set<IPAddress> addresses() const;
bool operator == (const IPv4NumberHost &other) const
{ return mAddr == other.mAddr; }
private:
IPAddress mAddr;
};
Host::Host(const char *form)
{
IPAddress addr;
if (inet_aton(form, &addr))
mSpec = new IPv4NumberHost(addr);
else
mSpec = new NamedHost(form);
}
bool Host::operator == (const Host &other) const
{
return mSpec ? (name() == other.name()) : !other.mSpec;
}
bool Host::operator < (const Host &other) const
{
return !mSpec || (other.mSpec && name() < other.name());
}
bool Host::operator <= (const Host &other) const
{
return false;
}
string IPv4NumberHost::name() const
{
return mAddr;
}
set<IPAddress> IPv4NumberHost::addresses() const
{
set<IPAddress> result;
result.insert(mAddr);
return result;
}
NamedHost::NamedHost(const char *name) : mName(name)
{
if (hostent *he = gethostbyname(name)) {
for (char **p = he->h_addr_list; *p; p++)
mAddrs.insert(*reinterpret_cast<in_addr *>(*p));
secdebug("ipname", "host %s resolves to %ld address(es)", mName.c_str(), mAddrs.size());
return;
}
UnixError::throwMe(ENOENT); }
string NamedHost::name() const
{
return mName;
}
set<IPAddress> NamedHost::addresses() const
{
return mAddrs;
}
} }