summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPanagiotis Vasilopoulos <hello@alwayslivid.com>2020-08-13 00:57:43 +0300
committerAndreas Kling <kling@serenityos.org>2020-08-13 19:02:47 +0200
commitdcfc54d767bcb2b7a9376cda3fa0fccd1aaf1626 (patch)
tree47171c06a6bb8abdc2f480a48e1e33e809e9e63b
parent138595961baac929df280264f3bdb729a6be33fa (diff)
downloadserenity-dcfc54d767bcb2b7a9376cda3fa0fccd1aaf1626.zip
AK: Add initial support for obscure IPv4 address notations
This change aims to add support for obscure IPv4 address notations, such as 1.1 (which should be equal to 1.0.0.1), or the hypothetical address 1 (which is equal to 0.0.0.1). This is supported on other platforms as well, such as Linux, Windows, *BSD, and even Haiku.
-rw-r--r--AK/IPv4Address.h37
1 files changed, 31 insertions, 6 deletions
diff --git a/AK/IPv4Address.h b/AK/IPv4Address.h
index 810c9013a4..733987c9f3 100644
--- a/AK/IPv4Address.h
+++ b/AK/IPv4Address.h
@@ -40,7 +40,7 @@ namespace AK {
class [[gnu::packed]] IPv4Address
{
public:
- IPv4Address() {}
+ IPv4Address() { }
IPv4Address(const u8 data[4])
{
m_data[0] = data[0];
@@ -76,12 +76,37 @@ public:
if (string.is_null())
return {};
auto parts = string.split_view('.');
- if (parts.size() != 4)
+
+ u32 a;
+ u32 b;
+ u32 c;
+ u32 d;
+
+ if (parts.size() == 1) {
+ a = 0;
+ b = 0;
+ c = 0;
+ d = parts[1].to_uint().value_or(256);
+ } else if (parts.size() == 2) {
+ a = parts[1].to_uint().value_or(256);
+ b = 0;
+ c = 0;
+ d = parts[2].to_uint().value_or(256);
+ } else if (parts.size() == 3) {
+ a = parts[0].to_uint().value_or(256);
+ b = parts[1].to_uint().value_or(256);
+ c = 0;
+ d = parts[2].to_uint().value_or(256);
+ } else if (parts.size() == 4) {
+ a = parts[0].to_uint().value_or(256);
+ b = parts[1].to_uint().value_or(256);
+ c = parts[2].to_uint().value_or(256);
+ d = parts[3].to_uint().value_or(256);
+ } else {
return {};
- auto a = parts[0].to_uint().value_or(256);
- auto b = parts[1].to_uint().value_or(256);
- auto c = parts[2].to_uint().value_or(256);
- auto d = parts[3].to_uint().value_or(256);
+ }
+
+
if (a > 255 || b > 255 || c > 255 || d > 255)
return {};
return IPv4Address((u8)a, (u8)b, (u8)c, (u8)d);