Skip to content

Commit 037bf37

Browse files
committed
libstd: Implement some missing udp methods.
1 parent a5c6b85 commit 037bf37

File tree

5 files changed

+139
-21
lines changed

5 files changed

+139
-21
lines changed

src/libstd/rt/rtio.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,17 @@ pub trait RtioUdpSocket : RtioSocket {
7474
fn recvfrom(&mut self, buf: &mut [u8]) -> Result<(uint, IpAddr), IoError>;
7575
fn sendto(&mut self, buf: &[u8], dst: IpAddr) -> Result<(), IoError>;
7676

77-
fn join_multicast(&mut self, multi: IpAddr);
78-
fn leave_multicast(&mut self, multi: IpAddr);
77+
fn join_multicast(&mut self, multi: IpAddr) -> Result<(), IoError>;
78+
fn leave_multicast(&mut self, multi: IpAddr) -> Result<(), IoError>;
7979

80-
fn loop_multicast_locally(&mut self);
81-
fn dont_loop_multicast_locally(&mut self);
80+
fn loop_multicast_locally(&mut self) -> Result<(), IoError>;
81+
fn dont_loop_multicast_locally(&mut self) -> Result<(), IoError>;
8282

83-
fn multicast_time_to_live(&mut self, ttl: int);
84-
fn time_to_live(&mut self, ttl: int);
83+
fn multicast_time_to_live(&mut self, ttl: int) -> Result<(), IoError>;
84+
fn time_to_live(&mut self, ttl: int) -> Result<(), IoError>;
8585

86-
fn hear_broadcasts(&mut self);
87-
fn ignore_broadcasts(&mut self);
86+
fn hear_broadcasts(&mut self) -> Result<(), IoError>;
87+
fn ignore_broadcasts(&mut self) -> Result<(), IoError>;
8888
}
8989

