Просмотр исходного кода

LibCore: Add a way to mark a socket as blocking (or not)

If custom I/O is being done outside CIODevice, we need a way to force blocking sometimes.
This also fixes the default of CLocalSocket to be non-blocking, the same
as CTCPSocket.
Robin Burchell 6 лет назад
Родитель
Сommit
a714fc661d
3 измененных файлов с 15 добавлено и 1 удалено
  1. 1 1
      Libraries/LibCore/CLocalSocket.cpp
  2. 13 0
      Libraries/LibCore/CSocket.cpp
  3. 1 0
      Libraries/LibCore/CSocket.h

+ 1 - 1
Libraries/LibCore/CLocalSocket.cpp

@@ -4,7 +4,7 @@
 CLocalSocket::CLocalSocket(CObject* parent)
     : CSocket(CSocket::Type::Local, parent)
 {
-    int fd = socket(AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0);
+    int fd = socket(AF_LOCAL, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);
     if (fd < 0) {
         set_error(fd);
     } else {

+ 13 - 0
Libraries/LibCore/CSocket.cpp

@@ -6,6 +6,8 @@
 #include <netinet/in.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
 #include <sys/socket.h>
 
 CSocket::CSocket(Type type, CObject* parent)
@@ -31,6 +33,17 @@ bool CSocket::connect(const String& hostname, int port)
     return connect(host_address, port);
 }
 
+void CSocket::set_blocking(bool blocking)
+{
+    int flags = fcntl(fd(), F_GETFL, 0);
+    ASSERT(flags >= 0);
+    if (blocking)
+        flags = fcntl(fd(), F_SETFL, flags | O_NONBLOCK);
+    else
+        flags = fcntl(fd(), F_SETFL, flags & O_NONBLOCK);
+    ASSERT(flags >= 0);
+}
+
 bool CSocket::connect(const CSocketAddress& address, int port)
 {
     ASSERT(!is_connected());

+ 1 - 0
Libraries/LibCore/CSocket.h

@@ -23,6 +23,7 @@ public:
     bool send(const ByteBuffer&);
 
     bool is_connected() const { return m_connected; }
+    void set_blocking(bool blocking);
 
     CSocketAddress source_address() const { return m_source_address; }
     int source_port() const { return m_source_port; }