@@ -58,18 +58,24 @@ typedef struct _socket_obj_t {
58
58
uint8_t proto ;
59
59
} socket_obj_t ;
60
60
61
+ NORETURN static void exception_from_errno (int _errno ) {
62
+ // XXX add more specific exceptions
63
+ mp_raise_OSError (_errno );
64
+ }
65
+
61
66
STATIC mp_obj_t socket_close (const mp_obj_t arg0 ) {
62
67
socket_obj_t * self = MP_OBJ_TO_PTR (arg0 );
63
- lwip_close_r (self -> fd );
68
+ if (self -> fd >= 0 ) {
69
+ int ret = lwip_close_r (self -> fd );
70
+ if (ret != 0 ) {
71
+ exception_from_errno (errno );
72
+ }
73
+ self -> fd = -1 ;
74
+ }
64
75
return mp_const_none ;
65
76
}
66
77
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (socket_close_obj , socket_close );
67
78
68
- NORETURN static void exception_from_errno (int _errno ) {
69
- // XXX add more specific exceptions
70
- mp_raise_OSError (_errno );
71
- }
72
-
73
79
static int _socket_getaddrinfo2 (const mp_obj_t host , const mp_obj_t portx , struct addrinfo * * resp ) {
74
80
const struct addrinfo hints = {
75
81
.ai_family = AF_INET ,
@@ -341,6 +347,9 @@ STATIC mp_obj_t get_socket(mp_uint_t n_args, const mp_obj_t *args) {
341
347
sock -> type = SOCK_STREAM ;
342
348
sock -> proto = IPPROTO_TCP ;
343
349
sock -> fd = lwip_socket (sock -> domain , sock -> type , sock -> proto );
350
+ if (sock -> fd < 0 ) {
351
+ exception_from_errno (errno );
352
+ }
344
353
return MP_OBJ_FROM_PTR (sock );
345
354
}
346
355
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (get_socket_obj , 0 , 3 , get_socket );
0 commit comments