@@ -24,12 +24,12 @@ enum AddressFamily {
24
24
}
25
25
26
26
impl AddressFamily {
27
- fn from_i32 ( value : i32 ) -> AddressFamily {
27
+ fn from_i32 ( vm : & mut VirtualMachine , value : i32 ) -> Result < AddressFamily , PyObjectRef > {
28
28
match value {
29
- 1 => AddressFamily :: Unix ,
30
- 2 => AddressFamily :: Inet ,
31
- 3 => AddressFamily :: Inet6 ,
32
- _ => panic ! ( "Unknown value: {}" , value) ,
29
+ 1 => Ok ( AddressFamily :: Unix ) ,
30
+ 2 => Ok ( AddressFamily :: Inet ) ,
31
+ 3 => Ok ( AddressFamily :: Inet6 ) ,
32
+ _ => Err ( vm . new_os_error ( format ! ( "Unknown address family value: {}" , value) ) ) ,
33
33
}
34
34
}
35
35
}
@@ -41,11 +41,11 @@ enum SocketKind {
41
41
}
42
42
43
43
impl SocketKind {
44
- fn from_i32 ( value : i32 ) -> SocketKind {
44
+ fn from_i32 ( vm : & mut VirtualMachine , value : i32 ) -> Result < SocketKind , PyObjectRef > {
45
45
match value {
46
- 1 => SocketKind :: Stream ,
47
- 2 => SocketKind :: Dgram ,
48
- _ => panic ! ( "Unknown value: {}" , value) ,
46
+ 1 => Ok ( SocketKind :: Stream ) ,
47
+ 2 => Ok ( SocketKind :: Dgram ) ,
48
+ _ => Err ( vm . new_os_error ( format ! ( "Unknown socket kind value: {}" , value) ) ) ,
49
49
}
50
50
}
51
51
}
@@ -146,8 +146,9 @@ fn socket_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
146
146
]
147
147
) ;
148
148
149
- let address_family = AddressFamily :: from_i32 ( objint:: get_value ( family_int) . to_i32 ( ) . unwrap ( ) ) ;
150
- let kind = SocketKind :: from_i32 ( objint:: get_value ( kind_int) . to_i32 ( ) . unwrap ( ) ) ;
149
+ let address_family =
150
+ AddressFamily :: from_i32 ( vm, objint:: get_value ( family_int) . to_i32 ( ) . unwrap ( ) ) ?;
151
+ let kind = SocketKind :: from_i32 ( vm, objint:: get_value ( kind_int) . to_i32 ( ) . unwrap ( ) ) ?;
151
152
152
153
let socket = RefCell :: new ( Socket :: new ( address_family, kind) ) ;
153
154
@@ -171,21 +172,18 @@ fn socket_connect(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
171
172
let mut socket = get_socket ( zelf) ;
172
173
173
174
match socket. socket_kind {
174
- SocketKind :: Stream => {
175
- if let Ok ( stream) = TcpStream :: connect ( address_string ) {
175
+ SocketKind :: Stream => match TcpStream :: connect ( address_string ) {
176
+ Ok ( stream) => {
176
177
socket. con = Some ( Connection :: TcpStream ( stream) ) ;
177
178
Ok ( vm. get_none ( ) )
178
- } else {
179
- // TODO: Socket error
180
- Err ( vm. new_type_error ( "socket failed" . to_string ( ) ) )
181
179
}
182
- }
180
+ Err ( s) => Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
181
+ } ,
183
182
SocketKind :: Dgram => {
184
183
if let Some ( Connection :: UdpSocket ( con) ) = & socket. con {
185
184
match con. connect ( address_string) {
186
185
Ok ( _) => Ok ( vm. get_none ( ) ) ,
187
- // TODO: Socket error
188
- Err ( _) => Err ( vm. new_type_error ( "socket failed" . to_string ( ) ) ) ,
186
+ Err ( s) => Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
189
187
}
190
188
} else {
191
189
Err ( vm. new_type_error ( "" . to_string ( ) ) )
@@ -206,24 +204,20 @@ fn socket_bind(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
206
204
let mut socket = get_socket ( zelf) ;
207
205
208
206
match socket. socket_kind {
209
- SocketKind :: Stream => {
210
- if let Ok ( stream) = TcpListener :: bind ( address_string ) {
207
+ SocketKind :: Stream => match TcpListener :: bind ( address_string ) {
208
+ Ok ( stream) => {
211
209
socket. con = Some ( Connection :: TcpListener ( stream) ) ;
212
210
Ok ( vm. get_none ( ) )
213
- } else {
214
- // TODO: Socket error
215
- Err ( vm. new_type_error ( "socket failed" . to_string ( ) ) )
216
211
}
217
- }
218
- SocketKind :: Dgram => {
219
- if let Ok ( dgram) = UdpSocket :: bind ( address_string) {
212
+ Err ( s) => Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
213
+ } ,
214
+ SocketKind :: Dgram => match UdpSocket :: bind ( address_string) {
215
+ Ok ( dgram) => {
220
216
socket. con = Some ( Connection :: UdpSocket ( dgram) ) ;
221
217
Ok ( vm. get_none ( ) )
222
- } else {
223
- // TODO: Socket error
224
- Err ( vm. new_type_error ( "socket failed" . to_string ( ) ) )
225
218
}
226
- }
219
+ Err ( s) => Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
220
+ } ,
227
221
}
228
222
}
229
223
@@ -272,7 +266,7 @@ fn socket_accept(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
272
266
273
267
let ( tcp_stream, addr) = match ret {
274
268
Ok ( ( socket, addr) ) => ( socket, addr) ,
275
- _ => return Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
269
+ Err ( s ) => return Err ( vm. new_os_error ( s . to_string ( ) ) ) ,
276
270
} ;
277
271
278
272
let socket = RefCell :: new ( Socket {
@@ -303,7 +297,10 @@ fn socket_recv(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
303
297
304
298
let mut buffer = vec ! [ 0u8 ; objint:: get_value( bufsize) . to_usize( ) . unwrap( ) ] ;
305
299
match socket. con {
306
- Some ( ref mut v) => v. read_exact ( & mut buffer) . unwrap ( ) ,
300
+ Some ( ref mut v) => match v. read_exact ( & mut buffer) {
301
+ Ok ( _) => ( ) ,
302
+ Err ( s) => return Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
303
+ } ,
307
304
None => return Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
308
305
} ;
309
306
Ok ( vm. ctx . new_bytes ( buffer) )
@@ -326,7 +323,7 @@ fn socket_recvfrom(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
326
323
327
324
let addr = match ret {
328
325
Ok ( ( _size, addr) ) => addr,
329
- _ => return Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
326
+ Err ( s ) => return Err ( vm. new_os_error ( s . to_string ( ) ) ) ,
330
327
} ;
331
328
332
329
let addr_tuple = get_addr_tuple ( vm, addr) ?;
@@ -343,7 +340,10 @@ fn socket_send(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
343
340
let mut socket = get_socket ( zelf) ;
344
341
345
342
match socket. con {
346
- Some ( ref mut v) => v. write ( & objbytes:: get_value ( & bytes) ) . unwrap ( ) ,
343
+ Some ( ref mut v) => match v. write ( & objbytes:: get_value ( & bytes) ) {
344
+ Ok ( _) => ( ) ,
345
+ Err ( s) => return Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
346
+ } ,
347
347
None => return Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
348
348
} ;
349
349
Ok ( vm. get_none ( ) )
@@ -366,22 +366,24 @@ fn socket_sendto(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
366
366
match socket. socket_kind {
367
367
SocketKind :: Dgram => {
368
368
match socket. con {
369
- Some ( ref mut v) => {
370
- if let Ok ( _) = v. send_to ( & objbytes:: get_value ( & bytes) , address_string) {
371
- Ok ( vm. get_none ( ) )
372
- } else {
373
- Err ( vm. new_type_error ( "socket failed" . to_string ( ) ) )
374
- }
375
- }
369
+ Some ( ref mut v) => match v. send_to ( & objbytes:: get_value ( & bytes) , address_string) {
370
+ Ok ( _) => Ok ( vm. get_none ( ) ) ,
371
+ Err ( s) => Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
372
+ } ,
376
373
None => {
377
374
// Doing implicit bind
378
- if let Ok ( dgram) = UdpSocket :: bind ( "0.0.0.0:0" ) {
379
- if let Ok ( _) = dgram. send_to ( & objbytes:: get_value ( & bytes) , address_string) {
380
- socket. con = Some ( Connection :: UdpSocket ( dgram) ) ;
381
- return Ok ( vm. get_none ( ) ) ;
375
+ match UdpSocket :: bind ( "0.0.0.0:0" ) {
376
+ Ok ( dgram) => {
377
+ match dgram. send_to ( & objbytes:: get_value ( & bytes) , address_string) {
378
+ Ok ( _) => {
379
+ socket. con = Some ( Connection :: UdpSocket ( dgram) ) ;
380
+ Ok ( vm. get_none ( ) )
381
+ }
382
+ Err ( s) => Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
383
+ }
382
384
}
385
+ Err ( s) => Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
383
386
}
384
- Err ( vm. new_type_error ( "socket failed" . to_string ( ) ) )
385
387
}
386
388
}
387
389
}
@@ -408,7 +410,7 @@ fn socket_getsockname(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
408
410
409
411
match addr {
410
412
Ok ( addr) => get_addr_tuple ( vm, addr) ,
411
- _ => Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
413
+ Err ( s ) => Err ( vm. new_os_error ( s . to_string ( ) ) ) ,
412
414
}
413
415
}
414
416
0 commit comments