summaryrefslogtreecommitdiffstatshomepage
path: root/unix/socket.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-01-26 01:59:52 +0200
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-01-26 02:03:07 +0200
commita88c30c64a198a51049ad8db5537180f44205e67 (patch)
tree434315d19b4fc2214c078a7f6876a51b4a4251f9 /unix/socket.c
parent9d95a2b21d79dc7eebfae9bf6d6dfd69388329f4 (diff)
downloadmicropython-a88c30c64a198a51049ad8db5537180f44205e67.tar.gz
micropython-a88c30c64a198a51049ad8db5537180f44205e67.zip
unix socket: Add setsockopt() method.
Diffstat (limited to 'unix/socket.c')
-rw-r--r--unix/socket.c24
1 files changed, 24 insertions, 0 deletions
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 },