summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/unix/modsocket.c9
-rw-r--r--tests/extmod/socket_fileno.py17
2 files changed, 23 insertions, 3 deletions
diff --git a/ports/unix/modsocket.c b/ports/unix/modsocket.c
index 14f321d34..e7f25cdd4 100644
--- a/ports/unix/modsocket.c
+++ b/ports/unix/modsocket.c
@@ -140,9 +140,12 @@ static mp_uint_t socket_ioctl(mp_obj_t o_in, mp_uint_t request, uintptr_t arg, i
// The rationale MicroPython follows is that close() just releases
// file descriptor. If you're interested to catch I/O errors before
// closing fd, fsync() it.
- MP_THREAD_GIL_EXIT();
- close(self->fd);
- MP_THREAD_GIL_ENTER();
+ if (self->fd >= 0) {
+ MP_THREAD_GIL_EXIT();
+ close(self->fd);
+ MP_THREAD_GIL_ENTER();
+ }
+ self->fd = -1;
return 0;
case MP_STREAM_GET_FILENO:
diff --git a/tests/extmod/socket_fileno.py b/tests/extmod/socket_fileno.py
new file mode 100644
index 000000000..da15825e3
--- /dev/null
+++ b/tests/extmod/socket_fileno.py
@@ -0,0 +1,17 @@
+# Test socket.fileno() functionality
+
+try:
+ import socket
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+if not hasattr(socket.socket, "fileno"):
+ print("SKIP")
+ raise SystemExit
+
+s = socket.socket()
+print(s.fileno() >= 0)
+
+s.close()
+print(s.fileno()) # should print -1