diff options
| author | Vexu <15308111+Vexu@users.noreply.github.com> | 2019-11-04 23:11:52 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-11-05 12:05:34 -0500 |
| commit | a26e9fa7238e972301f761db80434fa0205d1016 (patch) | |
| tree | 200bd4175a09ae63a7f862aa3546683cc7ed6f37 /lib/std/net.zig | |
| parent | 71e209521a0675a3ec06aba133ce8837e2ee9806 (diff) | |
| download | zig-a26e9fa7238e972301f761db80434fa0205d1016.tar.gz zig-a26e9fa7238e972301f761db80434fa0205d1016.zip | |
add special formatting for ipv4-mapped ipv6 addresses
Diffstat (limited to 'lib/std/net.zig')
| -rw-r--r-- | lib/std/net.zig | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/lib/std/net.zig b/lib/std/net.zig index f4464b46c6..95036707b6 100644 --- a/lib/std/net.zig +++ b/lib/std/net.zig @@ -117,10 +117,12 @@ pub const IpAddress = extern union { ip_slice[10] = 0xff; ip_slice[11] = 0xff; - ip_slice[12] = @truncate(u8, addr >> 24 & 0xff); - ip_slice[13] = @truncate(u8, addr >> 16 & 0xff); - ip_slice[14] = @truncate(u8, addr >> 8 & 0xff); - ip_slice[15] = @truncate(u8, addr & 0xff); + const ptr = @sliceToBytes((*const [1]u32)(&addr)[0..]); + + ip_slice[12] = ptr[0]; + ip_slice[13] = ptr[1]; + ip_slice[14] = ptr[2]; + ip_slice[15] = ptr[3]; return result; } else { const digit = try std.fmt.charToDigit(c, 16); @@ -269,6 +271,20 @@ pub const IpAddress = extern union { }, os.AF_INET6 => { const port = mem.bigToNative(u16, self.in6.port); + if (mem.eql(u8, self.in6.addr[0..12], [_]u8{0,0,0,0,0,0,0,0,0,0,0xff,0xff})) { + try std.fmt.format( + context, + Errors, + output, + "[::ffff:{}.{}.{}.{}]:{}", + self.in6.addr[12], + self.in6.addr[13], + self.in6.addr[14], + self.in6.addr[15], + port, + ); + return; + } const big_endian_parts = @ptrCast(*align(1) const [8]u16, &self.in6.addr); const native_endian_parts = switch (builtin.endian) { .Big => big_endian_parts.*, |
