@@ -16,8 +16,9 @@ use cast;
16
16
use cast:: transmute;
17
17
use clone:: Clone ;
18
18
use libc:: { c_int, c_uint, c_void} ;
19
+ use ptr;
19
20
use rt:: io:: IoError ;
20
- use rt:: io:: net:: ip:: IpAddr ;
21
+ use rt:: io:: net:: ip:: { IpAddr , Ipv4 , Ipv6 } ;
21
22
use rt:: uv:: * ;
22
23
use rt:: uv:: idle:: IdleWatcher ;
23
24
use rt:: uv:: net:: { UvIpv4 , UvIpv6 } ;
@@ -26,6 +27,7 @@ use rt::sched::Scheduler;
26
27
use rt:: io:: { standard_error, OtherIoError } ;
27
28
use rt:: tube:: Tube ;
28
29
use rt:: local:: Local ;
30
+ use str:: StrSlice ;
29
31
use unstable:: sync:: { Exclusive , exclusive} ;
30
32
31
33
#[ cfg( test) ] use container:: Container ;
@@ -657,18 +659,117 @@ impl RtioUdpSocket for UvUdpSocket {
657
659
return result_cell. take ( ) ;
658
660
}
659
661
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
+ }
663
729
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
+ } ;
666
734
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
+ }
669
740
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
+ }
672
773
}
673
774
674
775
pub struct UvTimer ( timer:: TimerWatcher ) ;
0 commit comments