Skip to content

Commit d6e1a6b

Browse files
committed
libstd: Get rid of duplication in {peer, socket}_name and remove extra *.
1 parent e2bb32b commit d6e1a6b

File tree

2 files changed

+49
-103
lines changed

2 files changed

+49
-103
lines changed

src/libstd/rt/io/net/tcp.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ impl TcpStream {
4545
}
4646

4747
pub fn peer_name(&mut self) -> Option<IpAddr> {
48-
match (***self).peer_name() {
48+
match (**self).peer_name() {
4949
Ok(pn) => Some(pn),
5050
Err(ioerr) => {
5151
rtdebug!("failed to get peer name: %?", ioerr);
@@ -56,7 +56,7 @@ impl TcpStream {
5656
}
5757

5858
pub fn socket_name(&mut self) -> Option<IpAddr> {
59-
match (***self).socket_name() {
59+
match (**self).socket_name() {
6060
Ok(sn) => Some(sn),
6161
Err(ioerr) => {
6262
rtdebug!("failed to get socket name: %?", ioerr);
@@ -115,7 +115,7 @@ impl TcpListener {
115115
}
116116

117117
pub fn socket_name(&mut self) -> Option<IpAddr> {
118-
match (***self).socket_name() {
118+
match (**self).socket_name() {
119119
Ok(sn) => Some(sn),
120120
Err(ioerr) => {
121121
rtdebug!("failed to get socket name: %?", ioerr);

src/libstd/rt/uv/uvio.rs

Lines changed: 46 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use cell::Cell;
1515
use cast;
1616
use cast::transmute;
1717
use clone::Clone;
18+
use libc::c_void;
1819
use rt::io::IoError;
1920
use rt::io::net::ip::IpAddr;
2021
use rt::uv::*;
@@ -34,6 +35,47 @@ use unstable::sync::{Exclusive, exclusive};
3435
next_test_ip4,
3536
run_in_newsched_task};
3637

38+
enum SocketNameKind {
39+
TcpPeer,
40+
Tcp,
41+
Udp
42+
}
43+
44+
fn socket_name<T, U: Watcher + NativeHandle<*T>>(sk: SocketNameKind,
45+
handle: U) -> Result<IpAddr, IoError> {
46+
47+
let getsockname = match sk {
48+
TcpPeer => uvll::rust_uv_tcp_getpeername,
49+
Tcp => uvll::rust_uv_tcp_getsockname,
50+
Udp => uvll::rust_uv_udp_getsockname
51+
};
52+
53+
// Allocate a sockaddr_storage
54+
// since we don't know if it's ipv4 or ipv6
55+
let r_addr = unsafe { uvll::malloc_sockaddr_storage() };
56+
57+
let r = unsafe {
58+
getsockname(handle.native_handle() as *c_void, r_addr as *uvll::sockaddr_storage)
59+
};
60+
61+
if r != 0 {
62+
let status = status_to_maybe_uv_error(handle, r);
63+
return Err(uv_error_to_io_error(status.unwrap()));
64+
}
65+
66+
let addr = unsafe {
67+
if uvll::is_ip6_addr(r_addr as *uvll::sockaddr) {
68+
net::uv_ip_to_ip(UvIpv6(r_addr as *uvll::sockaddr_in6))
69+
} else {
70+
net::uv_ip_to_ip(UvIpv4(r_addr as *uvll::sockaddr_in))
71+
}
72+
};
73+
74+
unsafe { uvll::free_sockaddr_storage(r_addr); }
75+
76+
Ok(addr)
77+
78+
}
3779

3880
pub struct UvEventLoop {
3981
uvio: UvIoFactory
@@ -323,31 +365,7 @@ impl Drop for UvTcpListener {
323365

324366
impl RtioSocket for UvTcpListener {
325367
fn socket_name(&mut self) -> Result<IpAddr, IoError> {
326-
// Allocate a sockaddr_storage
327-
// since we don't know if it's ipv4 or ipv6
328-
let r_addr = unsafe { uvll::malloc_sockaddr_storage() };
329-
330-
let r = unsafe {
331-
uvll::rust_uv_tcp_getsockname(self.watcher.native_handle(),
332-
r_addr as *uvll::sockaddr_storage)
333-
};
334-
335-
if r != 0 {
336-
let status = status_to_maybe_uv_error(self.watcher, r);
337-
return Err(uv_error_to_io_error(status.unwrap()));
338-
}
339-
340-
let addr = unsafe {
341-
if uvll::is_ip6_addr(r_addr as *uvll::sockaddr) {
342-
net::uv_ip_to_ip(UvIpv6(r_addr as *uvll::sockaddr_in6))
343-
} else {
344-
net::uv_ip_to_ip(UvIpv4(r_addr as *uvll::sockaddr_in))
345-
}
346-
};
347-
348-
unsafe { uvll::free_sockaddr_storage(r_addr); }
349-
350-
Ok(addr)
368+
socket_name(Tcp, self.watcher)
351369
}
352370
}
353371

@@ -409,31 +427,7 @@ impl Drop for UvTcpStream {
409427

410428
impl RtioSocket for UvTcpStream {
411429
fn socket_name(&mut self) -> Result<IpAddr, IoError> {
412-
// Allocate a sockaddr_storage
413-
// since we don't know if it's ipv4 or ipv6
414-
let r_addr = unsafe { uvll::malloc_sockaddr_storage() };
415-
416-
let r = unsafe {
417-
uvll::rust_uv_tcp_getsockname(self.native_handle(),
418-
r_addr as *uvll::sockaddr_storage)
419-
};
420-
421-
if r != 0 {
422-
let status = status_to_maybe_uv_error(**self, r);
423-
return Err(uv_error_to_io_error(status.unwrap()));
424-
}
425-
426-
let addr = unsafe {
427-
if uvll::is_ip6_addr(r_addr as *uvll::sockaddr) {
428-
net::uv_ip_to_ip(UvIpv6(r_addr as *uvll::sockaddr_in6))
429-
} else {
430-
net::uv_ip_to_ip(UvIpv4(r_addr as *uvll::sockaddr_in))
431-
}
432-
};
433-
434-
unsafe { uvll::free_sockaddr_storage(r_addr); }
435-
436-
Ok(addr)
430+
socket_name(Tcp, **self)
437431
}
438432
}
439433

@@ -510,31 +504,7 @@ impl RtioTcpStream for UvTcpStream {
510504
}
511505

512506
fn peer_name(&mut self) -> Result<IpAddr, IoError> {
513-
// Allocate a sockaddr_storage
514-
// since we don't know if it's ipv4 or ipv6
515-
let r_addr = unsafe { uvll::malloc_sockaddr_storage() };
516-
517-
let r = unsafe {
518-
uvll::rust_uv_tcp_getpeername(self.native_handle(),
519-
r_addr as *uvll::sockaddr_storage)
520-
};
521-
522-
if r != 0 {
523-
let status = status_to_maybe_uv_error(**self, r);
524-
return Err(uv_error_to_io_error(status.unwrap()));
525-
}
526-
527-
let addr = unsafe {
528-
if uvll::is_ip6_addr(r_addr as *uvll::sockaddr) {
529-
net::uv_ip_to_ip(UvIpv6(r_addr as *uvll::sockaddr_in6))
530-
} else {
531-
net::uv_ip_to_ip(UvIpv4(r_addr as *uvll::sockaddr_in))
532-
}
533-
};
534-
535-
unsafe { uvll::free_sockaddr_storage(r_addr); }
536-
537-
Ok(addr)
507+
socket_name(TcpPeer, **self)
538508
}
539509

540510
// XXX implement
@@ -562,31 +532,7 @@ impl Drop for UvUdpSocket {
562532

563533
impl RtioSocket for UvUdpSocket {
564534
fn socket_name(&mut self) -> Result<IpAddr, IoError> {
565-
// Allocate a sockaddr_storage
566-
// since we don't know if it's ipv4 or ipv6
567-
let r_addr = unsafe { uvll::malloc_sockaddr_storage() };
568-
569-
let r = unsafe {
570-
uvll::rust_uv_udp_getsockname(self.native_handle(),
571-
r_addr as *uvll::sockaddr_storage)
572-
};
573-
574-
if r != 0 {
575-
let status = status_to_maybe_uv_error(**self, r);
576-
return Err(uv_error_to_io_error(status.unwrap()));
577-
}
578-
579-
let addr = unsafe {
580-
if uvll::is_ip6_addr(r_addr as *uvll::sockaddr) {
581-
net::uv_ip_to_ip(UvIpv6(r_addr as *uvll::sockaddr_in6))
582-
} else {
583-
net::uv_ip_to_ip(UvIpv4(r_addr as *uvll::sockaddr_in))
584-
}
585-
};
586-
587-
unsafe { uvll::free_sockaddr_storage(r_addr); }
588-
589-
Ok(addr)
535+
socket_name(Udp, **self)
590536
}
591537
}
592538

0 commit comments

Comments
 (0)