@@ -15,6 +15,7 @@ use cell::Cell;
15
15
use cast;
16
16
use cast:: transmute;
17
17
use clone:: Clone ;
18
+ use libc:: c_void;
18
19
use rt:: io:: IoError ;
19
20
use rt:: io:: net:: ip:: IpAddr ;
20
21
use rt:: uv:: * ;
@@ -34,6 +35,47 @@ use unstable::sync::{Exclusive, exclusive};
34
35
next_test_ip4,
35
36
run_in_newsched_task} ;
36
37
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
+ }
37
79
38
80
pub struct UvEventLoop {
39
81
uvio : UvIoFactory
@@ -323,31 +365,7 @@ impl Drop for UvTcpListener {
323
365
324
366
impl RtioSocket for UvTcpListener {
325
367
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 )
351
369
}
352
370
}
353
371
@@ -409,31 +427,7 @@ impl Drop for UvTcpStream {
409
427
410
428
impl RtioSocket for UvTcpStream {
411
429
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 )
437
431
}
438
432
}
439
433
@@ -510,31 +504,7 @@ impl RtioTcpStream for UvTcpStream {
510
504
}
511
505
512
506
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 )
538
508
}
539
509
540
510
// XXX implement
@@ -562,31 +532,7 @@ impl Drop for UvUdpSocket {
562
532
563
533
impl RtioSocket for UvUdpSocket {
564
534
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 )
590
536
}
591
537
}
592
538
0 commit comments