From a88c30c64a198a51049ad8db5537180f44205e67 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sun, 26 Jan 2014 01:59:52 +0200 Subject: [PATCH] unix socket: Add setsockopt() method. --- unix/socket.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/unix/socket.c b/unix/socket.c index 193e4b51ed..d4d7b29b52 100644 --- a/unix/socket.c +++ b/unix/socket.c @@ -162,6 +162,29 @@ static mp_obj_t socket_send(uint n_args, const mp_obj_t *args) { } static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_send_obj, 2, 3, socket_send); +static mp_obj_t socket_setsockopt(uint n_args, const mp_obj_t *args) { + mp_obj_socket_t *self = args[0]; + int level = MP_OBJ_SMALL_INT_VALUE(args[1]); + int option = mp_obj_get_int(args[2]); + + const void *optval; + socklen_t optlen; + if (MP_OBJ_IS_INT(args[3])) { + int val = mp_obj_int_get(args[3]); + optval = &val; + optlen = sizeof(val); + } else { + buffer_info_t bufinfo; + get_buffer(args[3], &bufinfo); + optval = bufinfo.buf; + optlen = bufinfo.len; + } + int r = setsockopt(self->fd, level, option, optval, optlen); + RAISE_ERRNO(r, errno); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_setsockopt_obj, 4, 4, socket_setsockopt); + static mp_obj_t socket_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_obj_t *args) { int family = AF_INET; int type = SOCK_STREAM; @@ -196,6 +219,7 @@ static const mp_method_t rawsocket_type_methods[] = { { "accept", &socket_accept_obj }, { "recv", &socket_recv_obj }, { "send", &socket_send_obj }, + { "setsockopt", &socket_setsockopt_obj }, { "close", &socket_close_obj }, #if MICROPY_SOCKET_EXTRA { "recv", &mp_stream_read_obj },