@@ -48,37 +48,35 @@ impl Drop for Event {
48
48
// TCP listeners
49
49
////////////////////////////////////////////////////////////////////////////////
50
50
51
- pub struct TcpListener {
52
- inner : FileDesc ,
53
- }
51
+ pub struct TcpListener { sock : sock_t }
54
52
55
53
impl TcpListener {
56
54
pub fn bind ( addr : ip:: SocketAddr ) -> IoResult < TcpListener > {
57
55
sys:: init_net ( ) ;
58
56
59
- let fd = try!( socket ( addr, libc:: SOCK_STREAM ) ) ;
60
- let ret = TcpListener { inner : FileDesc :: new ( fd as libc :: c_int , true ) } ;
57
+ let sock = try!( socket ( addr, libc:: SOCK_STREAM ) ) ;
58
+ let ret = TcpListener { sock : sock } ;
61
59
62
60
let mut storage = unsafe { mem:: zeroed ( ) } ;
63
61
let len = addr_to_sockaddr ( addr, & mut storage) ;
64
62
let addrp = & storage as * const _ as * const libc:: sockaddr ;
65
63
66
- match unsafe { libc:: bind ( fd , addrp, len) } {
64
+ match unsafe { libc:: bind ( sock , addrp, len) } {
67
65
-1 => Err ( last_net_error ( ) ) ,
68
66
_ => Ok ( ret) ,
69
67
}
70
68
}
71
69
72
- pub fn fd ( & self ) -> sock_t { self . inner . fd as sock_t }
70
+ pub fn socket ( & self ) -> sock_t { self . sock }
73
71
74
72
pub fn listen ( self , backlog : int ) -> IoResult < TcpAcceptor > {
75
- match unsafe { libc:: listen ( self . fd ( ) , backlog as libc:: c_int ) } {
73
+ match unsafe { libc:: listen ( self . socket ( ) , backlog as libc:: c_int ) } {
76
74
-1 => Err ( last_net_error ( ) ) ,
77
75
78
76
_ => {
79
77
let accept = try!( Event :: new ( ) ) ;
80
78
let ret = unsafe {
81
- c:: WSAEventSelect ( self . fd ( ) , accept. handle ( ) , c:: FD_ACCEPT )
79
+ c:: WSAEventSelect ( self . socket ( ) , accept. handle ( ) , c:: FD_ACCEPT )
82
80
} ;
83
81
if ret != 0 {
84
82
return Err ( last_net_error ( ) )
@@ -97,7 +95,13 @@ impl TcpListener {
97
95
}
98
96
99
97
pub fn socket_name ( & mut self ) -> IoResult < ip:: SocketAddr > {
100
- sockname ( self . fd ( ) , libc:: getsockname)
98
+ sockname ( self . socket ( ) , libc:: getsockname)
99
+ }
100
+ }
101
+
102
+ impl Drop for TcpListener {
103
+ fn drop ( & mut self ) {
104
+ unsafe { super :: close_sock ( self . sock ) ; }
101
105
}
102
106
}
103
107
@@ -114,7 +118,7 @@ struct AcceptorInner {
114
118
}
115
119
116
120
impl TcpAcceptor {
117
- pub fn fd ( & self ) -> sock_t { self . inner . listener . fd ( ) }
121
+ pub fn socket ( & self ) -> sock_t { self . inner . listener . socket ( ) }
118
122
119
123
pub fn accept ( & mut self ) -> IoResult < TcpStream > {
120
124
// Unlink unix, windows cannot invoke `select` on arbitrary file
@@ -161,27 +165,27 @@ impl TcpAcceptor {
161
165
162
166
let mut wsaevents: c:: WSANETWORKEVENTS = unsafe { mem:: zeroed ( ) } ;
163
167
let ret = unsafe {
164
- c:: WSAEnumNetworkEvents ( self . fd ( ) , events[ 1 ] , & mut wsaevents)
168
+ c:: WSAEnumNetworkEvents ( self . socket ( ) , events[ 1 ] , & mut wsaevents)
165
169
} ;
166
170
if ret != 0 { return Err ( last_net_error ( ) ) }
167
171
168
172
if wsaevents. lNetworkEvents & c:: FD_ACCEPT == 0 { continue }
169
173
match unsafe {
170
- libc:: accept ( self . fd ( ) , ptr:: null_mut ( ) , ptr:: null_mut ( ) )
174
+ libc:: accept ( self . socket ( ) , ptr:: null_mut ( ) , ptr:: null_mut ( ) )
171
175
} {
172
176
-1 if wouldblock ( ) => { }
173
177
-1 => return Err ( last_net_error ( ) ) ,
174
178
175
179
// Accepted sockets inherit the same properties as the caller,
176
180
// so we need to deregister our event and switch the socket back
177
181
// to blocking mode
178
- fd => {
179
- let stream = TcpStream :: new ( fd ) ;
182
+ socket => {
183
+ let stream = TcpStream :: new ( socket ) ;
180
184
let ret = unsafe {
181
- c:: WSAEventSelect ( fd , events[ 1 ] , 0 )
185
+ c:: WSAEventSelect ( socket , events[ 1 ] , 0 )
182
186
} ;
183
187
if ret != 0 { return Err ( last_net_error ( ) ) }
184
- try!( set_nonblocking ( fd , false ) ) ;
188
+ try!( set_nonblocking ( socket , false ) ) ;
185
189
return Ok ( stream)
186
190
}
187
191
}
@@ -191,7 +195,7 @@ impl TcpAcceptor {
191
195
}
192
196
193
197
pub fn socket_name ( & mut self ) -> IoResult < ip:: SocketAddr > {
194
- sockname ( self . fd ( ) , libc:: getsockname)
198
+ sockname ( self . socket ( ) , libc:: getsockname)
195
199
}
196
200
197
201
pub fn set_timeout ( & mut self , timeout : Option < u64 > ) {
0 commit comments