Jelajahi Sumber

LibCore: Allow LibCore to be compiled on macOS host

Compiling LibCore on macOS is needed if one wants to compile host tools
(like IPCCompiler) on a non Linux host.
These changes could be possibly reverted once "event loop" functionality
and "base library" (Vector, String etc.) will be split in two separate libraries,
updating all relevant projects.
Stefano Cristiano 5 tahun lalu
induk
melakukan
1222b94ab8

+ 7 - 0
Libraries/LibCore/CEventLoop.cpp

@@ -136,7 +136,14 @@ CEventLoop::CEventLoop()
 
 
     if (!s_main_event_loop) {
     if (!s_main_event_loop) {
         s_main_event_loop = this;
         s_main_event_loop = this;
+#if defined(SOCK_NONBLOCK)
         int rc = pipe2(s_wake_pipe_fds, O_CLOEXEC);
         int rc = pipe2(s_wake_pipe_fds, O_CLOEXEC);
+#else
+        int rc = pipe(s_wake_pipe_fds);
+        fcntl(s_wake_pipe_fds[0], F_SETFD, FD_CLOEXEC);
+        fcntl(s_wake_pipe_fds[1], F_SETFD, FD_CLOEXEC);
+
+#endif
         ASSERT(rc == 0);
         ASSERT(rc == 0);
         s_event_loop_stack->append(this);
         s_event_loop_stack->append(this);
 
 

+ 10 - 0
Libraries/LibCore/CLocalServer.cpp

@@ -5,6 +5,9 @@
 #include <sys/socket.h>
 #include <sys/socket.h>
 #include <sys/stat.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <unistd.h>
+#ifndef SOCK_NONBLOCK
+#include <sys/ioctl.h>
+#endif
 
 
 CLocalServer::CLocalServer(CObject* parent)
 CLocalServer::CLocalServer(CObject* parent)
     : CObject(parent)
     : CObject(parent)
@@ -71,7 +74,14 @@ bool CLocalServer::listen(const String& address)
 
 
     int rc;
     int rc;
 
 
+#ifdef SOCK_NONBLOCK
     m_fd = socket(AF_LOCAL, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);
     m_fd = socket(AF_LOCAL, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);
+#else
+    m_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
+    int option = 1;
+    ioctl(m_fd, FIONBIO, &option);
+    fcntl(m_fd, F_SETFD, FD_CLOEXEC);
+#endif
     ASSERT(m_fd >= 0);
     ASSERT(m_fd >= 0);
 
 
     auto socket_address = CSocketAddress::local(address);
     auto socket_address = CSocketAddress::local(address);

+ 13 - 0
Libraries/LibCore/CLocalSocket.cpp

@@ -2,6 +2,10 @@
 #include <sys/socket.h>
 #include <sys/socket.h>
 #include <errno.h>
 #include <errno.h>
 
 
+#ifndef SOCK_NONBLOCK
+#include <sys/ioctl.h>
+#endif
+
 CLocalSocket::CLocalSocket(int fd, CObject* parent)
 CLocalSocket::CLocalSocket(int fd, CObject* parent)
     : CSocket(CSocket::Type::Local, parent)
     : CSocket(CSocket::Type::Local, parent)
 {
 {
@@ -15,7 +19,16 @@ CLocalSocket::CLocalSocket(int fd, CObject* parent)
 CLocalSocket::CLocalSocket(CObject* parent)
 CLocalSocket::CLocalSocket(CObject* parent)
     : CSocket(CSocket::Type::Local, parent)
     : CSocket(CSocket::Type::Local, parent)
 {
 {
+    
+#ifdef SOCK_NONBLOCK
     int fd = socket(AF_LOCAL, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);
     int fd = socket(AF_LOCAL, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);
+#else
+    int fd = socket(AF_LOCAL, SOCK_STREAM, 0);
+    int option = 1;
+    ioctl(fd, FIONBIO, &option);
+    fcntl(fd, F_SETFD, FD_CLOEXEC);
+#endif
+
     if (fd < 0) {
     if (fd < 0) {
         set_error(errno);
         set_error(errno);
     } else {
     } else {