@@ -47,7 +47,7 @@ typedef struct _mp_obj_ssl_socket_t {
4747
4848STATIC const mp_obj_type_t ussl_socket_type ;
4949
50- STATIC mp_obj_ssl_socket_t * socket_new (mp_obj_t sock ) {
50+ STATIC mp_obj_ssl_socket_t * socket_new (mp_obj_t sock , bool server_side ) {
5151 mp_obj_ssl_socket_t * o = m_new_obj (mp_obj_ssl_socket_t );
5252 o -> base .type = & ussl_socket_type ;
5353 o -> buf = NULL ;
@@ -59,14 +59,18 @@ STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock) {
5959 nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (EINVAL )));
6060 }
6161
62- o -> ssl_sock = ssl_client_new (o -> ssl_ctx , (long )sock , NULL , 0 );
63-
64- int res ;
65- /* check the return status */
66- if ((res = ssl_handshake_status (o -> ssl_sock )) != SSL_OK ) {
67- printf ("ssl_handshake_status: %d\n" , res );
68- ssl_display_error (res );
69- nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (EIO )));
62+ if (server_side ) {
63+ o -> ssl_sock = ssl_server_new (o -> ssl_ctx , (long )sock );
64+ } else {
65+ o -> ssl_sock = ssl_client_new (o -> ssl_ctx , (long )sock , NULL , 0 );
66+
67+ int res ;
68+ /* check the return status */
69+ if ((res = ssl_handshake_status (o -> ssl_sock )) != SSL_OK ) {
70+ printf ("ssl_handshake_status: %d\n" , res );
71+ ssl_display_error (res );
72+ nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (EIO )));
73+ }
7074 }
7175
7276 return o ;
@@ -151,14 +155,24 @@ STATIC const mp_obj_type_t ussl_socket_type = {
151155 .locals_dict = (mp_obj_t )& ussl_socket_locals_dict ,
152156};
153157
154- STATIC mp_obj_t mod_ssl_wrap_socket (mp_uint_t n_args , const mp_obj_t * args ) {
158+ STATIC mp_obj_t mod_ssl_wrap_socket (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
155159 // TODO: Implement more args
156- assert (n_args == 1 );
157- mp_obj_t sock = args [0 ];
160+ static const mp_arg_t allowed_args [] = {
161+ { MP_QSTR_server_side , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = false} },
162+ };
163+
158164 // TODO: Check that sock implements stream protocol
159- return socket_new (sock );
165+ mp_obj_t sock = pos_args [0 ];
166+
167+ struct {
168+ mp_arg_val_t server_side ;
169+ } args ;
170+ mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args ,
171+ MP_ARRAY_SIZE (allowed_args ), allowed_args , (mp_arg_val_t * )& args );
172+
173+ return socket_new (sock , args .server_side .u_bool );
160174}
161- STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mod_ssl_wrap_socket_obj , 1 , 6 , mod_ssl_wrap_socket );
175+ STATIC MP_DEFINE_CONST_FUN_OBJ_KW (mod_ssl_wrap_socket_obj , 1 , mod_ssl_wrap_socket );
162176
163177STATIC const mp_map_elem_t mp_module_ssl_globals_table [] = {
164178 { MP_OBJ_NEW_QSTR (MP_QSTR___name__ ), MP_OBJ_NEW_QSTR (MP_QSTR_ussl ) },
0 commit comments