summaryrefslogtreecommitdiffstatshomepage
path: root/unix/modsocket.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-04-20 02:00:12 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-04-20 13:08:33 +0300
commit9fd02e186d86f42e51383b16878c96645db40d6e (patch)
tree0978519389423d43c128571013ef9649d3a5b671 /unix/modsocket.c
parent0f836ef893f54726580589951ae46638eb7afff8 (diff)
downloadmicropython-9fd02e186d86f42e51383b16878c96645db40d6e.tar.gz
micropython-9fd02e186d86f42e51383b16878c96645db40d6e.zip
modsocket: Add setblocking() method.
Diffstat (limited to 'unix/modsocket.c')
-rw-r--r--unix/modsocket.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/unix/modsocket.c b/unix/modsocket.c
index bfa5849c86..6a2ada91f1 100644
--- a/unix/modsocket.c
+++ b/unix/modsocket.c
@@ -2,6 +2,7 @@
#include <assert.h>
#include <string.h>
#include <unistd.h>
+#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
@@ -179,6 +180,22 @@ STATIC mp_obj_t socket_setsockopt(uint n_args, const mp_obj_t *args) {
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_setsockopt_obj, 4, 4, socket_setsockopt);
+STATIC mp_obj_t socket_setblocking(mp_obj_t self_in, mp_obj_t flag_in) {
+ mp_obj_socket_t *self = self_in;
+ int val = mp_obj_is_true(flag_in);
+ int flags = fcntl(self->fd, F_GETFL, 0);
+ RAISE_ERRNO(flags, errno);
+ if (val) {
+ flags &= ~O_NONBLOCK;
+ } else {
+ flags |= O_NONBLOCK;
+ }
+ flags = fcntl(self->fd, F_SETFL, flags);
+ RAISE_ERRNO(flags, errno);
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_setblocking_obj, socket_setblocking);
+
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;
@@ -216,6 +233,7 @@ STATIC const mp_map_elem_t microsocket_locals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_recv), (mp_obj_t)&socket_recv_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_send), (mp_obj_t)&socket_send_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_setsockopt), (mp_obj_t)&socket_setsockopt_obj },
+ { MP_OBJ_NEW_QSTR(MP_QSTR_setblocking), (mp_obj_t)&socket_setblocking_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_close), (mp_obj_t)&socket_close_obj },
#if MICROPY_SOCKET_EXTRA
{ MP_OBJ_NEW_QSTR(MP_QSTR_recv), (mp_obj_t)&mp_stream_read_obj },