From f7b761e88343400853a04ef8cfc7f79353b6f3c2 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 10 Jun 2024 17:32:41 -0300 Subject: [PATCH] net: SOCKET_SEND_FLAGS_NOSIGNAL --- kernel-src/include/kernel/abi.h | 1 + kernel-src/include/kernel/sock.h | 1 + kernel-src/io/net/localsocket.c | 2 +- kernel-src/io/net/tcp.c | 2 +- kernel-src/sys/syscalls/sendmsg.c | 5 ++--- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/kernel-src/include/kernel/abi.h b/kernel-src/include/kernel/abi.h index 494d0e5b..364fe7f5 100644 --- a/kernel-src/include/kernel/abi.h +++ b/kernel-src/include/kernel/abi.h @@ -89,6 +89,7 @@ typedef struct { #define SOCK_RAW 3 #define MSG_PEEK 2 +#define MSG_NOSIGNAL 0x4000 #define SO_BROADCAST 6 #define SO_BINDTODEVICE 25 diff --git a/kernel-src/include/kernel/sock.h b/kernel-src/include/kernel/sock.h index 72689300..5c248c72 100644 --- a/kernel-src/include/kernel/sock.h +++ b/kernel-src/include/kernel/sock.h @@ -30,6 +30,7 @@ typedef struct { } sockaddr_t; #define SOCKET_RECV_FLAGS_PEEK 0x8000000000000000l +#define SOCKET_SEND_FLAGS_NOSIGNAL 0x8000000000000000l typedef struct socketops_t { int (*bind)(socket_t *socket, sockaddr_t *addr); int (*send)(socket_t *socket, sockaddr_t *addr, void *buffer, size_t count, uintmax_t flags, size_t *sendcount); diff --git a/kernel-src/io/net/localsocket.c b/kernel-src/io/net/localsocket.c index 0eeb04be..3e4563ff 100644 --- a/kernel-src/io/net/localsocket.c +++ b/kernel-src/io/net/localsocket.c @@ -211,7 +211,7 @@ static int localsock_send(socket_t *socket, sockaddr_t *addr, void *buffer, size localsocket_t *peer = pair->client == localsocket ? pair->server : pair->client; if (peer == NULL) { - if (_cpu()->thread->proc) + if (_cpu()->thread->proc && (flags & SOCKET_SEND_FLAGS_NOSIGNAL) == 0) signal_signalproc(_cpu()->thread->proc, SIGPIPE); error = EPIPE; diff --git a/kernel-src/io/net/tcp.c b/kernel-src/io/net/tcp.c index 0cd841ba..223bf454 100644 --- a/kernel-src/io/net/tcp.c +++ b/kernel-src/io/net/tcp.c @@ -1273,7 +1273,7 @@ static int tcp_send(socket_t *socket, sockaddr_t *addr, void *buffer, size_t cou poll_leave(&polldesc); poll_destroydesc(&polldesc); - if (_cpu()->thread->proc) + if (_cpu()->thread->proc && (flags & SOCKET_SEND_FLAGS_NOSIGNAL) == 0) signal_signalproc(_cpu()->thread->proc, SIGPIPE); error = EPIPE; diff --git a/kernel-src/sys/syscalls/sendmsg.c b/kernel-src/sys/syscalls/sendmsg.c index d9a79069..122ee3dc 100644 --- a/kernel-src/sys/syscalls/sendmsg.c +++ b/kernel-src/sys/syscalls/sendmsg.c @@ -5,9 +5,8 @@ #include #include -// TODO nosignal syscallret_t syscall_sendmsg(context_t *, int fd, msghdr_t *umsghdr, int flags) { - //__assert(flags == 0); + __assert((flags & ~MSG_NOSIGNAL) == 0); syscallret_t ret; msghdr_t msghdr; @@ -53,7 +52,7 @@ syscallret_t syscall_sendmsg(context_t *, int fd, msghdr_t *umsghdr, int flags) socket_t *socket = SOCKFS_SOCKET_FROM_NODE(file->vnode); size_t sendcount; - ret.errno = socket->ops->send(socket, msghdr.addr ? &sockaddr : NULL, buffer, buffersize, fileflagstovnodeflags(file->flags), &sendcount); + ret.errno = socket->ops->send(socket, msghdr.addr ? &sockaddr : NULL, buffer, buffersize, fileflagstovnodeflags(file->flags) | ((flags & MSG_NOSIGNAL) ? SOCKET_SEND_FLAGS_NOSIGNAL : 0), &sendcount); ret.ret = ret.errno ? -1 : sendcount; cleanup: