1
1
use crate :: convert:: TryFrom ;
2
2
use crate :: fmt;
3
3
use crate :: io:: { self , ErrorKind , IoSlice , IoSliceMut } ;
4
- use crate :: net:: { Ipv4Addr , Ipv6Addr , Shutdown , SocketAddr } ;
4
+ use crate :: net:: { IpAddr , Ipv4Addr , Ipv6Addr , Shutdown , SocketAddr } ;
5
5
use crate :: str;
6
+ use crate :: sync:: Arc ;
6
7
use crate :: sys:: hermit:: abi;
8
+ use crate :: sys:: hermit:: abi:: IpAddress :: { Ipv4 , Ipv6 } ;
7
9
use crate :: sys:: { unsupported, Void } ;
10
+ use crate :: sys_common:: AsInner ;
8
11
use crate :: time:: Duration ;
9
12
10
13
/// Checks whether the HermitCore's socket interface has been started already, and
@@ -17,14 +20,37 @@ pub fn init() -> io::Result<()> {
17
20
Ok ( ( ) )
18
21
}
19
22
20
- pub struct TcpStream ( abi:: Handle ) ;
23
+ #[ derive( Debug , Clone ) ]
24
+ pub struct Socket ( abi:: Handle ) ;
25
+
26
+ impl Socket {
27
+ fn new ( handle : abi:: Handle ) -> Socket {
28
+ Socket ( handle)
29
+ }
30
+ }
31
+
32
+ impl AsInner < abi:: Handle > for Socket {
33
+ fn as_inner ( & self ) -> & abi:: Handle {
34
+ & self . 0
35
+ }
36
+ }
37
+
38
+ impl Drop for Socket {
39
+ fn drop ( & mut self ) {
40
+ let _ = abi:: tcpstream:: close ( self . 0 ) ;
41
+ }
42
+ }
43
+
44
+
45
+ #[ derive( Clone ) ]
46
+ pub struct TcpStream ( Arc < Socket > ) ;
21
47
22
48
impl TcpStream {
23
49
pub fn connect ( addr : io:: Result < & SocketAddr > ) -> io:: Result < TcpStream > {
24
50
let addr = addr?;
25
51
26
52
match abi:: tcpstream:: connect ( addr. ip ( ) . to_string ( ) . as_bytes ( ) , addr. port ( ) , None ) {
27
- Ok ( handle) => Ok ( TcpStream ( handle) ) ,
53
+ Ok ( handle) => Ok ( TcpStream ( Arc :: new ( Socket ( handle) ) ) ) ,
28
54
_ => {
29
55
Err ( io:: Error :: new ( ErrorKind :: Other , "Unable to initiate a connection on a socket" ) )
30
56
}
@@ -37,39 +63,42 @@ impl TcpStream {
37
63
saddr. port ( ) ,
38
64
Some ( duration. as_millis ( ) as u64 ) ,
39
65
) {
40
- Ok ( handle) => Ok ( TcpStream ( handle) ) ,
66
+ Ok ( handle) => Ok ( TcpStream ( Arc :: new ( Socket ( handle) ) ) ) ,
41
67
_ => {
42
68
Err ( io:: Error :: new ( ErrorKind :: Other , "Unable to initiate a connection on a socket" ) )
43
69
}
44
70
}
45
71
}
46
72
47
73
pub fn set_read_timeout ( & self , duration : Option < Duration > ) -> io:: Result < ( ) > {
48
- abi:: tcpstream:: set_read_timeout ( self . 0 , duration. map ( |d| d. as_millis ( ) as u64 ) )
74
+ abi:: tcpstream:: set_read_timeout ( * self . 0 . as_inner ( ) , duration. map ( |d| d. as_millis ( ) as u64 ) )
49
75
. map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "Unable to set timeout value" ) )
50
76
}
51
77
52
78
pub fn set_write_timeout ( & self , duration : Option < Duration > ) -> io:: Result < ( ) > {
53
- abi:: tcpstream:: set_write_timeout ( self . 0 , duration. map ( |d| d. as_millis ( ) as u64 ) )
54
- . map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "Unable to set timeout value" ) )
79
+ abi:: tcpstream:: set_write_timeout (
80
+ * self . 0 . as_inner ( ) ,
81
+ duration. map ( |d| d. as_millis ( ) as u64 ) ,
82
+ )
83
+ . map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "Unable to set timeout value" ) )
55
84
}
56
85
57
86
pub fn read_timeout ( & self ) -> io:: Result < Option < Duration > > {
58
- let duration = abi:: tcpstream:: get_read_timeout ( self . 0 )
87
+ let duration = abi:: tcpstream:: get_read_timeout ( * self . 0 . as_inner ( ) )
59
88
. map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "Unable to determine timeout value" ) ) ?;
60
89
61
90
Ok ( duration. map ( |d| Duration :: from_millis ( d) ) )
62
91
}
63
92
64
93
pub fn write_timeout ( & self ) -> io:: Result < Option < Duration > > {
65
- let duration = abi:: tcpstream:: get_write_timeout ( self . 0 )
94
+ let duration = abi:: tcpstream:: get_write_timeout ( * self . 0 . as_inner ( ) )
66
95
. map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "Unable to determine timeout value" ) ) ?;
67
96
68
97
Ok ( duration. map ( |d| Duration :: from_millis ( d) ) )
69
98
}
70
99
71
100
pub fn peek ( & self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
72
- abi:: tcpstream:: peek ( self . 0 , buf)
101
+ abi:: tcpstream:: peek ( * self . 0 . as_inner ( ) , buf)
73
102
. map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "set_nodelay failed" ) )
74
103
}
75
104
@@ -81,18 +110,11 @@ impl TcpStream {
81
110
let mut size: usize = 0 ;
82
111
83
112
for i in ioslice. iter_mut ( ) {
84
- let mut pos: usize = 0 ;
85
-
86
- while pos < i. len ( ) {
87
- let ret = abi:: tcpstream:: read ( self . 0 , & mut i[ pos..] )
88
- . map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "Unable to read on socket" ) ) ?;
89
-
90
- if ret == 0 {
91
- return Ok ( size) ;
92
- } else {
93
- size += ret;
94
- pos += ret;
95
- }
113
+ let ret = abi:: tcpstream:: read ( * self . 0 . as_inner ( ) , & mut i[ 0 ..] )
114
+ . map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "Unable to read on socket" ) ) ?;
115
+
116
+ if ret != 0 {
117
+ size += ret;
96
118
}
97
119
}
98
120
@@ -112,7 +134,7 @@ impl TcpStream {
112
134
let mut size: usize = 0 ;
113
135
114
136
for i in ioslice. iter ( ) {
115
- size += abi:: tcpstream:: write ( self . 0 , i)
137
+ size += abi:: tcpstream:: write ( * self . 0 . as_inner ( ) , i)
116
138
. map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "Unable to write on socket" ) ) ?;
117
139
}
118
140
@@ -125,42 +147,64 @@ impl TcpStream {
125
147
}
126
148
127
149
pub fn peer_addr ( & self ) -> io:: Result < SocketAddr > {
128
- Err ( io:: Error :: new ( ErrorKind :: Other , "peer_addr isn't supported" ) )
150
+ let ( ipaddr, port) = abi:: tcpstream:: peer_addr ( * self . 0 . as_inner ( ) )
151
+ . map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "peer_addr failed" ) ) ?;
152
+
153
+ let saddr = match ipaddr {
154
+ Ipv4 ( ref addr) => SocketAddr :: new (
155
+ IpAddr :: V4 ( Ipv4Addr :: new ( addr. 0 [ 0 ] , addr. 0 [ 1 ] , addr. 0 [ 2 ] , addr. 0 [ 3 ] ) ) ,
156
+ port,
157
+ ) ,
158
+ Ipv6 ( ref addr) => SocketAddr :: new (
159
+ IpAddr :: V6 ( Ipv6Addr :: new (
160
+ ( ( addr. 0 [ 0 ] as u16 ) << 8 ) | addr. 0 [ 1 ] as u16 ,
161
+ ( ( addr. 0 [ 2 ] as u16 ) << 8 ) | addr. 0 [ 3 ] as u16 ,
162
+ ( ( addr. 0 [ 4 ] as u16 ) << 8 ) | addr. 0 [ 5 ] as u16 ,
163
+ ( ( addr. 0 [ 6 ] as u16 ) << 8 ) | addr. 0 [ 7 ] as u16 ,
164
+ ( ( addr. 0 [ 8 ] as u16 ) << 8 ) | addr. 0 [ 9 ] as u16 ,
165
+ ( ( addr. 0 [ 10 ] as u16 ) << 8 ) | addr. 0 [ 11 ] as u16 ,
166
+ ( ( addr. 0 [ 12 ] as u16 ) << 8 ) | addr. 0 [ 13 ] as u16 ,
167
+ ( ( addr. 0 [ 14 ] as u16 ) << 8 ) | addr. 0 [ 15 ] as u16 ) ) ,
168
+ port,
169
+ ) ,
170
+ _ => {
171
+ return Err ( io:: Error :: new ( ErrorKind :: Other , "peer_addr failed" ) ) ;
172
+ } ,
173
+ } ;
174
+
175
+ Ok ( saddr)
129
176
}
130
177
131
178
pub fn socket_addr ( & self ) -> io:: Result < SocketAddr > {
132
179
Err ( io:: Error :: new ( ErrorKind :: Other , "socket_addr isn't supported" ) )
133
180
}
134
181
135
182
pub fn shutdown ( & self , how : Shutdown ) -> io:: Result < ( ) > {
136
- abi:: tcpstream:: shutdown ( self . 0 , how as i32 )
183
+ abi:: tcpstream:: shutdown ( * self . 0 . as_inner ( ) , how as i32 )
137
184
. map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "unable to shutdown socket" ) )
138
185
}
139
186
140
187
pub fn duplicate ( & self ) -> io:: Result < TcpStream > {
141
- let handle = abi:: tcpstream:: duplicate ( self . 0 )
142
- . map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "unable to duplicate stream" ) ) ?;
143
-
144
- Ok ( TcpStream ( handle) )
188
+ Ok ( self . clone ( ) )
145
189
}
146
190
147
191
pub fn set_nodelay ( & self , mode : bool ) -> io:: Result < ( ) > {
148
- abi:: tcpstream:: set_nodelay ( self . 0 , mode)
192
+ abi:: tcpstream:: set_nodelay ( * self . 0 . as_inner ( ) , mode)
149
193
. map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "set_nodelay failed" ) )
150
194
}
151
195
152
196
pub fn nodelay ( & self ) -> io:: Result < bool > {
153
- abi:: tcpstream:: nodelay ( self . 0 )
197
+ abi:: tcpstream:: nodelay ( * self . 0 . as_inner ( ) )
154
198
. map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "nodelay failed" ) )
155
199
}
156
200
157
201
pub fn set_ttl ( & self , tll : u32 ) -> io:: Result < ( ) > {
158
- abi:: tcpstream:: set_tll ( self . 0 , tll)
202
+ abi:: tcpstream:: set_tll ( * self . 0 . as_inner ( ) , tll)
159
203
. map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "unable to set TTL" ) )
160
204
}
161
205
162
206
pub fn ttl ( & self ) -> io:: Result < u32 > {
163
- abi:: tcpstream:: get_tll ( self . 0 )
207
+ abi:: tcpstream:: get_tll ( * self . 0 . as_inner ( ) )
164
208
. map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "unable to get TTL" ) )
165
209
}
166
210
@@ -169,40 +213,61 @@ impl TcpStream {
169
213
}
170
214
171
215
pub fn set_nonblocking ( & self , mode : bool ) -> io:: Result < ( ) > {
172
- abi:: tcpstream:: set_nonblocking ( self . 0 , mode)
216
+ abi:: tcpstream:: set_nonblocking ( * self . 0 . as_inner ( ) , mode)
173
217
. map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "unable to set blocking mode" ) )
174
218
}
175
219
}
176
220
177
- impl Drop for TcpStream {
178
- fn drop ( & mut self ) {
179
- let _ = abi:: tcpstream:: close ( self . 0 ) ;
180
- }
181
- }
182
-
183
221
impl fmt:: Debug for TcpStream {
184
222
fn fmt ( & self , _f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
185
223
Ok ( ( ) )
186
224
}
187
225
}
188
226
189
- pub struct TcpListener ( abi:: Handle ) ;
227
+ #[ derive( Clone ) ]
228
+ pub struct TcpListener ( SocketAddr ) ;
190
229
191
230
impl TcpListener {
192
- pub fn bind ( _: io:: Result < & SocketAddr > ) -> io:: Result < TcpListener > {
193
- Err ( io:: Error :: new ( ErrorKind :: Other , "not supported" ) )
231
+ pub fn bind ( addr : io:: Result < & SocketAddr > ) -> io:: Result < TcpListener > {
232
+ let addr = addr?;
233
+
234
+ Ok ( TcpListener ( * addr) )
194
235
}
195
236
196
237
pub fn socket_addr ( & self ) -> io:: Result < SocketAddr > {
197
- Err ( io :: Error :: new ( ErrorKind :: Other , "not supported" ) )
238
+ Ok ( self . 0 )
198
239
}
199
240
200
241
pub fn accept ( & self ) -> io:: Result < ( TcpStream , SocketAddr ) > {
201
- Err ( io:: Error :: new ( ErrorKind :: Other , "not supported" ) )
242
+ let ( handle, ipaddr, port) = abi:: tcplistener:: accept ( self . 0 . port ( ) )
243
+ . map_err ( |_| io:: Error :: new ( ErrorKind :: Other , "accept failed" ) ) ?;
244
+ let saddr = match ipaddr {
245
+ Ipv4 ( ref addr) => SocketAddr :: new (
246
+ IpAddr :: V4 ( Ipv4Addr :: new ( addr. 0 [ 0 ] , addr. 0 [ 1 ] , addr. 0 [ 2 ] , addr. 0 [ 3 ] ) ) ,
247
+ port,
248
+ ) ,
249
+ Ipv6 ( ref addr) => SocketAddr :: new (
250
+ IpAddr :: V6 ( Ipv6Addr :: new (
251
+ ( ( addr. 0 [ 0 ] as u16 ) << 8 ) | addr. 0 [ 1 ] as u16 ,
252
+ ( ( addr. 0 [ 2 ] as u16 ) << 8 ) | addr. 0 [ 3 ] as u16 ,
253
+ ( ( addr. 0 [ 4 ] as u16 ) << 8 ) | addr. 0 [ 5 ] as u16 ,
254
+ ( ( addr. 0 [ 6 ] as u16 ) << 8 ) | addr. 0 [ 7 ] as u16 ,
255
+ ( ( addr. 0 [ 8 ] as u16 ) << 8 ) | addr. 0 [ 9 ] as u16 ,
256
+ ( ( addr. 0 [ 10 ] as u16 ) << 8 ) | addr. 0 [ 11 ] as u16 ,
257
+ ( ( addr. 0 [ 12 ] as u16 ) << 8 ) | addr. 0 [ 13 ] as u16 ,
258
+ ( ( addr. 0 [ 14 ] as u16 ) << 8 ) | addr. 0 [ 15 ] as u16 ) ) ,
259
+ port,
260
+ ) ,
261
+ _ => {
262
+ return Err ( io:: Error :: new ( ErrorKind :: Other , "accept failed" ) ) ;
263
+ } ,
264
+ } ;
265
+
266
+ Ok ( ( TcpStream ( Arc :: new ( Socket ( handle) ) ) , saddr) )
202
267
}
203
268
204
269
pub fn duplicate ( & self ) -> io:: Result < TcpListener > {
205
- Err ( io :: Error :: new ( ErrorKind :: Other , "not supported" ) )
270
+ Ok ( self . clone ( ) )
206
271
}
207
272
208
273
pub fn set_ttl ( & self , _: u32 ) -> io:: Result < ( ) > {
0 commit comments