mirror of
https://github.com/mfontanini/libtins
synced 2026-01-23 02:35:57 +01:00
Removed Utils::ip_to_int/string. Everything is using IPv4Address now.
This commit is contained in:
@@ -138,6 +138,20 @@ namespace Tins {
|
|||||||
* \return The current inner PDU. Might be 0.
|
* \return The current inner PDU. Might be 0.
|
||||||
*/
|
*/
|
||||||
PDU *inner_pdu() const { return _inner_pdu; }
|
PDU *inner_pdu() const { return _inner_pdu; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Releases the inner PDU.
|
||||||
|
*
|
||||||
|
* This method makes this PDU to <b>no longer own</b> the inner
|
||||||
|
* PDU. The current inner PDU is returned, and is <b>not</b>
|
||||||
|
* destroyed.
|
||||||
|
*
|
||||||
|
* Use this method if you want to somehow re-use a PDU that
|
||||||
|
* is already owned by another PDU.
|
||||||
|
*
|
||||||
|
* \return The current inner PDU. Might be 0.
|
||||||
|
*/
|
||||||
|
PDU *release_inner_pdu();
|
||||||
|
|
||||||
/** \brief Sets the flag identifier.
|
/** \brief Sets the flag identifier.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -73,20 +73,6 @@ namespace Tins {
|
|||||||
*/
|
*/
|
||||||
IPv4Address mask;
|
IPv4Address mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Convert a dotted-ip-notation string to an integer.
|
|
||||||
*
|
|
||||||
* \param ip A dotted ip notation string
|
|
||||||
*/
|
|
||||||
uint32_t ip_to_int(const std::string &ip);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Convert an integer ip to a dotted-ip-notation string.
|
|
||||||
*
|
|
||||||
* \param ip An integer ip.
|
|
||||||
*/
|
|
||||||
std::string ip_to_string(uint32_t ip);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Resolves a domain name and returns its corresponding ip address.
|
* \brief Resolves a domain name and returns its corresponding ip address.
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ const uint8_t *DNS::build_resource_list(list<ResourceRecord*> &lst, const uint8_
|
|||||||
if(contains_dname(res->info.type))
|
if(contains_dname(res->info.type))
|
||||||
std::copy(ptr, ptr + res->data.size(), res->data.begin());
|
std::copy(ptr, ptr + res->data.size(), res->data.begin());
|
||||||
else if(res->data.size() == sizeof(uint32_t))
|
else if(res->data.size() == sizeof(uint32_t))
|
||||||
*(uint32_t*)&res->data[0] = Utils::be_to_host(*(uint32_t*)ptr);
|
*(uint32_t*)&res->data[0] = *(uint32_t*)ptr;
|
||||||
else
|
else
|
||||||
throw std::runtime_error("Not enough size for resource data");
|
throw std::runtime_error("Not enough size for resource data");
|
||||||
|
|
||||||
@@ -220,7 +220,7 @@ void DNS::add_query(const Query &query) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DNS::add_answer(const string &name, QueryType type, QueryClass qclass, uint32_t ttl, IPv4Address ip) {
|
void DNS::add_answer(const string &name, QueryType type, QueryClass qclass, uint32_t ttl, IPv4Address ip) {
|
||||||
ResourceRecord *res = make_record(name, type, qclass, ttl, (uint32_t)ip);
|
ResourceRecord *res = make_record(name, type, qclass, ttl, Utils::host_to_be((uint32_t)ip));
|
||||||
ans.push_back(res);
|
ans.push_back(res);
|
||||||
dns.answers = Utils::host_to_be<uint16_t>(ans.size());
|
dns.answers = Utils::host_to_be<uint16_t>(ans.size());
|
||||||
}
|
}
|
||||||
@@ -475,7 +475,7 @@ void DNS::convert_resources(const ResourcesType &lst, std::list<Resource> &res)
|
|||||||
ptr = (*it)->data_pointer();
|
ptr = (*it)->data_pointer();
|
||||||
sz = (*it)->data_size();
|
sz = (*it)->data_size();
|
||||||
if(sz == 4)
|
if(sz == 4)
|
||||||
addr = Utils::ip_to_string(*(uint32_t*)ptr);
|
addr = IPv4Address(*(uint32_t*)ptr).to_string();
|
||||||
else {
|
else {
|
||||||
if(Utils::be_to_host((*it)->info.type) == MX) {
|
if(Utils::be_to_host((*it)->info.type) == MX) {
|
||||||
ptr += 2;
|
ptr += 2;
|
||||||
@@ -485,7 +485,8 @@ void DNS::convert_resources(const ResourcesType &lst, std::list<Resource> &res)
|
|||||||
}
|
}
|
||||||
res.push_back(
|
res.push_back(
|
||||||
Resource(dname, addr, Utils::be_to_host((*it)->info.type),
|
Resource(dname, addr, Utils::be_to_host((*it)->info.type),
|
||||||
Utils::host_to_be((*it)->info.qclass), Utils::be_to_host((*it)->info.ttl))
|
Utils::host_to_be((*it)->info.qclass), Utils::be_to_host((*it)->info.ttl)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,13 +46,7 @@ IPv4Address::operator uint32_t() const {
|
|||||||
|
|
||||||
std::string IPv4Address::to_string() const {
|
std::string IPv4Address::to_string() const {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
int mask(24);
|
oss << *this;
|
||||||
while(mask >=0) {
|
|
||||||
oss << ((ip_addr >> mask) & 0xff);
|
|
||||||
if(mask)
|
|
||||||
oss << '.';
|
|
||||||
mask -= 8;
|
|
||||||
}
|
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,6 +75,14 @@ uint32_t IPv4Address::ip_to_int(const string &ip) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::ostream &operator<<(std::ostream &output, const IPv4Address &addr) {
|
std::ostream &operator<<(std::ostream &output, const IPv4Address &addr) {
|
||||||
return output << addr.to_string();
|
int mask(24);
|
||||||
|
uint32_t ip_addr = addr.ip_addr;
|
||||||
|
while(mask >=0) {
|
||||||
|
output << ((ip_addr >> mask) & 0xff);
|
||||||
|
if(mask)
|
||||||
|
output << '.';
|
||||||
|
mask -= 8;
|
||||||
|
}
|
||||||
|
return output;;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,6 +70,12 @@ void PDU::inner_pdu(PDU *next_pdu) {
|
|||||||
_inner_pdu = next_pdu;
|
_inner_pdu = next_pdu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PDU *PDU::release_inner_pdu() {
|
||||||
|
PDU *result = 0;
|
||||||
|
std::swap(result, _inner_pdu);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
PDU::serialization_type PDU::serialize() {
|
PDU::serialization_type PDU::serialize() {
|
||||||
std::vector<uint8_t> buffer(size());
|
std::vector<uint8_t> buffer(size());
|
||||||
serialize(&buffer[0], buffer.size(), 0);
|
serialize(&buffer[0], buffer.size(), 0);
|
||||||
|
|||||||
@@ -93,42 +93,6 @@ void Utils::Internals::skip_line(istream &input) {
|
|||||||
|
|
||||||
/** \endcond */
|
/** \endcond */
|
||||||
|
|
||||||
uint32_t Utils::ip_to_int(const string &ip) {
|
|
||||||
uint32_t result(0), i(0), end, bytes_found(0);
|
|
||||||
while(i < ip.size() && bytes_found < 4) {
|
|
||||||
uint16_t this_byte(0);
|
|
||||||
end = i + 3;
|
|
||||||
while(i < ip.size() && i < end && ip[i] != '.') {
|
|
||||||
if(ip[i] < '0' || ip[i] > '9')
|
|
||||||
throw std::runtime_error("Non-digit character found in ip");
|
|
||||||
this_byte = (this_byte * 10) + (ip[i] - '0');
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (this_byte > 0xFF) {
|
|
||||||
throw std::runtime_error("Byte greater than 255");
|
|
||||||
}
|
|
||||||
result = (result << 8) | (this_byte & 0xFF);
|
|
||||||
bytes_found++;
|
|
||||||
if(bytes_found < 4 && i < ip.size() && ip[i] == '.')
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if(bytes_found < 4 || (i < ip.size() && bytes_found == 4))
|
|
||||||
throw std::runtime_error("Invalid ip address");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
string Utils::ip_to_string(uint32_t ip) {
|
|
||||||
ostringstream oss;
|
|
||||||
int mask(24);
|
|
||||||
while(mask >=0) {
|
|
||||||
oss << ((ip >> mask) & 0xff);
|
|
||||||
if(mask)
|
|
||||||
oss << '.';
|
|
||||||
mask -= 8;
|
|
||||||
}
|
|
||||||
return oss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
IPv4Address Utils::resolve_ip(const string &to_resolve) {
|
IPv4Address Utils::resolve_ip(const string &to_resolve) {
|
||||||
struct hostent *data = gethostbyname(to_resolve.c_str());
|
struct hostent *data = gethostbyname(to_resolve.c_str());
|
||||||
if(!data)
|
if(!data)
|
||||||
|
|||||||
@@ -57,30 +57,6 @@ const uint8_t UtilsTest::data[] = {
|
|||||||
};
|
};
|
||||||
const uint32_t UtilsTest::data_len = 500;
|
const uint32_t UtilsTest::data_len = 500;
|
||||||
|
|
||||||
TEST_F(UtilsTest, IpToInt) {
|
|
||||||
|
|
||||||
EXPECT_EQ(Utils::ip_to_int("0.0.0.0"), zero_int_ip);
|
|
||||||
EXPECT_EQ(Utils::ip_to_int("255.255.255.255"), full_int_ip);
|
|
||||||
EXPECT_EQ(Utils::ip_to_int("1.2.255.3"), mix_int_ip);
|
|
||||||
|
|
||||||
/* Invalid number */
|
|
||||||
EXPECT_THROW(Utils::ip_to_int("123.a.5.6"), std::runtime_error);
|
|
||||||
EXPECT_THROW(Utils::ip_to_int("0.0.256.0"), std::runtime_error);
|
|
||||||
EXPECT_THROW(Utils::ip_to_int("0.0.255.0a"), std::runtime_error);
|
|
||||||
EXPECT_THROW(Utils::ip_to_int("0.0.255.127a"), std::runtime_error);
|
|
||||||
EXPECT_THROW(Utils::ip_to_int("0.0.255.1.5"), std::runtime_error);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(UtilsTest, IpToString) {
|
|
||||||
|
|
||||||
EXPECT_EQ(Utils::ip_to_string(zero_int_ip), "0.0.0.0");
|
|
||||||
EXPECT_EQ(Utils::ip_to_string(full_int_ip), "255.255.255.255");
|
|
||||||
EXPECT_EQ(Utils::ip_to_string(mix_int_ip), "1.2.255.3");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TEST_F(UtilsTest, ResolveIp) {
|
TEST_F(UtilsTest, ResolveIp) {
|
||||||
IPv4Address localhost_ip("127.0.0.1");
|
IPv4Address localhost_ip("127.0.0.1");
|
||||||
|
|
||||||
@@ -89,7 +65,6 @@ TEST_F(UtilsTest, ResolveIp) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST_F(UtilsTest, NetToHostS) {
|
TEST_F(UtilsTest, NetToHostS) {
|
||||||
uint16_t a = 0x01FE;
|
uint16_t a = 0x01FE;
|
||||||
uint16_t b = Utils::net_to_host_s(a);
|
uint16_t b = Utils::net_to_host_s(a);
|
||||||
|
|||||||
Reference in New Issue
Block a user