aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPePerRoNii <wachiraphol.yin@gmail.com>2025-06-15 11:17:49 +0700
committerPePerRoNii <wachiraphol.yin@gmail.com>2025-06-15 11:17:49 +0700
commit42aa8ac383e5b5020ba12fab44193eca8a244ad8 (patch)
tree4e36a515124441ce0c1fa1e95c6dac785cd03c11
parentf49bf1abd262a708886d7babf13100e7f1152de0 (diff)
Implemented _socket_info_error on peer_endpoint and bound_endpoint
-rw-r--r--core/net/errors_darwin.odin17
-rw-r--r--core/net/errors_freebsd.odin18
-rw-r--r--core/net/errors_linux.odin16
-rw-r--r--core/net/errors_windows.odin11
-rw-r--r--core/net/socket.odin2
-rw-r--r--core/net/socket_darwin.odin8
-rw-r--r--core/net/socket_freebsd.odin8
-rw-r--r--core/net/socket_linux.odin8
-rw-r--r--core/net/socket_windows.odin8
9 files changed, 79 insertions, 17 deletions
diff --git a/core/net/errors_darwin.odin b/core/net/errors_darwin.odin
index 7aaa220e9..255bd351f 100644
--- a/core/net/errors_darwin.odin
+++ b/core/net/errors_darwin.odin
@@ -226,6 +226,23 @@ _shutdown_error :: proc() -> Shutdown_Error {
}
}
+_socket_info_error :: proc() -> Socket_Info_Error {
+ #partial switch posix.errno() {
+ case .EBADF, .ENOTSOCK:
+ return .Invalid_Argument
+ case .ENOTCONN:
+ return .Network_Unreachable
+ case .EOPNOTSUPP:
+ return .Unsupported_Socket
+ case .EINVAL:
+ return .Connection_Closed
+ case .ENOBUFS:
+ return .Insufficient_Resources
+ case:
+ return .Unknown
+ }
+}
+
_socket_option_error :: proc() -> Socket_Option_Error {
#partial switch posix.errno() {
case .ENOBUFS:
diff --git a/core/net/errors_freebsd.odin b/core/net/errors_freebsd.odin
index 707ffd0dd..05de41746 100644
--- a/core/net/errors_freebsd.odin
+++ b/core/net/errors_freebsd.odin
@@ -255,6 +255,24 @@ _shutdown_error :: proc(errno: freebsd.Errno) -> Shutdown_Error {
}
}
+_socket_info_error :: proc(errno: freebsd.Errno) -> Socket_Info_Error {
+ assert(errno != nil)
+ _last_error = errno
+
+ #partial switch errno {
+ case .EBADF, .ENOTSOCK, .EINVAL, .EFAULT:
+ return .Invalid_Argument
+ case .ENOTCONN:
+ return .Network_Unreachable
+ case .ECONNRESET:
+ return .Connection_Closed
+ case .ENOBUFS:
+ return .Insufficient_Resources
+ case:
+ return .Unknown
+ }
+}
+
_socket_option_error :: proc(errno: freebsd.Errno) -> Socket_Option_Error {
assert(errno != nil)
_last_error = errno
diff --git a/core/net/errors_linux.odin b/core/net/errors_linux.odin
index 237579f28..258560595 100644
--- a/core/net/errors_linux.odin
+++ b/core/net/errors_linux.odin
@@ -258,6 +258,22 @@ _shutdown_error :: proc(errno: linux.Errno) -> Shutdown_Error {
}
}
+_socket_info_error :: proc(errno: linux.Errno) -> Socket_Info_Error {
+ assert(errno != nil)
+ _last_error = errno
+
+ #partial switch errno {
+ case .EBADF, .ENOTSOCK, .EFAULT, .EINVAL:
+ return .Invalid_Argument
+ case .ENOTCONN:
+ return .Network_Unreachable
+ case .ENOBUFS:
+ return .Insufficient_Resources
+ case:
+ return .Unknown
+ }
+}
+
_socket_option_error :: proc(errno: linux.Errno) -> Socket_Option_Error {
assert(errno != nil)
_last_error = errno
diff --git a/core/net/errors_windows.odin b/core/net/errors_windows.odin
index b30046a17..8e0e4cda3 100644
--- a/core/net/errors_windows.odin
+++ b/core/net/errors_windows.odin
@@ -234,6 +234,17 @@ _shutdown_error :: proc() -> Shutdown_Error {
}
}
+_socket_info_error :: proc() -> Socket_Info_Error {
+ #partial switch win.System_Error(win.WSAGetLastError()) {
+ case .WSAEFAULT, .WSAEINPROGRESS, .WSAENOTSOCK, .WSAEINVAL:
+ return .Invalid_Argument
+ case .WSANOTINITIALISED, .WSAENETDOWN, .WSAENOTCONN:
+ return .Network_Unreachable
+ case:
+ return .Unknown
+ }
+}
+
_socket_option_error :: proc() -> Socket_Option_Error {
#partial switch win.System_Error(win.WSAGetLastError()) {
case .WSAENETDOWN, .WSANOTINITIALISED:
diff --git a/core/net/socket.odin b/core/net/socket.odin
index ada7247e3..988d47c86 100644
--- a/core/net/socket.odin
+++ b/core/net/socket.odin
@@ -174,7 +174,7 @@ listen_tcp :: proc(interface_endpoint: Endpoint, backlog := 1000) -> (socket: TC
/*
Returns the endpoint that the given socket is listening / bound on.
*/
-bound_endpoint :: proc(socket: Any_Socket) -> (endpoint: Endpoint, err: Listen_Error) {
+bound_endpoint :: proc(socket: Any_Socket) -> (endpoint: Endpoint, err: Socket_Info_Error) {
return _bound_endpoint(socket)
}
diff --git a/core/net/socket_darwin.odin b/core/net/socket_darwin.odin
index bb6480f76..fe4b4c3b5 100644
--- a/core/net/socket_darwin.odin
+++ b/core/net/socket_darwin.odin
@@ -137,11 +137,11 @@ _listen_tcp :: proc(interface_endpoint: Endpoint, backlog := 1000) -> (skt: TCP_
}
@(private)
-_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Listen_Error) {
+_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Socket_Info_Error) {
addr: posix.sockaddr_storage
addr_len := posix.socklen_t(size_of(addr))
if posix.getsockname(posix.FD(any_socket_to_socket(sock)), (^posix.sockaddr)(&addr), &addr_len) != .OK {
- err = _listen_error()
+ err = _socket_info_error()
return
}
@@ -150,11 +150,11 @@ _bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Listen_Error) {
}
@(private)
-_peer_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: TCP_Recv_Error) {
+_peer_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Socket_Info_Error) {
addr: posix.sockaddr_storage
addr_len := posix.socklen_t(size_of(addr))
if posix.getpeername(posix.FD(any_socket_to_socket(sock)), (^posix.sockaddr)(&addr), &addr_len) != .OK {
- err = _tcp_recv_error()
+ err = _socket_info_error()
return
}
diff --git a/core/net/socket_freebsd.odin b/core/net/socket_freebsd.odin
index 681d0e038..78bd1cdae 100644
--- a/core/net/socket_freebsd.odin
+++ b/core/net/socket_freebsd.odin
@@ -140,12 +140,12 @@ _listen_tcp :: proc(interface_endpoint: Endpoint, backlog := 1000) -> (socket: T
}
@(private)
-_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Listen_Error) {
+_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Socket_Info_Error) {
sockaddr: freebsd.Socket_Address_Storage
errno := freebsd.getsockname(cast(Fd)any_socket_to_socket(sock), &sockaddr)
if errno != nil {
- err = _listen_error(errno)
+ err = _socket_info_error(errno)
return
}
@@ -154,12 +154,12 @@ _bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Listen_Error) {
}
@(private)
-_peer_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: TCP_Recv_Error) {
+_peer_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Socket_Info_Error) {
sockaddr: freebsd.Socket_Address_Storage
errno := freebsd.getpeername(cast(Fd)any_socket_to_socket(sock), &sockaddr)
if errno != nil {
- err = _tcp_recv_error(errno)
+ err = _socket_info_error(errno)
return
}
diff --git a/core/net/socket_linux.odin b/core/net/socket_linux.odin
index b176fb848..bdb48fce8 100644
--- a/core/net/socket_linux.odin
+++ b/core/net/socket_linux.odin
@@ -218,11 +218,11 @@ _listen_tcp :: proc(endpoint: Endpoint, backlog := 1000) -> (socket: TCP_Socket,
}
@(private)
-_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Listen_Error) {
+_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Socket_Info_Error) {
addr: linux.Sock_Addr_Any
errno := linux.getsockname(_unwrap_os_socket(sock), &addr)
if errno != .NONE {
- err = _listen_error(errno)
+ err = _socket_info_error(errno)
return
}
@@ -231,11 +231,11 @@ _bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Listen_Error) {
}
@(private)
-_peer_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: TCP_Recv_Error) {
+_peer_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Socket_Info_Error) {
addr: linux.Sock_Addr_Any
errno := linux.getpeername(_unwrap_os_socket(sock), &addr)
if errno != .NONE {
- err = _tcp_recv_error(errno)
+ err = _socket_info_error(errno)
return
}
diff --git a/core/net/socket_windows.odin b/core/net/socket_windows.odin
index 948ccfc5f..cab820ed5 100644
--- a/core/net/socket_windows.odin
+++ b/core/net/socket_windows.odin
@@ -177,11 +177,11 @@ _listen_tcp :: proc(interface_endpoint: Endpoint, backlog := 1000) -> (socket: T
}
@(private)
-_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Listen_Error) {
+_bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Socket_Info_Error) {
sockaddr: win.SOCKADDR_STORAGE_LH
sockaddrlen := c.int(size_of(sockaddr))
if win.getsockname(win.SOCKET(any_socket_to_socket(sock)), &sockaddr, &sockaddrlen) == win.SOCKET_ERROR {
- err = _listen_error()
+ err = _socket_info_error()
return
}
@@ -190,12 +190,12 @@ _bound_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Listen_Error) {
}
@(private)
-_peer_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: TCP_Recv_Error) {
+_peer_endpoint :: proc(sock: Any_Socket) -> (ep: Endpoint, err: Socket_Info_Error) {
sockaddr: win.SOCKADDR_STORAGE_LH
sockaddrlen := c.int(size_of(sockaddr))
res := win.getpeername(win.SOCKET(any_socket_to_socket(sock)), &sockaddr, &sockaddrlen)
if res < 0 {
- err = _tcp_recv_error()
+ err = _socket_info_error()
return
}