Skip to content

Commit a88c30c

Browse files
committed
unix socket: Add setsockopt() method.
1 parent 9d95a2b commit a88c30c

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

unix/socket.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,29 @@ static mp_obj_t socket_send(uint n_args, const mp_obj_t *args) {
162162
}
163163
static 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+
165188
static 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

Comments
 (0)