aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpkid/rpki/ipaddrs.py24
1 files changed, 17 insertions, 7 deletions
diff --git a/rpkid/rpki/ipaddrs.py b/rpkid/rpki/ipaddrs.py
index 1bcb425e..db6a5891 100644
--- a/rpkid/rpki/ipaddrs.py
+++ b/rpkid/rpki/ipaddrs.py
@@ -56,15 +56,19 @@ class v4addr(long):
def __new__(cls, x):
"""Construct a v4addr object."""
if isinstance(x, str):
- x = ".".join(str(int(i)) for i in x.split("."))
- y = struct.unpack("!I", socket.inet_pton(socket.AF_INET, x))
- x = y[0]
- return long.__new__(cls, x)
+ return cls.from_bytes(socket.inet_pton(socket.AF_INET, ".".join(str(int(i)) for i in x.split("."))))
+ else:
+ return long.__new__(cls, x)
def to_bytes(self):
"""Convert a v4addr object to a raw byte string."""
return struct.pack("!I", long(self))
+ @classmethod
+ def from_bytes(cls, x):
+ """Convert from a raw byte string to a v4addr object."""
+ return cls(struct.unpack("!I", x)[0])
+
def __str__(self):
"""Convert a v4addr object to string format."""
return socket.inet_ntop(socket.AF_INET, self.to_bytes())
@@ -80,14 +84,20 @@ class v6addr(long):
def __new__(cls, x):
"""Construct a v6addr object."""
if isinstance(x, str):
- y = struct.unpack("!QQ", socket.inet_pton(socket.AF_INET6, x))
- x = (y[0] << 64) | y[1]
- return long.__new__(cls, x)
+ return cls.from_bytes(socket.inet_pton(socket.AF_INET6, x))
+ else:
+ return long.__new__(cls, x)
def to_bytes(self):
"""Convert a v6addr object to a raw byte string."""
return struct.pack("!QQ", long(self) >> 64, long(self) & 0xFFFFFFFFFFFFFFFF)
+ @classmethod
+ def from_bytes(cls, x):
+ """Convert from a raw byte string to a v6addr object."""
+ x = struct.unpack("!QQ", x)
+ return cls((x[0] << 64) | x[1])
+
def __str__(self):
"""Convert a v6addr object to string format."""
return socket.inet_ntop(socket.AF_INET6, self.to_bytes())