aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRickard Andersson <gonz@severnatazvezda.com>2024-04-19 15:17:21 +0300
committerRickard Andersson <gonz@severnatazvezda.com>2024-04-19 15:17:21 +0300
commitc44f618b7dec82cf80609fd613c93ef91cf6a7ae (patch)
tree37c76ba4e1411dcf3bbde9626cf13c4aa36252ba
parent1b143b9fa3d0302cda639abf72c7b5db1b7c1c41 (diff)
fix(net): add `NOSIGNAL` to `send` options
This is a better default than not having it, since it turns errors that would be signals into error values instead. We could take these as options but given that we currently don't I think this at the very least improves on the status quo.
-rw-r--r--core/net/errors_linux.odin1
-rw-r--r--core/net/socket_linux.odin2
2 files changed, 2 insertions, 1 deletions
diff --git a/core/net/errors_linux.odin b/core/net/errors_linux.odin
index 2370dd0d8..5e2c52aea 100644
--- a/core/net/errors_linux.odin
+++ b/core/net/errors_linux.odin
@@ -136,6 +136,7 @@ TCP_Send_Error :: enum c.int {
Interrupted = c.int(linux.Errno.EINTR), // A signal occurred before any data was transmitted. See signal(7).
Timeout = c.int(linux.Errno.EWOULDBLOCK), // The send timeout duration passed before all data was sent. See Socket_Option.Send_Timeout.
Not_Socket = c.int(linux.Errno.ENOTSOCK), // The so-called socket is not an open socket.
+ Broken_Pipe = c.int(linux.Errno.EPIPE), // The peer has disconnected when we are trying to send to it
}
// TODO
diff --git a/core/net/socket_linux.odin b/core/net/socket_linux.odin
index ba48959fb..9c4342592 100644
--- a/core/net/socket_linux.odin
+++ b/core/net/socket_linux.odin
@@ -258,7 +258,7 @@ _send_tcp :: proc(tcp_sock: TCP_Socket, buf: []byte) -> (int, Network_Error) {
for total_written < len(buf) {
limit := min(int(max(i32)), len(buf) - total_written)
remaining := buf[total_written:][:limit]
- res, errno := linux.send(linux.Fd(tcp_sock), remaining, {})
+ res, errno := linux.send(linux.Fd(tcp_sock), remaining, {.NOSIGNAL})
if errno != .NONE {
return total_written, TCP_Send_Error(errno)
}