4
4
* The MIT License (MIT)
5
5
*
6
6
* Copyright (c) 2014 Damien P. George
7
+ * 2018 Nick Moore for Adafruit Industries
7
8
*
8
9
* Permission is hereby granted, free of charge, to any person obtaining a copy
9
10
* of this software and associated documentation files (the "Software"), to deal
33
34
#include "py/stream.h"
34
35
#include "py/mperrno.h"
35
36
#include "lib/netutils/netutils.h"
36
- #include "modnetwork.h"
37
37
38
- #if MICROPY_PY_USOCKET
38
+ #include "shared-bindings/network/__init__.h"
39
39
40
- /******************************************************************************/
41
- // socket class
40
+ //| :mod:`socket` --- TCP, UDP and RAW socket support
41
+ //| =================================================
42
+ //|
43
+ //| .. module:: socket
44
+ //| :synopsis: TCP, UDP and RAW sockets
45
+ //| :platform: SAMD21, SAMD51
46
+ //|
47
+ //| XXX TODO Write Docs.
42
48
43
49
STATIC const mp_obj_type_t socket_type ;
44
50
@@ -48,7 +54,7 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, size_t n_args, size_t
48
54
49
55
// create socket object (not bound to any NIC yet)
50
56
mod_network_socket_obj_t * s = m_new_obj_with_finaliser (mod_network_socket_obj_t );
51
- s -> base .type = ( mp_obj_t ) & socket_type ;
57
+ s -> base .type = & socket_type ;
52
58
s -> nic = MP_OBJ_NULL ;
53
59
s -> nic_type = NULL ;
54
60
s -> u_param .domain = MOD_NETWORK_AF_INET ;
@@ -64,7 +70,7 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, size_t n_args, size_t
64
70
}
65
71
}
66
72
67
- return s ;
73
+ return MP_OBJ_FROM_PTR ( s ) ;
68
74
}
69
75
70
76
STATIC void socket_select_nic (mod_network_socket_obj_t * self , const byte * ip ) {
@@ -83,7 +89,7 @@ STATIC void socket_select_nic(mod_network_socket_obj_t *self, const byte *ip) {
83
89
84
90
// method socket.bind(address)
85
91
STATIC mp_obj_t socket_bind (mp_obj_t self_in , mp_obj_t addr_in ) {
86
- mod_network_socket_obj_t * self = self_in ;
92
+ mod_network_socket_obj_t * self = MP_OBJ_TO_PTR ( self_in ) ;
87
93
88
94
// get address
89
95
uint8_t ip [MOD_NETWORK_IPADDR_BUF_SIZE ];
@@ -104,7 +110,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_bind_obj, socket_bind);
104
110
105
111
// method socket.listen(backlog)
106
112
STATIC mp_obj_t socket_listen (mp_obj_t self_in , mp_obj_t backlog ) {
107
- mod_network_socket_obj_t * self = self_in ;
113
+ mod_network_socket_obj_t * self = MP_OBJ_TO_PTR ( self_in ) ;
108
114
109
115
if (self -> nic == MP_OBJ_NULL ) {
110
116
// not connected
@@ -123,12 +129,12 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_listen_obj, socket_listen);
123
129
124
130
// method socket.accept()
125
131
STATIC mp_obj_t socket_accept (mp_obj_t self_in ) {
126
- mod_network_socket_obj_t * self = self_in ;
132
+ mod_network_socket_obj_t * self = MP_OBJ_TO_PTR ( self_in ) ;
127
133
128
134
// create new socket object
129
135
// starts with empty NIC so that finaliser doesn't run close() method if accept() fails
130
136
mod_network_socket_obj_t * socket2 = m_new_obj_with_finaliser (mod_network_socket_obj_t );
131
- socket2 -> base .type = ( mp_obj_t ) & socket_type ;
137
+ socket2 -> base .type = & socket_type ;
132
138
socket2 -> nic = MP_OBJ_NULL ;
133
139
socket2 -> nic_type = NULL ;
134
140
@@ -145,17 +151,17 @@ STATIC mp_obj_t socket_accept(mp_obj_t self_in) {
145
151
socket2 -> nic_type = self -> nic_type ;
146
152
147
153
// make the return value
148
- mp_obj_tuple_t * client = mp_obj_new_tuple (2 , NULL );
149
- client -> items [0 ] = socket2 ;
154
+ mp_obj_tuple_t * client = MP_OBJ_TO_PTR ( mp_obj_new_tuple (2 , NULL ) );
155
+ client -> items [0 ] = MP_OBJ_FROM_PTR ( socket2 ) ;
150
156
client -> items [1 ] = netutils_format_inet_addr (ip , port , NETUTILS_BIG );
151
157
152
- return client ;
158
+ return MP_OBJ_FROM_PTR ( client ) ;
153
159
}
154
160
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (socket_accept_obj , socket_accept );
155
161
156
162
// method socket.connect(address)
157
163
STATIC mp_obj_t socket_connect (mp_obj_t self_in , mp_obj_t addr_in ) {
158
- mod_network_socket_obj_t * self = self_in ;
164
+ mod_network_socket_obj_t * self = MP_OBJ_TO_PTR ( self_in ) ;
159
165
160
166
// get address
161
167
uint8_t ip [MOD_NETWORK_IPADDR_BUF_SIZE ];
@@ -176,15 +182,15 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_connect_obj, socket_connect);
176
182
177
183
// method socket.send(bytes)
178
184
STATIC mp_obj_t socket_send (mp_obj_t self_in , mp_obj_t buf_in ) {
179
- mod_network_socket_obj_t * self = self_in ;
185
+ mod_network_socket_obj_t * self = MP_OBJ_TO_PTR ( self_in ) ;
180
186
if (self -> nic == MP_OBJ_NULL ) {
181
187
// not connected
182
188
mp_raise_OSError (MP_EPIPE );
183
189
}
184
190
mp_buffer_info_t bufinfo ;
185
191
mp_get_buffer_raise (buf_in , & bufinfo , MP_BUFFER_READ );
186
192
int _errno ;
187
- mp_uint_t ret = self -> nic_type -> send (self , bufinfo .buf , bufinfo .len , & _errno );
193
+ mp_int_t ret = self -> nic_type -> send (self , bufinfo .buf , bufinfo .len , & _errno );
188
194
if (ret == -1 ) {
189
195
mp_raise_OSError (_errno );
190
196
}
@@ -194,7 +200,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_send_obj, socket_send);
194
200
195
201
// method socket.recv(bufsize)
196
202
STATIC mp_obj_t socket_recv (mp_obj_t self_in , mp_obj_t len_in ) {
197
- mod_network_socket_obj_t * self = self_in ;
203
+ mod_network_socket_obj_t * self = MP_OBJ_TO_PTR ( self_in ) ;
198
204
if (self -> nic == MP_OBJ_NULL ) {
199
205
// not connected
200
206
mp_raise_OSError (MP_ENOTCONN );
@@ -203,7 +209,7 @@ STATIC mp_obj_t socket_recv(mp_obj_t self_in, mp_obj_t len_in) {
203
209
vstr_t vstr ;
204
210
vstr_init_len (& vstr , len );
205
211
int _errno ;
206
- mp_uint_t ret = self -> nic_type -> recv (self , (byte * )vstr .buf , len , & _errno );
212
+ mp_int_t ret = self -> nic_type -> recv (self , (byte * )vstr .buf , len , & _errno );
207
213
if (ret == -1 ) {
208
214
mp_raise_OSError (_errno );
209
215
}
@@ -217,7 +223,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_recv_obj, socket_recv);
217
223
218
224
// method socket.sendto(bytes, address)
219
225
STATIC mp_obj_t socket_sendto (mp_obj_t self_in , mp_obj_t data_in , mp_obj_t addr_in ) {
220
- mod_network_socket_obj_t * self = self_in ;
226
+ mod_network_socket_obj_t * self = MP_OBJ_TO_PTR ( self_in ) ;
221
227
222
228
// get the data
223
229
mp_buffer_info_t bufinfo ;
@@ -243,7 +249,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(socket_sendto_obj, socket_sendto);
243
249
244
250
// method socket.recvfrom(bufsize)
245
251
STATIC mp_obj_t socket_recvfrom (mp_obj_t self_in , mp_obj_t len_in ) {
246
- mod_network_socket_obj_t * self = self_in ;
252
+ mod_network_socket_obj_t * self = MP_OBJ_TO_PTR ( self_in ) ;
247
253
if (self -> nic == MP_OBJ_NULL ) {
248
254
// not connected
249
255
mp_raise_OSError (MP_ENOTCONN );
@@ -271,7 +277,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_recvfrom_obj, socket_recvfrom);
271
277
272
278
// method socket.setsockopt(level, optname, value)
273
279
STATIC mp_obj_t socket_setsockopt (size_t n_args , const mp_obj_t * args ) {
274
- mod_network_socket_obj_t * self = args [0 ];
280
+ mod_network_socket_obj_t * self = MP_OBJ_TO_PTR ( args [0 ]) ;
275
281
276
282
mp_int_t level = mp_obj_get_int (args [1 ]);
277
283
mp_int_t opt = mp_obj_get_int (args [2 ]);
@@ -304,7 +310,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_setsockopt_obj, 4, 4, socket_s
304
310
// timeout=None means blocking
305
311
// otherwise, timeout is in seconds
306
312
STATIC mp_obj_t socket_settimeout (mp_obj_t self_in , mp_obj_t timeout_in ) {
307
- mod_network_socket_obj_t * self = self_in ;
313
+ mod_network_socket_obj_t * self = MP_OBJ_TO_PTR ( self_in ) ;
308
314
if (self -> nic == MP_OBJ_NULL ) {
309
315
// not connected
310
316
mp_raise_OSError (MP_ENOTCONN );
@@ -355,8 +361,8 @@ STATIC const mp_rom_map_elem_t socket_locals_dict_table[] = {
355
361
356
362
STATIC MP_DEFINE_CONST_DICT (socket_locals_dict , socket_locals_dict_table );
357
363
358
- mp_uint_t socket_ioctl (mp_obj_t self_in , mp_uint_t request , mp_uint_t arg , int * errcode ) {
359
- mod_network_socket_obj_t * self = self_in ;
364
+ mp_uint_t socket_ioctl (mp_obj_t self_in , mp_uint_t request , uintptr_t arg , int * errcode ) {
365
+ mod_network_socket_obj_t * self = MP_OBJ_TO_PTR ( self_in ) ;
360
366
if (request == MP_STREAM_CLOSE ) {
361
367
if (self -> nic != MP_OBJ_NULL ) {
362
368
self -> nic_type -> close (self );
@@ -383,8 +389,7 @@ STATIC const mp_obj_type_t socket_type = {
383
389
/******************************************************************************/
384
390
// usocket module
385
391
386
- // function usocket.getaddrinfo(host, port)
387
- STATIC mp_obj_t mod_usocket_getaddrinfo (mp_obj_t host_in , mp_obj_t port_in ) {
392
+ STATIC mp_obj_t socket_getaddrinfo (mp_obj_t host_in , mp_obj_t port_in ) {
388
393
size_t hlen ;
389
394
const char * host = mp_obj_str_get_data (host_in , & hlen );
390
395
mp_int_t port = mp_obj_get_int (port_in );
@@ -420,24 +425,24 @@ STATIC mp_obj_t mod_usocket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
420
425
}
421
426
422
427
if (!have_ip ) {
423
- nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "no available NIC" ));
428
+ nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , translate ( "no available NIC" ) ));
424
429
}
425
430
426
- mp_obj_tuple_t * tuple = mp_obj_new_tuple (5 , NULL );
431
+ mp_obj_tuple_t * tuple = MP_OBJ_TO_PTR ( mp_obj_new_tuple (5 , NULL ) );
427
432
tuple -> items [0 ] = MP_OBJ_NEW_SMALL_INT (MOD_NETWORK_AF_INET );
428
433
tuple -> items [1 ] = MP_OBJ_NEW_SMALL_INT (MOD_NETWORK_SOCK_STREAM );
429
434
tuple -> items [2 ] = MP_OBJ_NEW_SMALL_INT (0 );
430
435
tuple -> items [3 ] = MP_OBJ_NEW_QSTR (MP_QSTR_ );
431
436
tuple -> items [4 ] = netutils_format_inet_addr (out_ip , port , NETUTILS_BIG );
432
437
return mp_obj_new_list (1 , (mp_obj_t * )& tuple );
433
438
}
434
- STATIC MP_DEFINE_CONST_FUN_OBJ_2 (mod_usocket_getaddrinfo_obj , mod_usocket_getaddrinfo );
439
+ STATIC MP_DEFINE_CONST_FUN_OBJ_2 (socket_getaddrinfo_obj , socket_getaddrinfo );
435
440
436
- STATIC const mp_rom_map_elem_t mp_module_usocket_globals_table [] = {
441
+ STATIC const mp_rom_map_elem_t socket_globals_table [] = {
437
442
{ MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR_usocket ) },
438
443
439
444
{ MP_ROM_QSTR (MP_QSTR_socket ), MP_ROM_PTR (& socket_type ) },
440
- { MP_ROM_QSTR (MP_QSTR_getaddrinfo ), MP_ROM_PTR (& mod_usocket_getaddrinfo_obj ) },
445
+ { MP_ROM_QSTR (MP_QSTR_getaddrinfo ), MP_ROM_PTR (& socket_getaddrinfo_obj ) },
441
446
442
447
// class constants
443
448
{ MP_ROM_QSTR (MP_QSTR_AF_INET ), MP_ROM_INT (MOD_NETWORK_AF_INET ) },
@@ -458,11 +463,9 @@ STATIC const mp_rom_map_elem_t mp_module_usocket_globals_table[] = {
458
463
*/
459
464
};
460
465
461
- STATIC MP_DEFINE_CONST_DICT (mp_module_usocket_globals , mp_module_usocket_globals_table );
466
+ STATIC MP_DEFINE_CONST_DICT (socket_globals , socket_globals_table );
462
467
463
- const mp_obj_module_t mp_module_usocket = {
468
+ const mp_obj_module_t socket_module = {
464
469
.base = { & mp_type_module },
465
- .globals = (mp_obj_dict_t * )& mp_module_usocket_globals ,
470
+ .globals = (mp_obj_dict_t * )& socket_globals ,
466
471
};
467
-
468
- #endif // MICROPY_PY_USOCKET
0 commit comments