From e69e0b937e5765e7c12e836344778c6aaf6d848b Mon Sep 17 00:00:00 2001 From: Wildan M Date: Fri, 16 Jan 2026 07:09:57 +0700 Subject: [PATCH 1/3] Fix linux aarch64 compilation --- src/platform/linux/mod.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index b42bb4dfc4..712addf2e3 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -1,8 +1,6 @@ use core::{arch::asm, num::NonZeroU64, ptr}; use super::{ERRNO, Pal, types::*}; -#[cfg(target_arch = "x86_64")] -use crate::ld_so::tcb::OsSpecific; use crate::{ c_str::CStr, header::{ @@ -18,6 +16,7 @@ use crate::{ unistd::{SEEK_CUR, SEEK_SET}, }, io::Write, + ld_so::tcb::OsSpecific, out::Out, }; // use header::sys_times::tms; From fe6ad62ed846cf1d074a5e1fd8b4a9567258ab18 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Fri, 16 Jan 2026 07:10:28 +0700 Subject: [PATCH 2/3] Allow missing stderr file in expected tests --- tests/src/main.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/tests/src/main.rs b/tests/src/main.rs index d6b6f8edef..41c97db275 100644 --- a/tests/src/main.rs +++ b/tests/src/main.rs @@ -23,12 +23,17 @@ fn expected(bin: &str, kind: &str, generated: &[u8], status: ExitStatus) -> Resu let expected = match fs::read(&expected_file) { Ok(ok) => ok, Err(err) => { - return Err(format!( - "{} failed to read {}: {}", - bin, - expected_file.display(), - err - )); + if kind == "stderr" { + // missing stderr file, assume test expect none emitted + vec![] + } else { + return Err(format!( + "{} failed to read {}: {}", + bin, + expected_file.display(), + err + )); + } } }; From 3bf35abeaecfccbfa2e401e07e4792e05fd4ab37 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Fri, 16 Jan 2026 07:18:13 +0700 Subject: [PATCH 3/3] Add more sys_socket tests --- tests/Makefile | 10 +-- .../bins_dynamic/sys_socket/recv.stdout | 2 + .../bins_dynamic/sys_socket/recvfrom.stdout | 2 + .../sys_socket/unixpeername.stdout | 3 + .../bins_dynamic/sys_socket/unixrecv.stdout | 2 + .../sys_socket/unixrecvfrom.stdout | 2 + .../sys_socket/unixsocketpair.stdout | 2 + .../bins_static/sys_socket/recv.stdout | 2 + .../bins_static/sys_socket/recvfrom.stdout | 2 + .../sys_socket/unixpeername.stdout | 3 + .../bins_static/sys_socket/unixrecv.stdout | 2 + .../sys_socket/unixrecvfrom.stdout | 2 + .../sys_socket/unixsocketpair.stdout | 2 + tests/sys_socket/unixrecv.c | 65 +++++++++++++++++++ tests/sys_socket/unixsocketpair.c | 59 +++++++++++++++++ 15 files changed, 156 insertions(+), 4 deletions(-) create mode 100644 tests/expected/bins_dynamic/sys_socket/recv.stdout create mode 100644 tests/expected/bins_dynamic/sys_socket/recvfrom.stdout create mode 100644 tests/expected/bins_dynamic/sys_socket/unixpeername.stdout create mode 100644 tests/expected/bins_dynamic/sys_socket/unixrecv.stdout create mode 100644 tests/expected/bins_dynamic/sys_socket/unixrecvfrom.stdout create mode 100644 tests/expected/bins_dynamic/sys_socket/unixsocketpair.stdout create mode 100644 tests/expected/bins_static/sys_socket/recv.stdout create mode 100644 tests/expected/bins_static/sys_socket/recvfrom.stdout create mode 100644 tests/expected/bins_static/sys_socket/unixpeername.stdout create mode 100644 tests/expected/bins_static/sys_socket/unixrecv.stdout create mode 100644 tests/expected/bins_static/sys_socket/unixrecvfrom.stdout create mode 100644 tests/expected/bins_static/sys_socket/unixsocketpair.stdout create mode 100644 tests/sys_socket/unixrecv.c create mode 100644 tests/sys_socket/unixsocketpair.c diff --git a/tests/Makefile b/tests/Makefile index 91069af4fd..03f45a822f 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -124,6 +124,12 @@ EXPECT_NAMES=\ string/stpcpy \ string/stpncpy \ strings \ + sys_socket/recv \ + sys_socket/recvfrom \ + sys_socket/unixpeername \ + sys_socket/unixrecv \ + sys_socket/unixrecvfrom \ + sys_socket/unixsocketpair \ sys_stat/chmod \ sys_stat/lstat \ sys_stat/fstatat \ @@ -269,10 +275,6 @@ VARIED_NAMES=\ sys_epoll/epoll \ sys_resource/constants \ sys_socket/getpeername \ - sys_socket/recv \ - sys_socket/recvfrom \ - sys_socket/unixpeername \ - sys_socket/unixrecvfrom \ sys_stat/stat \ sys_statvfs/statvfs \ sys_utsname/uname \ diff --git a/tests/expected/bins_dynamic/sys_socket/recv.stdout b/tests/expected/bins_dynamic/sys_socket/recv.stdout new file mode 100644 index 0000000000..cb2239126a --- /dev/null +++ b/tests/expected/bins_dynamic/sys_socket/recv.stdout @@ -0,0 +1,2 @@ +send foo +recv foo diff --git a/tests/expected/bins_dynamic/sys_socket/recvfrom.stdout b/tests/expected/bins_dynamic/sys_socket/recvfrom.stdout new file mode 100644 index 0000000000..e9f413f935 --- /dev/null +++ b/tests/expected/bins_dynamic/sys_socket/recvfrom.stdout @@ -0,0 +1,2 @@ +sendto bar +recvfrom bar diff --git a/tests/expected/bins_dynamic/sys_socket/unixpeername.stdout b/tests/expected/bins_dynamic/sys_socket/unixpeername.stdout new file mode 100644 index 0000000000..9ff9562b85 --- /dev/null +++ b/tests/expected/bins_dynamic/sys_socket/unixpeername.stdout @@ -0,0 +1,3 @@ +listen sockname [AF_UNIX]: root/unixpeername.sock +client peername [AF_UNIX]: root/unixpeername.sock +client sockname [AF_UNIX]: (unnamed) diff --git a/tests/expected/bins_dynamic/sys_socket/unixrecv.stdout b/tests/expected/bins_dynamic/sys_socket/unixrecv.stdout new file mode 100644 index 0000000000..e9636a2916 --- /dev/null +++ b/tests/expected/bins_dynamic/sys_socket/unixrecv.stdout @@ -0,0 +1,2 @@ +send ipsum +recv ipsum diff --git a/tests/expected/bins_dynamic/sys_socket/unixrecvfrom.stdout b/tests/expected/bins_dynamic/sys_socket/unixrecvfrom.stdout new file mode 100644 index 0000000000..ad8e531910 --- /dev/null +++ b/tests/expected/bins_dynamic/sys_socket/unixrecvfrom.stdout @@ -0,0 +1,2 @@ +send lorem +recvfrom lorem diff --git a/tests/expected/bins_dynamic/sys_socket/unixsocketpair.stdout b/tests/expected/bins_dynamic/sys_socket/unixsocketpair.stdout new file mode 100644 index 0000000000..d25823c516 --- /dev/null +++ b/tests/expected/bins_dynamic/sys_socket/unixsocketpair.stdout @@ -0,0 +1,2 @@ +child: ping +parent: pong diff --git a/tests/expected/bins_static/sys_socket/recv.stdout b/tests/expected/bins_static/sys_socket/recv.stdout new file mode 100644 index 0000000000..cb2239126a --- /dev/null +++ b/tests/expected/bins_static/sys_socket/recv.stdout @@ -0,0 +1,2 @@ +send foo +recv foo diff --git a/tests/expected/bins_static/sys_socket/recvfrom.stdout b/tests/expected/bins_static/sys_socket/recvfrom.stdout new file mode 100644 index 0000000000..e9f413f935 --- /dev/null +++ b/tests/expected/bins_static/sys_socket/recvfrom.stdout @@ -0,0 +1,2 @@ +sendto bar +recvfrom bar diff --git a/tests/expected/bins_static/sys_socket/unixpeername.stdout b/tests/expected/bins_static/sys_socket/unixpeername.stdout new file mode 100644 index 0000000000..9ff9562b85 --- /dev/null +++ b/tests/expected/bins_static/sys_socket/unixpeername.stdout @@ -0,0 +1,3 @@ +listen sockname [AF_UNIX]: root/unixpeername.sock +client peername [AF_UNIX]: root/unixpeername.sock +client sockname [AF_UNIX]: (unnamed) diff --git a/tests/expected/bins_static/sys_socket/unixrecv.stdout b/tests/expected/bins_static/sys_socket/unixrecv.stdout new file mode 100644 index 0000000000..e9636a2916 --- /dev/null +++ b/tests/expected/bins_static/sys_socket/unixrecv.stdout @@ -0,0 +1,2 @@ +send ipsum +recv ipsum diff --git a/tests/expected/bins_static/sys_socket/unixrecvfrom.stdout b/tests/expected/bins_static/sys_socket/unixrecvfrom.stdout new file mode 100644 index 0000000000..ad8e531910 --- /dev/null +++ b/tests/expected/bins_static/sys_socket/unixrecvfrom.stdout @@ -0,0 +1,2 @@ +send lorem +recvfrom lorem diff --git a/tests/expected/bins_static/sys_socket/unixsocketpair.stdout b/tests/expected/bins_static/sys_socket/unixsocketpair.stdout new file mode 100644 index 0000000000..d25823c516 --- /dev/null +++ b/tests/expected/bins_static/sys_socket/unixsocketpair.stdout @@ -0,0 +1,2 @@ +child: ping +parent: pong diff --git a/tests/sys_socket/unixrecv.c b/tests/sys_socket/unixrecv.c new file mode 100644 index 0000000000..5d02f896f4 --- /dev/null +++ b/tests/sys_socket/unixrecv.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include +#include +#include + +#include "test_helpers.h" + +int main(void) +{ + int status; + const char* socket_path = "unix_stream.sock"; + unlink(socket_path); + + int server_fd = socket(AF_UNIX, SOCK_STREAM, 0); + ERROR_IF(socket, server_fd, == -1); + + struct sockaddr_un addr = { .sun_family = AF_UNIX }; + strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1); + + status = bind(server_fd, (struct sockaddr*)&addr, sizeof(struct sockaddr_un)); + ERROR_IF(bind, status, == -1); + + status = listen(server_fd, 5); + ERROR_IF(listen, status, == -1); + + pid_t pid = fork(); + ERROR_IF(fork, pid, == -1); + + if (pid == 0) { + // to test that blocking in accept() works + usleep(500000); + + int client_fd = socket(AF_UNIX, SOCK_STREAM, 0); + ERROR_IF(socket, client_fd, == -1); + + status = connect(client_fd, (struct sockaddr*)&addr, sizeof(struct sockaddr_un)); + ERROR_IF(connect, status, == -1); + + char *msg = "ipsum"; + printf("send %s\n", msg); + status = send(client_fd, msg, 6, 0); + ERROR_IF(send, status, == -1); + + close(client_fd); + return 0; + } else { + int accepted_fd = accept(server_fd, NULL, NULL); + ERROR_IF(accept, accepted_fd, == -1); + + char x[6]; + ssize_t amount = recv(accepted_fd, x, 6, 0); + ERROR_IF(recv, amount, == -1); + + printf("recv %s\n", x); + close(accepted_fd); + close(server_fd); + + wait(NULL); + unlink(socket_path); + } + + return 0; +} \ No newline at end of file diff --git a/tests/sys_socket/unixsocketpair.c b/tests/sys_socket/unixsocketpair.c new file mode 100644 index 0000000000..bc3b798858 --- /dev/null +++ b/tests/sys_socket/unixsocketpair.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "test_helpers.h" + +volatile sig_atomic_t signal_received = 0; + +void handle_sigusr1(int sig) { + (void)sig; + signal_received = 1; +} + +int main(void) { + int sv[2]; + pid_t pid; + char buf[64]; + const char *parent_msg = "ping"; + const char *child_msg = "pong"; + + int status = socketpair(AF_UNIX, SOCK_STREAM, 0, sv); + ERROR_IF(socketpair, status, == -1); + + pid = fork(); + ERROR_IF(fork, pid, == -1); + + if (pid == 0) { + close(sv[0]); + + ssize_t n = recv(sv[1], buf, sizeof(buf), 0); + ERROR_IF(recv, n, == -1); + printf("child: %s\n", buf); + + status = send(sv[1], child_msg, 5, 0); + ERROR_IF(send, status, == -1); + + close(sv[1]); + } else { + close(sv[1]); + + status = send(sv[0], parent_msg, 5, 0); + ERROR_IF(send, status, == -1); + + ssize_t n = recv(sv[0], buf, sizeof(buf), 0); + ERROR_IF(recv, n, == -1); + printf("parent: %s\n", buf); + + close(sv[0]); + wait(NULL); + } + + return 0; +} \ No newline at end of file