9090
pub trait RtioTimer {

src/libstd/rt/uv/uvio.rs

Lines changed: 111 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ use cast;
1616
use cast::transmute;
1717
use clone::Clone;
1818
use libc::{c_int, c_uint, c_void};
19+
use ptr;
1920
use rt::io::IoError;
20-
use rt::io::net::ip::IpAddr;
21+
use rt::io::net::ip::{IpAddr, Ipv4, Ipv6};
2122
use rt::uv::*;
2223
use rt::uv::idle::IdleWatcher;
2324
use rt::uv::net::{UvIpv4, UvIpv6};
@@ -26,6 +27,7 @@ use rt::sched::Scheduler;
2627
use rt::io::{standard_error, OtherIoError};
2728
use rt::tube::Tube;
2829
use rt::local::Local;
30+
use str::StrSlice;
2931
use unstable::sync::{Exclusive, exclusive};
3032

3133
#[cfg(test)] use container::Container;
@@ -657,18 +659,117 @@ impl RtioUdpSocket for UvUdpSocket {
657659
return result_cell.take();
658660
}
659661

660-
// XXX implement
661-
fn join_multicast(&mut self, _multi: IpAddr) { fail!(); }
662-
fn leave_multicast(&mut self, _multi: IpAddr) { fail!(); }
662+
fn join_multicast(&mut self, multi: IpAddr) -> Result<(), IoError> {
663+
let ip_str = match multi {
664+
Ipv4(x1, x2, x3, x4, _) =>
665+
fmt!("%u.%u.%u.%u", x1 as uint, x2 as uint, x3 as uint, x4 as uint),
666+
Ipv6(x1, x2, x3, x4, x5, x6, x7, x8, _) =>
667+
fmt!("%x:%x:%x:%x:%x:%x:%x:%x",
668+
x1 as uint, x2 as uint, x3 as uint, x4 as uint,
669+
x5 as uint, x6 as uint, x7 as uint, x8 as uint),
670+
};
671+
672+
let r = unsafe {
673+
do ip_str.as_c_str |m_addr| {
674+
uvll::udp_set_membership(self.native_handle(), m_addr,
675+
ptr::null(), uvll::UV_JOIN_GROUP)
676+
}
677+
};
678+
679+
match status_to_maybe_uv_error(**self, r) {
680+
Some(err) => Err(uv_error_to_io_error(err)),
681+
None => Ok(())
682+
}
683+
}
684+
685+
fn leave_multicast(&mut self, multi: IpAddr) -> Result<(), IoError> {
686+
let ip_str = match multi {
687+
Ipv4(x1, x2, x3, x4, _) =>
688+
fmt!("%u.%u.%u.%u", x1 as uint, x2 as uint, x3 as uint, x4 as uint),
689+
Ipv6(x1, x2, x3, x4, x5, x6, x7, x8, _) =>
690+
fmt!("%x:%x:%x:%x:%x:%x:%x:%x",
691+
x1 as uint, x2 as uint, x3 as uint, x4 as uint,
692+
x5 as uint, x6 as uint, x7 as uint, x8 as uint),
693+
};
694+
695+
let r = unsafe {
696+
do ip_str.as_c_str |m_addr| {
697+
uvll::udp_set_membership(self.native_handle(), m_addr,
698+
ptr::null(), uvll::UV_LEAVE_GROUP)
699+
}
700+
};
701+
702+
match status_to_maybe_uv_error(**self, r) {
703+
Some(err) => Err(uv_error_to_io_error(err)),
704+
None => Ok(())
705+
}
706+
}
707+
708+
fn loop_multicast_locally(&mut self) -> Result<(), IoError> {
709+
let r = unsafe {
710+
uvll::udp_set_multicast_loop(self.native_handle(), 1 as c_int)
711+
};
712+
713+
match status_to_maybe_uv_error(**self, r) {
714+
Some(err) => Err(uv_error_to_io_error(err)),
715+
None => Ok(())
716+
}
717+
}
718+
719+
fn dont_loop_multicast_locally(&mut self) -> Result<(), IoError> {
720+
let r = unsafe {
721+
uvll::udp_set_multicast_loop(self.native_handle(), 0 as c_int)
722+
};
723+
724+
match status_to_maybe_uv_error(**self, r) {
725+
Some(err) => Err(uv_error_to_io_error(err)),
726+
None => Ok(())
727+
}
728+
}
663729

664-
fn loop_multicast_locally(&mut self) { fail!(); }
665-
fn dont_loop_multicast_locally(&mut self) { fail!(); }
730+
fn multicast_time_to_live(&mut self, ttl: int) -> Result<(), IoError> {
731+
let r = unsafe {
732+
uvll::udp_set_multicast_ttl(self.native_handle(), ttl as c_int)
733+
};
666734

667-
fn multicast_time_to_live(&mut self, _ttl: int) { fail!(); }
668-
fn time_to_live(&mut self, _ttl: int) { fail!(); }
735+
match status_to_maybe_uv_error(**self, r) {
736+
Some(err) => Err(uv_error_to_io_error(err)),
737+
None => Ok(())
738+
}
739+
}
669740

670-
fn hear_broadcasts(&mut self) { fail!(); }
671-
fn ignore_broadcasts(&mut self) { fail!(); }
741+
fn time_to_live(&mut self, ttl: int) -> Result<(), IoError> {
742+
let r = unsafe {
743+
uvll::udp_set_ttl(self.native_handle(), ttl as c_int)
744+
};
745+
746+
match status_to_maybe_uv_error(**self, r) {
747+
Some(err) => Err(uv_error_to_io_error(err)),
748+
None => Ok(())
749+
}
750+
}
751+
752+
fn hear_broadcasts(&mut self) -> Result<(), IoError> {
753+
let r = unsafe {
754+
uvll::udp_set_broadcast(self.native_handle(), 1 as c_int)
755+
};
756+
757+
match status_to_maybe_uv_error(**self, r) {
758+
Some(err) => Err(uv_error_to_io_error(err)),
759+
None => Ok(())
760+
}
761+
}
762+
763+
fn ignore_broadcasts(&mut self) -> Result<(), IoError> {
764+
let r = unsafe {
765+
uvll::udp_set_broadcast(self.native_handle(), 0 as c_int)
766+
};
767+
768+
match status_to_maybe_uv_error(**self, r) {
769+
Some(err) => Err(uv_error_to_io_error(err)),
770+
None => Ok(())
771+
}
772+
}
672773
}
673774

674775
pub struct UvTimer(timer::TimerWatcher);

src/libstd/rt/uv/uvll.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ pub type sockaddr = c_void;
7878
pub type sockaddr_in = c_void;
7979
pub type sockaddr_in6 = c_void;
8080
pub type sockaddr_storage = c_void;
81-
pub type uv_membership = c_void;
8281

