From 9c67018022f1f6defc936d9352a0fe80976418fd Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 7 Jan 2026 04:48:31 +0700 Subject: [PATCH 1/2] Add sys_socket tests --- tests/Makefile | 5 +++ tests/sys_socket/getpeername.c | 77 +++++++++++++++++++++++++++++++++ tests/sys_socket/recv.c | 50 +++++++++++++++++++++ tests/sys_socket/recvfrom.c | 56 ++++++++++++++++++++++++ tests/sys_socket/unixpeername.c | 75 ++++++++++++++++++++++++++++++++ tests/sys_socket/unixrecvfrom.c | 50 +++++++++++++++++++++ 6 files changed, 313 insertions(+) create mode 100644 tests/sys_socket/getpeername.c create mode 100644 tests/sys_socket/recv.c create mode 100644 tests/sys_socket/recvfrom.c create mode 100644 tests/sys_socket/unixpeername.c create mode 100644 tests/sys_socket/unixrecvfrom.c diff --git a/tests/Makefile b/tests/Makefile index 80e277c0fc..ece0cd8c48 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -11,6 +11,11 @@ FAILING_TESTS=tls \ mkfifo \ stdlib/ptsname \ sys_mman \ + sys_socket/getpeername \ + sys_socket/recv \ + sys_socket/recvfrom \ + sys_socket/unixpeername \ + sys_socket/unixrecvfrom \ # resource/getrusage # time/times # netdb/netdb diff --git a/tests/sys_socket/getpeername.c b/tests/sys_socket/getpeername.c new file mode 100644 index 0000000000..98eb2fa28a --- /dev/null +++ b/tests/sys_socket/getpeername.c @@ -0,0 +1,77 @@ +#include + +#include "test_helpers.h" + +void print_sockaddr(char *ctx, struct sockaddr *addr) { + char ip_string[INET6_ADDRSTRLEN]; + void *raw_ip_addr; + char *fam; + in_port_t port; + + if (addr->sa_family == AF_INET) { + struct sockaddr_in *ipv4 = (struct sockaddr_in *)addr; + raw_ip_addr = &(ipv4->sin_addr); + port = ntohs(ipv4->sin_port); + fam = "AF_INET"; + } else if (addr->sa_family == AF_INET6) { + struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)addr; + raw_ip_addr = &(ipv6->sin6_addr); + port = ntohs(ipv6->sin6_port); + fam = "AF_INET6"; + } else { + printf("Unknown address family: %d\n", addr->sa_family); + exit(1); + } + + if (inet_ntop(addr->sa_family, raw_ip_addr, ip_string, sizeof(ip_string)) == NULL) { + perror("inet_ntop failed"); + exit(1); + } + + printf("%s [%s]: %s:%u\n", ctx, fam, ip_string, port); +} + +int main(void) +{ + int status; + int listen_fd = socket(AF_INET, SOCK_STREAM, 0); + ERROR_IF(socket, listen_fd, == -1); + + struct sockaddr_in addr = + { + .sin_family = AF_INET, + .sin_addr = { .s_addr = htonl(0x7F000001 /* 127.0.0.1 */) }, + .sin_port = htons(0), + }; + struct sockaddr* saddr = (struct sockaddr*)&addr; + socklen_t addr_len = sizeof(struct sockaddr_in); + status = bind(listen_fd, saddr, addr_len); + ERROR_IF(bind, status, == -1); + + status = listen(listen_fd, 1); + ERROR_IF(bind, status, == -1); + + status = getsockname(listen_fd, saddr, &addr_len); + ERROR_IF(getsockname, status, == -1); + print_sockaddr("listen sockname", saddr); + + int client_fd = socket(AF_INET, SOCK_STREAM, 0); + ERROR_IF(socket, client_fd, == -1); + + status = connect(client_fd, saddr, addr_len); + ERROR_IF(connect, status, == -1); + + struct sockaddr_in peer; + struct sockaddr* speer = (struct sockaddr*)&peer; + socklen_t peer_len = sizeof(struct sockaddr_in); + status = getpeername(client_fd, speer, &peer_len); + ERROR_IF(getpeername, status, == -1); + print_sockaddr("client peername", speer); + + status = memcmp(saddr, speer, sizeof(struct sockaddr_in)); + UNEXP_IF(memcmp, status, != 0); + + status = getsockname(client_fd, saddr, &addr_len); + ERROR_IF(getsockname, status, == -1); + print_sockaddr("client sockname", saddr); +} diff --git a/tests/sys_socket/recv.c b/tests/sys_socket/recv.c new file mode 100644 index 0000000000..f6a0f5457e --- /dev/null +++ b/tests/sys_socket/recv.c @@ -0,0 +1,50 @@ +#include + +#include "test_helpers.h" + +int main(void) +{ + int status; + int listen_fd = socket(AF_INET, SOCK_STREAM, 0); + ERROR_IF(socket, listen_fd, == -1); + + struct sockaddr_in addr = + { + .sin_family = AF_INET, + .sin_addr = { .s_addr = htonl(0x7F000001 /* 127.0.0.1 */) }, + .sin_port = htons(0), + }; + struct sockaddr* saddr = (struct sockaddr*)&addr; + socklen_t addr_len = sizeof(struct sockaddr_in); + status = bind(listen_fd, saddr, addr_len); + ERROR_IF(bind, status, == -1); + + status = listen(listen_fd, 1); + ERROR_IF(bind, status, == -1); + + status = getsockname(listen_fd, saddr, &addr_len); + ERROR_IF(getsockname, status, == -1); + + int client_fd = socket(AF_INET, SOCK_STREAM, 0); + ERROR_IF(socket, client_fd, == -1); + + status = connect(client_fd, saddr, addr_len); + ERROR_IF(connect, status, == -1); + + int server_fd = accept(listen_fd, NULL, NULL); + ERROR_IF(connect, status, == -1); + + char *c = "foo"; + status = send(server_fd, c, 4, 0); + ERROR_IF(sendto, status, == -1); + + char x[4]; + ssize_t amount = recv(client_fd, x, 4, 0); + ERROR_IF(recv, amount, == -1); + UNEXP_IF(recv, amount, != 4); + + status = strcmp(c, x); + printf("send %s\n", c); + printf("recv %s\n", x); + UNEXP_IF(strcmp, status, != 0); +} diff --git a/tests/sys_socket/recvfrom.c b/tests/sys_socket/recvfrom.c new file mode 100644 index 0000000000..2b57597280 --- /dev/null +++ b/tests/sys_socket/recvfrom.c @@ -0,0 +1,56 @@ +#include + +#include +#include + +#include "test_helpers.h" + +int main(void) +{ + int status; + int server_fd = socket(AF_INET, SOCK_DGRAM, 0); + ERROR_IF(socket, server_fd, == -1); + + struct sockaddr_in addr = + { + .sin_family = AF_INET, + .sin_addr = { .s_addr = htonl(0x7F000001 /* 127.0.0.1 */) }, + .sin_port = htons(0), + }; + struct sockaddr* saddr = (struct sockaddr*)&addr; + socklen_t addr_len = sizeof(struct sockaddr_in); + status = bind(server_fd, saddr, addr_len); + ERROR_IF(bind, status, == -1); + + status = getsockname(server_fd, saddr, &addr_len); + ERROR_IF(getsockname, status, == -1); + + int client_fd = socket(AF_INET, SOCK_DGRAM, 0); + ERROR_IF(socket, client_fd, == -1); + + status = connect(client_fd, saddr, addr_len); + ERROR_IF(connect, status, == -1); + + struct sockaddr_in name; + struct sockaddr* sname = (struct sockaddr*)&name; + socklen_t name_len = sizeof(struct sockaddr_in); + status = getsockname(client_fd, sname, &name_len); + ERROR_IF(getsockname, status, == -1); + + char *c = "bar"; + status = sendto(server_fd, c, 4, 0, sname, name_len); + ERROR_IF(sendto, status, == -1); + + struct sockaddr_in from; + struct sockaddr* sfrom = (struct sockaddr*)&from; + socklen_t from_len = sizeof(struct sockaddr_in); + char x[4]; + ssize_t amount = recvfrom(client_fd, x, 4, 0, sfrom, &from_len); + ERROR_IF(recvfrom, amount, == -1); + UNEXP_IF(recvfrom, amount, != 4); + + status = strcmp(c, x); + printf("sendto %s\n", c); + printf("recvfrom %s\n", x); + UNEXP_IF(strcmp, status, != 0); +} diff --git a/tests/sys_socket/unixpeername.c b/tests/sys_socket/unixpeername.c new file mode 100644 index 0000000000..aba4810930 --- /dev/null +++ b/tests/sys_socket/unixpeername.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include +#include + +#include "test_helpers.h" + +void print_sockaddr(char *ctx, struct sockaddr *addr, socklen_t len) { + if (addr->sa_family == AF_UNIX) { + struct sockaddr_un *un = (struct sockaddr_un *)addr; + if (len <= sizeof(sa_family_t)) { + printf("%s [AF_UNIX]: (unnamed)\n", ctx); + } else { + printf("%s [AF_UNIX]: %s\n", ctx, un->sun_path); + } + } else { + printf("%s: Unknown address family %d\n", ctx, addr->sa_family); + exit(1); + } +} + +int main(void) +{ + int status; + const char* socket_path = "unixpeername.sock"; + unlink(socket_path); + + int listen_fd = socket(AF_UNIX, SOCK_STREAM, 0); + ERROR_IF(socket, listen_fd, == -1); + + struct sockaddr_un addr = { .sun_family = AF_UNIX }; + struct sockaddr* saddr = (struct sockaddr*)&addr; + socklen_t addr_len = sizeof(struct sockaddr_un); + strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1); + + status = bind(listen_fd, saddr, addr_len); + ERROR_IF(bind, status, == -1); + + status = listen(listen_fd, 1); + ERROR_IF(listen, status, == -1); + + struct sockaddr_un check; + struct sockaddr* scheck = (struct sockaddr*)✓ + status = getsockname(listen_fd, scheck, &addr_len); + ERROR_IF(getsockname, status, == -1); + print_sockaddr("listen sockname", scheck, addr_len); + + int client_fd = socket(AF_UNIX, SOCK_STREAM, 0); + ERROR_IF(socket, client_fd, == -1); + + status = connect(client_fd, saddr, addr_len); + ERROR_IF(connect, status, == -1); + + struct sockaddr_un peer; + struct sockaddr* speer = (struct sockaddr*)&peer; + socklen_t peer_len = sizeof(struct sockaddr_un); + status = getpeername(client_fd, speer, &peer_len); + ERROR_IF(getpeername, status, == -1); + print_sockaddr("client peername", speer, peer_len); + + status = strcmp(check.sun_path, peer.sun_path); + UNEXP_IF(strcmp, status, != 0); + + status = getsockname(client_fd, scheck, &addr_len); + ERROR_IF(getsockname, status, == -1); + print_sockaddr("client sockname", scheck, addr_len); + + close(client_fd); + close(listen_fd); + unlink(socket_path); + + return 0; +} diff --git a/tests/sys_socket/unixrecvfrom.c b/tests/sys_socket/unixrecvfrom.c new file mode 100644 index 0000000000..8d11bd32b7 --- /dev/null +++ b/tests/sys_socket/unixrecvfrom.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include + +#include "test_helpers.h" + +int main(void) +{ + int status; + const char* socket_path = "unixrecvfrom.sock"; + + unlink(socket_path); + + int server_fd = socket(AF_UNIX, SOCK_DGRAM, 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); + + int client_fd = socket(AF_UNIX, SOCK_DGRAM, 0); + ERROR_IF(socket, client_fd, == -1); + + status = connect(client_fd, (struct sockaddr*)&addr, sizeof(struct sockaddr_un)); + ERROR_IF(connect, status, == -1); + + char *c = "lorem"; + status = send(client_fd, c, 6, 0); + ERROR_IF(send, status, == -1); + + char x[6]; + struct sockaddr_un from; + socklen_t from_len = sizeof(struct sockaddr_un); + + ssize_t amount = recvfrom(server_fd, x, 6, 0, (struct sockaddr*)&from, &from_len); + ERROR_IF(recvfrom, amount, == -1); + UNEXP_IF(recvfrom, amount, != 6); + + status = strcmp(c, x); + printf("send %s\n", c); + printf("recvfrom %s\n", x); + UNEXP_IF(strcmp, status, != 0); + + close(server_fd); + close(client_fd); + unlink(socket_path); +} \ No newline at end of file From 053525fba1f48171c0090b1b354ee9634104db16 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Wed, 7 Jan 2026 04:52:35 +0700 Subject: [PATCH 2/2] Update failing tests --- tests/Makefile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/Makefile b/tests/Makefile index ece0cd8c48..25933e09b4 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -4,18 +4,22 @@ IS_REDOX?=0 # If compiling for Redox, IS_REDOX must be 1 ifeq ($(IS_REDOX),1) -FAILING_TESTS=signals/killpg-child +FAILING_TESTS= else FAILING_TESTS=tls \ futimens \ mkfifo \ + sigchld \ stdlib/ptsname \ sys_mman \ + signals/pthread_kill-child \ sys_socket/getpeername \ sys_socket/recv \ sys_socket/recvfrom \ sys_socket/unixpeername \ sys_socket/unixrecvfrom \ + unistd/isatty \ + unistd/link \ # resource/getrusage # time/times # netdb/netdb @@ -211,7 +215,6 @@ VARIED_NAMES=\ psignal \ pwd \ sa_restart \ - sigchld \ signals/kill-self \ signals/kill0-self \ signals/kill-invalid \ @@ -221,9 +224,9 @@ VARIED_NAMES=\ signals/killpg0-self \ signals/kill-group \ signals/kill-child \ + signals/killpg-child \ signals/killpg-self \ signals/pthread_kill-invalid \ - signals/pthread_kill-child \ signals/pthread_kill-self \ signals/pthread_kill0-self \ signals/raise-compliance \ @@ -279,8 +282,6 @@ VARIED_NAMES=\ unistd/gethostname \ unistd/getid \ unistd/getpagesize \ - unistd/isatty \ - unistd/link \ unistd/pathconf \ unistd/setid \ unistd/sysconf \