|
@@ -21,6 +21,7 @@ SYS_close : uintptr : 6
|
|
SYS_getpid : uintptr : 20
|
|
SYS_getpid : uintptr : 20
|
|
SYS_recvfrom : uintptr : 29
|
|
SYS_recvfrom : uintptr : 29
|
|
SYS_accept : uintptr : 30
|
|
SYS_accept : uintptr : 30
|
|
|
|
+SYS_getpeername: uintptr : 31
|
|
SYS_getsockname: uintptr : 32
|
|
SYS_getsockname: uintptr : 32
|
|
SYS_fcntl : uintptr : 92
|
|
SYS_fcntl : uintptr : 92
|
|
SYS_fsync : uintptr : 95
|
|
SYS_fsync : uintptr : 95
|
|
@@ -202,24 +203,37 @@ accept_nil :: proc "contextless" (s: Fd) -> (Fd, Errno) {
|
|
|
|
|
|
accept :: proc { accept_T, accept_nil }
|
|
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.
|
|
// Get socket name.
|
|
//
|
|
//
|
|
// The getsockname() system call appeared in 4.2BSD.
|
|
// The getsockname() system call appeared in 4.2BSD.
|
|
getsockname :: proc "contextless" (s: Fd, sockaddr: ^$T) -> Errno {
|
|
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.
|
|
// Synchronize changes to a file.
|