8382
#[deriving(Eq)]
8483
pub enum uv_handle_type {
@@ -117,6 +116,12 @@ pub enum uv_req_type {
117116
UV_REQ_TYPE_MAX
118117
}
119118

119+
#[deriving(Eq)]
120+
pub enum uv_membership {
121+
UV_LEAVE_GROUP,
122+
UV_JOIN_GROUP
123+
}
124+
120125
pub unsafe fn malloc_handle(handle: uv_handle_type) -> *c_void {
121126
assert!(handle != UV_UNKNOWN_HANDLE && handle != UV_HANDLE_TYPE_MAX);
122127
let size = rust_uv_handle_size(handle as uint);
@@ -240,7 +245,7 @@ pub unsafe fn udp_get_sockname(handle: *uv_udp_t, name: *sockaddr_storage) -> c_
240245

241246
pub unsafe fn udp_set_membership(handle: *uv_udp_t, multicast_addr: *c_char,
242247
interface_addr: *c_char, membership: uv_membership) -> c_int {
243-
return rust_uv_udp_set_membership(handle, multicast_addr, interface_addr, membership);
248+
return rust_uv_udp_set_membership(handle, multicast_addr, interface_addr, membership as c_int);
244249
}
245250

246251
pub unsafe fn udp_set_multicast_loop(handle: *uv_udp_t, on: c_int) -> c_int {
@@ -251,6 +256,10 @@ pub unsafe fn udp_set_multicast_ttl(handle: *uv_udp_t, ttl: c_int) -> c_int {
251256
return rust_uv_udp_set_multicast_ttl(handle, ttl);
252257
}
253258

259+
pub unsafe fn udp_set_ttl(handle: *uv_udp_t, ttl: c_int) -> c_int {
260+
return rust_uv_udp_set_ttl(handle, ttl);
261+
}
262+
254263
pub unsafe fn udp_set_broadcast(handle: *uv_udp_t, on: c_int) -> c_int {
255264
return rust_uv_udp_set_broadcast(handle, on);
256265
}
@@ -527,9 +536,10 @@ extern {
527536
fn rust_uv_get_udp_handle_from_send_req(req: *uv_udp_send_t) -> *uv_udp_t;
528537
fn rust_uv_udp_getsockname(handle: *uv_udp_t, name: *sockaddr_storage) -> c_int;
529538
fn rust_uv_udp_set_membership(handle: *uv_udp_t, multicast_addr: *c_char,
530-
interface_addr: *c_char, membership: uv_membership) -> c_int;
539+
interface_addr: *c_char, membership: c_int) -> c_int;
531540
fn rust_uv_udp_set_multicast_loop(handle: *uv_udp_t, on: c_int) -> c_int;
532541
fn rust_uv_udp_set_multicast_ttl(handle: *uv_udp_t, ttl: c_int) -> c_int;
542+
fn rust_uv_udp_set_ttl(handle: *uv_udp_t, ttl: c_int) -> c_int;
533543
fn rust_uv_udp_set_broadcast(handle: *uv_udp_t, on: c_int) -> c_int;
534544

535545
fn rust_uv_is_ipv4_sockaddr(addr: *sockaddr) -> c_int;

src/rt/rust_uv.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,12 @@ rust_uv_udp_set_multicast_ttl
385385
return uv_udp_set_multicast_ttl(handle, ttl);
386386
}
387387

388+
extern "C" int
389+
rust_uv_udp_set_ttl
390+
(uv_udp_t* handle, int ttl) {
391+
return uv_udp_set_ttl(handle, ttl);
392+
}
393+
388394
extern "C" int
389395
rust_uv_udp_set_broadcast
390396
(uv_udp_t* handle, int on) {

src/rt/rustrt.def.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ rust_uv_udp_getsockname
121121
rust_uv_udp_set_membership
122122
rust_uv_udp_set_multicast_loop
123123
rust_uv_udp_set_multicast_ttl
124+
rust_uv_udp_set_ttl
124125
rust_uv_udp_set_broadcast
125126
rust_uv_is_ipv4_sockaddr
126127
rust_uv_is_ipv6_sockaddr

0 commit comments

Comments
 (0)