浏览代码

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 年之前
父节点
当前提交
1222b94ab8
共有 3 个文件被更改,包括 30 次插入0 次删除
  1. 7 0
      Libraries/LibCore/CEventLoop.cpp
  2. 10 0
      Libraries/LibCore/CLocalServer.cpp
  3. 13 0
      Libraries/LibCore/CLocalSocket.cpp

+ 7 - 0
Libraries/LibCore/CEventLoop.cpp

@@ -136,7 +136,14 @@ CEventLoop::CEventLoop()
 
     if (!s_main_event_loop) {
         s_main_event_loop = this;
+#if defined(SOCK_NONBLOCK)
         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);
         s_event_loop_stack->append(this);
 

+ 10 - 0
Libraries/LibCore/CLocalServer.cpp

@@ -5,6 +5,9 @@
 #include <sys/socket.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#ifndef SOCK_NONBLOCK
+#include <sys/ioctl.h>
+#endif
 
 CLocalServer::CLocalServer(CObject* parent)
     : CObject(parent)
@@ -71,7 +74,14 @@ bool CLocalServer::listen(const String& address)
 
     int rc;
 
+#ifdef SOCK_NONBLOCK
     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);
 
     auto socket_address = CSocketAddress::local(address);

+ 13 - 0
Libraries/LibCore/CLocalSocket.cpp

@@ -2,6 +2,10 @@
 #include <sys/socket.h>
 #include <errno.h>
 
+#ifndef SOCK_NONBLOCK
+#include <sys/ioctl.h>
+#endif
+
 CLocalSocket::CLocalSocket(int fd, CObject* parent)
     : CSocket(CSocket::Type::Local, parent)
 {
@@ -15,7 +19,16 @@ CLocalSocket::CLocalSocket(int fd, CObject* parent)
 CLocalSocket::CLocalSocket(CObject* parent)
     : CSocket(CSocket::Type::Local, parent)
 {
+    
+#ifdef SOCK_NONBLOCK
     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) {
         set_error(errno);
     } else {