@@ -162,6 +162,29 @@ static mp_obj_t socket_send(uint n_args, const mp_obj_t *args) {
162162}
163163static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (socket_send_obj , 2 , 3 , socket_send ) ;
164164
165+ static mp_obj_t socket_setsockopt (uint n_args , const mp_obj_t * args ) {
166+ mp_obj_socket_t * self = args [0 ];
167+ int level = MP_OBJ_SMALL_INT_VALUE (args [1 ]);
168+ int option = mp_obj_get_int (args [2 ]);
169+
170+ const void * optval ;
171+ socklen_t optlen ;
172+ if (MP_OBJ_IS_INT (args [3 ])) {
173+ int val = mp_obj_int_get (args [3 ]);
174+ optval = & val ;
175+ optlen = sizeof (val );
176+ } else {
177+ buffer_info_t bufinfo ;
178+ get_buffer (args [3 ], & bufinfo );
179+ optval = bufinfo .buf ;
180+ optlen = bufinfo .len ;
181+ }
182+ int r = setsockopt (self -> fd , level , option , optval , optlen );
183+ RAISE_ERRNO (r , errno );
184+ return mp_const_none ;
185+ }
186+ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (socket_setsockopt_obj , 4 , 4 , socket_setsockopt ) ;
187+
165188static mp_obj_t socket_make_new (mp_obj_t type_in , uint n_args , uint n_kw , const mp_obj_t * args ) {
166189 int family = AF_INET ;
167190 int type = SOCK_STREAM ;
@@ -196,6 +219,7 @@ static const mp_method_t rawsocket_type_methods[] = {
196219 { "accept" , & socket_accept_obj },
197220 { "recv" , & socket_recv_obj },
198221 { "send" , & socket_send_obj },
222+ { "setsockopt" , & socket_setsockopt_obj },
199223 { "close" , & socket_close_obj },
200224#if MICROPY_SOCKET_EXTRA
201225 { "recv" , & mp_stream_read_obj },
0 commit comments