net: SOCKET_SEND_FLAGS_NOSIGNAL

This commit is contained in:
Matheus
2024-06-10 17:32:41 -03:00
parent f2eecc580b
commit f7b761e883
5 changed files with 6 additions and 5 deletions
+1
View File
@@ -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
+1
View File
@@ -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);
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
+2 -3
View File
@@ -5,9 +5,8 @@
#include <kernel/net.h>
#include <kernel/alloc.h>
// 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: