Skip to content

Commit 3b25536

Browse files
committed
---
yaml --- r: 143283 b: refs/heads/try2 c: e2bb32b h: refs/heads/master i: 143281: 507b590 143279: 4606c14 v: v3
1 parent 842f568 commit 3b25536

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: ac40d5323da30211c8dd516681c6e518777135e9
8+
refs/heads/try2: e2bb32bea19f8bfd2165361b5ad2d025c2ffeba0
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libstd/rt/uv/net.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,36 @@ fn uv_ip_as_ip<T>(addr: UvIpAddr, f: &fn(IpAddr) -> T) -> T {
113113
};
114114
match s {
115115
"" => ~[],
116-
s => s.split_iter(':').transform(read_hex_segment).collect(),
116+
// IPv4-Mapped/Compatible IPv6 Address?
117+
s if s.find('.').is_some() => {
118+
let i = s.rfind(':').get_or_default(-1);
119+
120+
let b = s.slice(i + 1, s.len()); // the ipv4 part
121+
122+
let h = b.split_iter('.')
123+
.transform(|s: &str| -> u8 { FromStr::from_str(s).unwrap() })
124+
.transform(|s: u8| -> ~str { fmt!("%02x", s as uint) })
125+
.collect::<~[~str]>();
126+
127+
if i == -1 {
128+
// Ipv4 Compatible Address (::x.x.x.x)
129+
// first 96 bits are zero leaving 32 bits
130+
// for the ipv4 part
131+
// (i.e ::127.0.0.1 == ::7F00:1)
132+
~[num::FromStrRadix::from_str_radix(h[0] + h[1], 16).unwrap(),
133+
num::FromStrRadix::from_str_radix(h[2] + h[3], 16).unwrap()]
134+
} else {
135+
// Ipv4-Mapped Address (::FFFF:x.x.x.x)
136+
// first 80 bits are zero, followed by all ones
137+
// for the next 16 bits, leaving 32 bits for
138+
// the ipv4 part
139+
// (i.e ::FFFF:127.0.0.1 == ::FFFF:7F00:1)
140+
~[1,
141+
num::FromStrRadix::from_str_radix(h[0] + h[1], 16).unwrap(),
142+
num::FromStrRadix::from_str_radix(h[2] + h[3], 16).unwrap()]
143+
}
144+
},
145+
s => s.split_iter(':').transform(read_hex_segment).collect()
117146
}
118147
};
119148
s.split_str_iter("::").transform(convert_each_segment).collect()

0 commit comments

Comments
 (0)