44 * The MIT License (MIT)
55 *
66 * Copyright (c) 2014 Damien P. George
7+ * 2018 Nick Moore for Adafruit Industries
78 *
89 * Permission is hereby granted, free of charge, to any person obtaining a copy
910 * of this software and associated documentation files (the "Software"), to deal
3334#include "py/stream.h"
3435#include "py/mperrno.h"
3536#include "lib/netutils/netutils.h"
36- #include "modnetwork.h"
3737
38- #if MICROPY_PY_USOCKET
38+ #include "shared-bindings/network/__init__.h"
3939
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.
4248
4349STATIC const mp_obj_type_t socket_type ;
4450
@@ -48,7 +54,7 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, size_t n_args, size_t
4854
4955 // create socket object (not bound to any NIC yet)
5056 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 ;
5258 s -> nic = MP_OBJ_NULL ;
5359 s -> nic_type = NULL ;
5460 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
6470 }
6571 }
6672
67- return s ;
73+ return MP_OBJ_FROM_PTR ( s ) ;
6874}
6975
7076STATIC 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) {
8389
8490// method socket.bind(address)
8591STATIC 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 ) ;
8793
8894 // get address
8995 uint8_t ip [MOD_NETWORK_IPADDR_BUF_SIZE ];
@@ -104,7 +110,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_bind_obj, socket_bind);
104110
105111// method socket.listen(backlog)
106112STATIC 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 ) ;
108114
109115 if (self -> nic == MP_OBJ_NULL ) {
110116 // not connected
@@ -123,12 +129,12 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_listen_obj, socket_listen);
123129
124130// method socket.accept()
125131STATIC 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 ) ;
127133
128134 // create new socket object
129135 // starts with empty NIC so that finaliser doesn't run close() method if accept() fails
130136 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 ;
132138 socket2 -> nic = MP_OBJ_NULL ;
133139 socket2 -> nic_type = NULL ;
134140
@@ -145,17 +151,17 @@ STATIC mp_obj_t socket_accept(mp_obj_t self_in) {
145151 socket2 -> nic_type = self -> nic_type ;
146152
147153 // 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 ) ;
150156 client -> items [1 ] = netutils_format_inet_addr (ip , port , NETUTILS_BIG );
151157
152- return client ;
158+ return MP_OBJ_FROM_PTR ( client ) ;
153159}
154160STATIC MP_DEFINE_CONST_FUN_OBJ_1 (socket_accept_obj , socket_accept );
155161
156162// method socket.connect(address)
157163STATIC 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 ) ;
159165
160166 // get address
161167 uint8_t ip [MOD_NETWORK_IPADDR_BUF_SIZE ];
@@ -176,15 +182,15 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_connect_obj, socket_connect);
176182
177183// method socket.send(bytes)
178184STATIC 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 ) ;
180186 if (self -> nic == MP_OBJ_NULL ) {
181187 // not connected
182188 mp_raise_OSError (MP_EPIPE );
183189 }
184190 mp_buffer_info_t bufinfo ;
185191 mp_get_buffer_raise (buf_in , & bufinfo , MP_BUFFER_READ );
186192 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 );
188194 if (ret == -1 ) {
189195 mp_raise_OSError (_errno );
190196 }
@@ -194,7 +200,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_send_obj, socket_send);
194200
195201// method socket.recv(bufsize)
196202STATIC 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 ) ;
198204 if (self -> nic == MP_OBJ_NULL ) {
199205 // not connected
200206 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) {
203209 vstr_t vstr ;
204210 vstr_init_len (& vstr , len );
205211 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 );
207213 if (ret == -1 ) {
208214 mp_raise_OSError (_errno );
209215 }
@@ -217,7 +223,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_recv_obj, socket_recv);
217223
218224// method socket.sendto(bytes, address)
219225STATIC 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 ) ;
221227
222228 // get the data
223229 mp_buffer_info_t bufinfo ;
@@ -243,7 +249,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(socket_sendto_obj, socket_sendto);
243249
244250// method socket.recvfrom(bufsize)
245251STATIC 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 ) ;
247253 if (self -> nic == MP_OBJ_NULL ) {
248254 // not connected
249255 mp_raise_OSError (MP_ENOTCONN );
@@ -271,7 +277,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_recvfrom_obj, socket_recvfrom);
271277
272278// method socket.setsockopt(level, optname, value)
273279STATIC 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 ]) ;
275281
276282 mp_int_t level = mp_obj_get_int (args [1 ]);
277283 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
304310// timeout=None means blocking
305311// otherwise, timeout is in seconds
306312STATIC 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 ) ;
308314 if (self -> nic == MP_OBJ_NULL ) {
309315 // not connected
310316 mp_raise_OSError (MP_ENOTCONN );
@@ -355,8 +361,8 @@ STATIC const mp_rom_map_elem_t socket_locals_dict_table[] = {
355361
356362STATIC MP_DEFINE_CONST_DICT (socket_locals_dict , socket_locals_dict_table );
357363
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 ) ;
360366 if (request == MP_STREAM_CLOSE ) {
361367 if (self -> nic != MP_OBJ_NULL ) {
362368 self -> nic_type -> close (self );
@@ -383,8 +389,7 @@ STATIC const mp_obj_type_t socket_type = {
383389/******************************************************************************/
384390// usocket module
385391
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 ) {
388393 size_t hlen ;
389394 const char * host = mp_obj_str_get_data (host_in , & hlen );
390395 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) {
420425 }
421426
422427 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" ) ));
424429 }
425430
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 ) );
427432 tuple -> items [0 ] = MP_OBJ_NEW_SMALL_INT (MOD_NETWORK_AF_INET );
428433 tuple -> items [1 ] = MP_OBJ_NEW_SMALL_INT (MOD_NETWORK_SOCK_STREAM );
429434 tuple -> items [2 ] = MP_OBJ_NEW_SMALL_INT (0 );
430435 tuple -> items [3 ] = MP_OBJ_NEW_QSTR (MP_QSTR_ );
431436 tuple -> items [4 ] = netutils_format_inet_addr (out_ip , port , NETUTILS_BIG );
432437 return mp_obj_new_list (1 , (mp_obj_t * )& tuple );
433438}
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 );
435440
436- STATIC const mp_rom_map_elem_t mp_module_usocket_globals_table [] = {
441+ STATIC const mp_rom_map_elem_t socket_globals_table [] = {
437442 { MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR_usocket ) },
438443
439444 { 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 ) },
441446
442447 // class constants
443448 { 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[] = {
458463 */
459464};
460465
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 );
462467
463- const mp_obj_module_t mp_module_usocket = {
468+ const mp_obj_module_t socket_module = {
464469 .base = { & mp_type_module },
465- .globals = (mp_obj_dict_t * )& mp_module_usocket_globals ,
470+ .globals = (mp_obj_dict_t * )& socket_globals ,
466471};
467-
468- #endif // MICROPY_PY_USOCKET
0 commit comments