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.
This commit is contained in:
Robin Burchell 2019-07-16 18:00:08 +02:00 committed by Andreas Kling
parent 6aa77d1999
commit a714fc661d
Notes: sideshowbarker 2024-07-19 13:14:21 +09:00
3 changed files with 15 additions and 1 deletions

View file

@ -4,7 +4,7 @@
CLocalSocket::CLocalSocket(CObject* parent) CLocalSocket::CLocalSocket(CObject* parent)
: CSocket(CSocket::Type::Local, 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) { if (fd < 0) {
set_error(fd); set_error(fd);
} else { } else {

View file

@ -6,6 +6,8 @@
#include <netinet/in.h> #include <netinet/in.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h> #include <sys/socket.h>
CSocket::CSocket(Type type, CObject* parent) CSocket::CSocket(Type type, CObject* parent)
@ -31,6 +33,17 @@ bool CSocket::connect(const String& hostname, int port)
return connect(host_address, 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) bool CSocket::connect(const CSocketAddress& address, int port)
{ {
ASSERT(!is_connected()); ASSERT(!is_connected());

View file

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