diff --git a/AK/IPv4Address.h b/AK/IPv4Address.h index 36223043b0..d77366377a 100644 --- a/AK/IPv4Address.h +++ b/AK/IPv4Address.h @@ -2,6 +2,9 @@ #include #include +#include + +typedef u32 in_addr_t; namespace AK { @@ -39,6 +42,31 @@ public: return String::format("%u.%u.%u.%u", m_data[0], m_data[1], m_data[2], m_data[3]); } + static Optional from_string(const StringView& string) + { + if (string.is_null()) + return {}; + auto parts = string.split_view('.'); + if (parts.size() != 4) + return {}; + bool ok; + auto a = parts[0].to_uint(ok); + if (!ok || a > 255) + return {}; + auto b = parts[1].to_uint(ok); + if (!ok || b > 255) + return {}; + auto c = parts[2].to_uint(ok); + if (!ok || c > 255) + return {}; + auto d = parts[3].to_uint(ok); + if (!ok || d > 255) + return {}; + return IPv4Address((u8)a, (u8)b, (u8)c, (u8)d); + } + + in_addr_t to_in_addr_t() const { return m_data_as_u32; } + bool operator==(const IPv4Address& other) const { return m_data_as_u32 == other.m_data_as_u32; } bool operator!=(const IPv4Address& other) const { return m_data_as_u32 != other.m_data_as_u32; }