From 2af691f58741eae8fa4ada329bdf65729f9a50fe Mon Sep 17 00:00:00 2001 From: Wison Ye Date: Sun, 23 Mar 2025 13:22:19 +1300 Subject: [PATCH 1/2] Fixed: Freebsd syscall 'getpeername' is missing. --- core/sys/freebsd/syscalls.odin | 42 ++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/core/sys/freebsd/syscalls.odin b/core/sys/freebsd/syscalls.odin index 83b51138a..3c96e0b52 100644 --- a/core/sys/freebsd/syscalls.odin +++ b/core/sys/freebsd/syscalls.odin @@ -21,6 +21,7 @@ SYS_close : uintptr : 6 SYS_getpid : uintptr : 20 SYS_recvfrom : uintptr : 29 SYS_accept : uintptr : 30 +SYS_getpeername: uintptr : 31 SYS_getsockname: uintptr : 32 SYS_fcntl : uintptr : 92 SYS_fsync : uintptr : 95 @@ -202,24 +203,37 @@ accept_nil :: proc "contextless" (s: Fd) -> (Fd, Errno) { accept :: proc { accept_T, accept_nil } +getsockname_or_peername :: proc "contextless" (s: Fd, sockaddr: ^$T, is_peer: bool) -> Errno { + // sockaddr must contain a valid pointer, or this will segfault because + // we're telling the syscall that there's memory available to write to. + addrlen: socklen_t = size_of(T) + + result, ok := intrinsics.syscall_bsd( + is_peer ? SYS_getpeername : SYS_getsockname, + cast(uintptr)s, + cast(uintptr)sockaddr, + cast(uintptr)&addrlen + ) + + if !ok { + return cast(Errno)result + } + + return nil +} + +// Get name of connected peer +// +// The getpeername() system call appeared in 4.2BSD. +getpeername :: proc "contextless" (s: Fd, sockaddr: ^$T) -> Errno { + return getsockname_or_peername(s, sockaddr, true) +} + // Get socket name. // // The getsockname() system call appeared in 4.2BSD. getsockname :: proc "contextless" (s: Fd, sockaddr: ^$T) -> Errno { - // sockaddr must contain a valid pointer, or this will segfault because - // we're telling the syscall that there's memory available to write to. - addrlen: socklen_t = size_of(T) - - result, ok := intrinsics.syscall_bsd(SYS_getsockname, - cast(uintptr)s, - cast(uintptr)sockaddr, - cast(uintptr)&addrlen) - - if !ok { - return cast(Errno)result - } - - return nil + return getsockname_or_peername(s, sockaddr, false) } // Synchronize changes to a file. From 61acb1552918c773d771725a8a7179a41d6c4924 Mon Sep 17 00:00:00 2001 From: Wison Ye Date: Sun, 23 Mar 2025 13:32:11 +1300 Subject: [PATCH 2/2] #4959, fixed the broken CI build. --- core/sys/freebsd/syscalls.odin | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/sys/freebsd/syscalls.odin b/core/sys/freebsd/syscalls.odin index 3c96e0b52..405d1e47c 100644 --- a/core/sys/freebsd/syscalls.odin +++ b/core/sys/freebsd/syscalls.odin @@ -212,8 +212,7 @@ getsockname_or_peername :: proc "contextless" (s: Fd, sockaddr: ^$T, is_peer: bo is_peer ? SYS_getpeername : SYS_getsockname, cast(uintptr)s, cast(uintptr)sockaddr, - cast(uintptr)&addrlen - ) + cast(uintptr)&addrlen) if !ok { return cast(Errno)result