diff -ruwN source/CMakeLists.txt source-new/CMakeLists.txt --- source/CMakeLists.txt 2025-04-25 16:50:27.000000000 +0700 +++ source-new/CMakeLists.txt 2025-10-10 11:19:40.329762962 +0700 @@ -1,3 +1,4 @@ +set (CMAKE_CXX_STANDARD 99) cmake_minimum_required(VERSION 3.10) if(POLICY CMP0091) @@ -323,6 +324,18 @@ src/unix/hurd.c) endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "UnixPaths") # Redox + list(APPEND uv_libraries dl) + list(APPEND uv_sources + src/unix/no-fsevents.c + src/unix/proctitle.c + src/unix/posix-hrtime.c + src/unix/posix-poll.c + src/unix/redox.c + ) +endif() + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") list(APPEND uv_defines _GNU_SOURCE _POSIX_C_SOURCE=200112) list(APPEND uv_libraries dl rt) diff -ruwN source/include/uv/unix.h source-new/include/uv/unix.h --- source/include/uv/unix.h 2025-04-25 16:50:27.000000000 +0700 +++ source-new/include/uv/unix.h 2025-10-10 11:18:29.024386515 +0700 @@ -66,6 +66,7 @@ defined(__MSYS__) || \ defined(__HAIKU__) || \ defined(__QNX__) || \ + defined(__redox__) || \ defined(__GNU__) # include "uv/posix.h" #endif diff -ruwN source/src/unix/core.c source-new/src/unix/core.c --- source/src/unix/core.c 2025-04-25 16:50:27.000000000 +0700 +++ source-new/src/unix/core.c 2025-10-10 11:23:22.143824390 +0700 @@ -110,6 +110,10 @@ # include #endif +#if defined(__redox__) +#define MSG_CMSG_CLOEXEC 0x40000000 //linux specific flag +#endif + static void uv__run_pending(uv_loop_t* loop); /* Verify that uv_buf_t is ABI-compatible with struct iovec. */ @@ -722,7 +726,8 @@ defined(__FreeBSD__) || \ defined(__NetBSD__) || \ defined(__OpenBSD__) || \ - defined(__linux__) + defined(__linux__) || \ + defined(__redox__) ssize_t rc; rc = recvmsg(fd, msg, flags | MSG_CMSG_CLOEXEC); if (rc == -1) @@ -1644,6 +1649,11 @@ * So the output parameter priority is actually the nice value. */ int uv_thread_getpriority(uv_thread_t tid, int* priority) { +#ifdef __redox__ + if (priority == NULL) + return UV_EINVAL; + *priority = 0; +#else int r; int policy; struct sched_param param; @@ -1670,6 +1680,7 @@ #endif *priority = param.sched_priority; +#endif return 0; } @@ -1695,7 +1706,7 @@ * If the function fails, the return value is non-zero. */ int uv_thread_setpriority(uv_thread_t tid, int priority) { -#if !defined(__GNU__) +#if !defined(__GNU__) && !defined(__redox__) int r; int min; int max; diff -ruwN source/src/unix/fs.c source-new/src/unix/fs.c --- source/src/unix/fs.c 2025-04-25 16:50:27.000000000 +0700 +++ source-new/src/unix/fs.c 2025-10-10 11:18:29.024993834 +0700 @@ -77,7 +77,8 @@ defined(__MVS__) || \ defined(__NetBSD__) || \ defined(__HAIKU__) || \ - defined(__QNX__) + defined(__QNX__) || \ + defined(__redox__) # include #else # include @@ -683,13 +684,13 @@ defined(__MVS__) || \ defined(__NetBSD__) || \ defined(__HAIKU__) || \ - defined(__QNX__) + defined(__QNX__) || \ + defined(__redox__) struct statvfs buf; if (0 != statvfs(req->path, &buf)) #else struct statfs buf; - if (0 != statfs(req->path, &buf)) #endif /* defined(__sun) */ return -1; @@ -705,7 +706,8 @@ defined(__OpenBSD__) || \ defined(__NetBSD__) || \ defined(__HAIKU__) || \ - defined(__QNX__) + defined(__QNX__) || \ + defined(__redox__) stat_fs->f_type = 0; /* f_type is not supported. */ #else stat_fs->f_type = buf.f_type; diff -ruwN source/src/unix/proctitle.c source-new/src/unix/proctitle.c --- source/src/unix/proctitle.c 2025-04-25 16:50:27.000000000 +0700 +++ source-new/src/unix/proctitle.c 2025-10-10 11:18:29.025229760 +0700 @@ -30,7 +30,13 @@ size_t cap; /* Maximum capacity. Computed once in uv_setup_args(). */ }; +#if defined(__redox__) +void uv__set_process_title(const char* title) { + // requires sys/prctl +} +#else extern void uv__set_process_title(const char* title); +#endif static uv_mutex_t process_title_mutex; static uv_once_t process_title_mutex_once = UV_ONCE_INIT; diff -ruwN source/src/unix/redox.c source-new/src/unix/redox.c --- source/src/unix/redox.c 1970-01-01 07:00:00.000000000 +0700 +++ source-new/src/unix/redox.c 2025-10-10 11:18:29.028345924 +0700 @@ -0,0 +1,104 @@ +/* Copyright libuv contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include + +static void +get_mem_info(uint64_t* totalmem, uint64_t* freemem) { + *totalmem = 0; + *freemem = 0; +} + + +void uv_loadavg(double avg[3]) { + avg[0] = 0.0; + avg[1] = 0.0; + avg[2] = 0.0; +} + + +int uv_exepath(char* buffer, size_t* size) { + if (buffer == NULL || size == NULL || *size == 0) { + return UV_EINVAL; + } + FILE* fp = fopen("/scheme/sys/exe", "r"); + if (fp == NULL) { + return -errno; + } + if (fgets(buffer, *size, fp) == NULL) { + fclose(fp); + return UV_EIO; + } + fclose(fp); + buffer[strcspn(buffer, "\r\n")] = '\0'; + *size = strlen(buffer); + return 0; +} + +int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { + *count = 0; + return 0; +} + + +uint64_t uv_get_free_memory(void) { + return 0; +} + + +uint64_t uv_get_total_memory(void) { + return 0; +} + + +uint64_t uv_get_constrained_memory(void) { + return 0; +} + + +uint64_t uv_get_available_memory(void) { + return uv_get_free_memory(); +} + + +int uv_resident_set_memory(size_t* rss) { + return 0; +} + + +int uv_uptime(double* uptime) { + return 0; +} + + +int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { + *count = 0; + return 0; +} + +void uv_free_interface_addresses(uv_interface_address_t* addresses, + int count) { +} diff -ruwN source/src/unix/stream.c source-new/src/unix/stream.c --- source/src/unix/stream.c 2025-04-25 16:50:27.000000000 +0700 +++ source-new/src/unix/stream.c 2025-10-10 11:18:29.028522718 +0700 @@ -29,7 +29,14 @@ #include #include +#if defined(__redox__) +#define _GNU_SOURCE +#include #include +#include +#else +#include +#endif #include #include #include @@ -39,6 +46,7 @@ # include # include # include +#endif /* Forward declaration */ typedef struct uv__stream_select_s uv__stream_select_t; @@ -58,7 +66,6 @@ fd_set* swrite; size_t swrite_sz; }; -#endif /* defined(__APPLE__) */ union uv__cmsg { struct cmsghdr hdr; diff -ruwN source/src/unix/tcp.c source-new/src/unix/tcp.c --- source/src/unix/tcp.c 2025-04-25 16:50:27.000000000 +0700 +++ source-new/src/unix/tcp.c 2025-10-10 11:26:03.504101758 +0700 @@ -31,7 +31,7 @@ #include /* ifaddrs is not implemented on AIX and IBM i PASE */ -#if !defined(_AIX) +#if !defined(_AIX) && !defined(__redox__) #include #endif @@ -228,7 +228,7 @@ static int uv__ipv6_link_local_scope_id(void) { struct sockaddr_in6* a6; int rv; -#if defined(_AIX) +#if defined(_AIX) || defined(__redox__) /* AIX & IBM i do not have ifaddrs * so fallback to use uv_interface_addresses */ uv_interface_address_t* interfaces; @@ -268,7 +268,7 @@ } freeifaddrs(ifa); -#endif /* defined(_AIX) */ +#endif /* defined(_AIX) || defined(__redox__) */ return rv; } diff -ruwN source/src/unix/thread.c source-new/src/unix/thread.c --- source/src/unix/thread.c 2025-04-25 16:50:27.000000000 +0700 +++ source-new/src/unix/thread.c 2025-10-10 11:25:10.712328011 +0700 @@ -897,7 +897,7 @@ abort(); } -#if defined(_AIX) || defined(__MVS__) || defined(__PASE__) +#if defined(_AIX) || defined(__redox__) || defined(__MVS__) || defined(__PASE__) int uv__thread_setname(const char* name) { return UV_ENOSYS; } @@ -937,6 +937,7 @@ #if (defined(__ANDROID_API__) && __ANDROID_API__ < 26) || \ defined(_AIX) || \ + defined(__redox__) || \ defined(__MVS__) || \ defined(__PASE__) int uv__thread_getname(uv_thread_t* tid, char* name, size_t size) { diff -ruwN source/src/unix/udp.c source-new/src/unix/udp.c --- source/src/unix/udp.c 2025-04-25 16:50:27.000000000 +0700 +++ source-new/src/unix/udp.c 2025-10-10 11:18:29.028778883 +0700 @@ -31,6 +31,12 @@ #include #endif #include +#if defined(__redox__) +#include +#include +#include +#include +#endif #if defined(IPV6_JOIN_GROUP) && !defined(IPV6_ADD_MEMBERSHIP) # define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP